Το προφίλ μας στο Google Plus
0

Τα machine images του Packer και το qboxes

Στο εκτενές μας HOWTO περί του Packer παρουσιάσαμε, μεταξύ άλλων, μία αυτοματοποιημένη μέθοδο δημιουργίας machine images για VirtualBox, VMware και QEMU. Σε αντίθεση με τους builders για τους δύο πρώτους hypervizors, εκείνος για το QEMU δεν δίνει μια πλήρη μηχανή αλλά μόνο ένα QCOW2 image. Πώς ορίζουμε ένα ολοκληρωμένο VM όταν ξεκινάμε από ένα τέτοιο αρχείο;

Οι προσεκτικοί αναγνώστες θα θυμόσατε ότι μία μας επιλογή είναι ο Virtual Machine Manager. Κάλλιστα μπορούμε να καταφύγουμε σ’ αυτόν και με μερικά μόνο κλικ να φτιάξουμε ένα ωραιότατο VM, γύρω από το QCOW2 που πολύ πρόθυμα μας έδωσε ο Packer. Όμως ο Virtual Machine Manager είναι μια εφαρμογή που λειτουργεί σε περιβάλλον γραφικών. Δεν έχουμε κάτι με τις εφαρμογές του είδους, αλλά από τη στιγμή που κάποιος ασχολείται με το Packer τότε κατά πάσα πιθανότητα ενδιαφέρεται για την αυτοματοποίηση. Όλες οι εργασίες του σχετικού pipeline, λοιπόν, πρέπει να είναι scriptable, οπότε ο Virtual Machine Manager χαλάει τη συνταγή.

Εναλλακτική πρόταση αποτελεί το Vagrant της Hashicorp, της ίδιας της κατασκευάστριας του Packer δηλαδή. Το ικανότατο αυτό εργαλείο για τη γραμμή εντολών διευκολύνει σημαντικά τη δημιουργία και τη διαχείριση virtual environments. Στην 100% δωρεάν του εκδοχή συνεργάζεται αρμονικά με το πανταχού παρόν VirtualBox. Υπάρχει επίσης επί πληρωμή provider για συνεργασία με το VMware, καθώς και δωρεάν provider για συνεργασία με το libvirt. Αυτό ακριβώς είναι το περιβάλλον που μας ενδιαφέρει — εννοείται στο πλαίσιο του παρόντος άρθρου. Αναλυτικότερα, δουλεύουμε σε υπολογιστή με Linux, η υποδομή για το libvirt είναι έτοιμη, το QEMU χρησιμοποιεί το KVM ώστε τα αντίστοιχα VMs να λειτουργούν αποδοτικά, ενώ χάρη στο Packer διαθέτουμε κι ένα QCOW2 με μια λιτή, server-oriented εκδοχή του openSUSE Leap 42.3. (Πλέον έχει γίνει προφανές, δεν βλάπτει όμως να το τονίσουμε: Προκειμένου να βγάζει νόημα το άρθρο που τώρα διαβάζετε, πρέπει ήδη να έχετε διαβάσει το άρθρο μας περί Packer. Διαφορετικά πηγαίνετε και διαβάστε το τώρα, ενώ μη βαρεθείτε να πειραματιστείτε κιόλας. Δεν θα το μετανιώσετε και θα το διασκεδάσετε.) Το θέμα με το Vagrant και τη συνεργασία με το libvirt, είναι ότι η εγκατάσταση του αντίστοιχου provider χρειάζεται λίγη δουλειά. Επίσης, έχει ακόμα αρκετά ανοικτά θέματα. Το Vagrant, μολαταύτα, είναι ένα εξαιρετικό εργαλείο για developers, QA engineers, DevOps engineers — και γενικά για όποιον παίζει ή πειραματίζεται με εικονικές μηχανές. Προκειμένου να το γνωρίσουμε και πραγματικά να εκτιμήσουμε τις δυνατότητές του, αξίζει να του αφιερώσουμε τουλάχιστον ένα εκτενές άρθρο.

Προς το παρόν, όμως, και για το ζήτημα που αντιμετωπίζουμε, θα θέλαμε μια απλούστερη προσέγγιση. Με δεδομένο ότι προτιμάμε μία λύση που θα ταίριαζε σε ένα automated pipeline, θα μπορούσε κάποιος να προτείνει εργαλεία για το command line όπως τα virsh, virt-install, virt-customize κ.ά. Σίγουρα όλα αυτά εξυπηρετούν το σκοπό μας. Η σύνταξή τους όμως συχνά αποδεικνύεται κάπως περίπλοκη, ειδικά για συγκεκριμένες εργασίες όπως, π.χ., ο ορισμός ενός νέου VM, ο ορισμός ενός νέου τοπικού δικτύου ή η κλωνοποίηση ενός υπάρχοντος VM. Αυτοί είναι μερικοί από τους λόγους που, εδώ και λίγο καιρό, αναπτύσσουμε το qboxes, ένα απλό BASH script για τη διαχείριση μηχανών QEMU/KVM μέσω του libvirt. Το εργαλείο είναι ακόμη υπό ανάπτυξη, αφού διαρκώς βελτιώνουμε τους τρόπους εκτέλεσης συγκεκριμένων εργασιών, αλλάζουμε το συντακτικό των εντολών που δέχεται, ενώ του προσθέτουμε και νέες δυνατότητες. Παρ’ όλα αυτά, είμαστε σε θέση να διαβεβαιώσουμε πως είναι ήδη ικανοποιητικά ώριμο. Σε πολύ λίγο, λοιπόν, θα δούμε πώς το qboxes παίρνει το artifact του QEMU builder και πολύ φυσιολογικά και γρήγορα μάς δίνει ένα πληρέστατο QEMU/KVM VM.

Εγκατάσταση του qboxes
Αρκεί να κλωνοποιήσουμε το αντίστοιχο repository από το GitHub. Από το αγαπημένο μας τερματικό, πηγαίνουμε σ’ έναν κατάλογο στον οποίο μας βολεύει να έχουμε το qboxes κι απλά πληκτρολογούμε git clone https://github.com/colder-is-better/qboxes.git. Δημιουργείται έτσι ο κατάλογος qboxes κι αν ρίξουμε μια ματιά μέσα του θα δούμε ότι περιλαμβάνει το ομώνυμο εκτελέσιμο. Καλό είναι να δημιουργήσουμε κι ένα symbolic προς το qboxes, από έναν κατάλογο που βρίσκεται στην $PATH (π.χ., από τον κατάλογο ~/bin). Δείτε το ακόλουθο screenshot, διαβάστε και τη συνοδευτική περιγραφή.

Κλωνοποίηση του repository του qboxes, εντός του καταλόγου ~/github (1). Χρειαζόμαστε κι ένα βολικό symbolic link προς το script ονόματι qboxes, ώστε να το καλούμε χωρίς να μεταβαίνουμε στον κατάλογο ~/github/qboxes (2).

Κλωνοποίηση του repository του qboxes, εντός του καταλόγου ~/github (1). Χρειαζόμαστε κι ένα βολικό symbolic link προς το script ονόματι qboxes, ώστε να το καλούμε χωρίς να μεταβαίνουμε στον κατάλογο ~/github/qboxes (2).

Για να δείτε τις λειτουργίες που προς το παρόν υποστηρίζει το qboxes, πληκτρολογήστε qboxes help. Δεν έχει σημασία να θυμόσαστε τις λειτουργίες –ή καλύτερα τις (υπο)εντολές– του qboxes, αφού ανά πάσα στιγμή μπορείτε ρίχνετε μια ματιά είτε στις γενικές οδηγίες είτε σε αναλυτικότερες, οι οποίες αφορούν σε καθεμία από τις εντολές. Ας δούμε ένα παράδειγμα. Δίνοντας qboxes help βλέπουμε αυτή την εντολή define, η οποία αφορά στον ορισμό νέων εικονικών μηχανών. Μάλιστα. Πώς όμως συντάσσεται η define; Δεν χρειάζεται ν’ αναρωτιόμαστε. Απλά πληκτρολογούμε qboxes define help και μαθαίνουμε αμέσως.

Πριν περάσουμε στο κτίσιμο QEMU KVM/VMs γύρω από τα QCOW2 image files του Packer, να τονίσουμε ότι το qboxes χρησιμοποιεί ένα πλήθος άλλων εργαλείων. Αναφερόμαστε σε προγράμματα από τον κόσμο του libvirt (π.χ., virsh, virt-install, virt-customize, virt-clone κ.ά.), καθώς και σε άλλα που διατίθενται σχεδόν για κάθε διανομή Linux (π.χ., netcat, strings, ping, route, brctl κ.ά.). Ο δε χρήστης του qboxes δεν χρειάζεται να έχει δικαιώματα διαχειριστή, πρέπει όμως να ανήκει στο group libvirt. Τέλος, το εργαλείο sudo πρέπει να είναι εγκατεστημένο στο σύστημα κι ο χρήστης του qboxes να δίνει εντολές διαχειριστή μέσω sudo χωρίς να πληκτρολογεί συνθηματικό.

Για όλα τα απαραίτητα εργαλεία θα μπορούσε να ελέγχει το ίδιο το qboxes, βεβαίως και να προειδοποιεί τον χρήστη για ό,τι λείπει ή δεν είναι όπως πρέπει. Πρόκειται για λειτουργία που σχεδιάζουμε να προσθέσουμε στο qboxes.

Έχετε QEMU machine image από το Packer;
Αν δεν έχετε (λέμε τώρα), κλωνοποιήστε πρώτα το σχετικό repository που ετοιμάσαμε για το αναλυτικό άρθρο περί Packer. Μετά πηγαίνετε στον κατάλογο packer-templates/templates και τρέξτε τον QEMU builder για ένα machine image με το openSUSE Leap 42.3.

Αυτοματοποιημένη δημιουργία QEMU machine image με το openSUSE Leap 42.3, από το Packer. Προσέξτε τον κατάλογο με το ένα και μοναδικό artifact του builder, ένα QCOW2 file που θα αποτελέσει τον δίσκο εκκίνησης της εικονικής μας μηχανής.

Αυτοματοποιημένη δημιουργία QEMU machine image με το openSUSE Leap 42.3, από το Packer. Προσέξτε τον κατάλογο με το ένα και μοναδικό artifact του builder, ένα QCOw2 file που θα αποτελέσει τον δίσκο εκκίνησης της εικονικής μας μηχανής.

Μετά την ολοκλήρωση του build, το Packer θα έχει αφήσει ένα artifact –συγκεκριμένα το αρχείο osuse-leap-42.3.qcow2— στον κατάλογο /tmp/packer_out/oSUSE-Leap-42.3-libvirt.

Οικειοποίηση storage volume
Τι μπορεί να εννοούμε μ’ αυτόν τον μεσότιτλο; Πολύ απλά, ότι παίρνουμε ένα αρχείο QCOW2 και το εντάσσουμε σε ένα storage pool. Πιο συγκεκριμένα, θα πάρουμε το artifact του builder που μόλις καλέσαμε και θα το βάλουμε μέσα σε κάποιο υπάρχον ή νέο storage pool. Στη συνέχεια, θα συνδέσουμε το QCOW2 στο νέο VM που θα ορίσουμε — κι έτσι θα γίνει ο δίσκος εκκίνησής του.

Πού είναι το artifact που θέλουμε; Η θέση του ορίζεται στο JSON file που δώσαμε στο Packer, ενώ εμφανίζεται και στα μηνύματα που παίρνουμε κοντά στην ολοκλήρωση του build. Όπως αναφέραμε λίγο νωρίτερα, το ζητούμενο αρχείο για το παράδειγμά μας είναι το osuse-leap-42.3.qcow2 και βρίσκεται κάτω από τον κατάλογο /tmp/packer_out/oSUSE-Leap-42.3-libvirt. Σε ποιο storage volume να το εντάξουμε; Αλήθεια, υπάρχουν storage volumes στον υπολογιστή μας; Αν υπάρχουν, ποια είναι; Δεν χρειάζεται ν’ αναρωτιόμαστε. Αρκεί να ζητήσουμε από το qboxes να μας παραθέσει όλα τα storage pools του συστήματος: qboxes list pools.

Πόσο πιο φυσικά θα μπορούσαμε να ζητήσουμε τη λίστα με όλα τα storage pools στο σύστημά μας; (Γράψτε qboxes list help προκειμένου να δείτε τι άλλες οντότητες μπορεί να μας επιστρέψει το qboxes.)

Πόσο πιο φυσικά θα μπορούσαμε να ζητήσουμε τη λίστα με όλα τα storage pools στο σύστημά μας; (Γράψτε qboxes list help προκειμένου να δείτε τι άλλες οντότητες μπορεί να μας επιστρέψει το qboxes.)

Πολύ ωραία, έχουμε τρία storage pools και μάλιστα όλα τους είναι άδεια (βλέπε στήλη Volumes). Μεταξύ αυτών, εκείνο με όνομα qcow2s φαίνεται μια χαρά για να φιλοξενήσει το QCOW2 file του Packer. Αλλά ξέρετε κάτι; Γιατί να μη φτιάξουμε ένα νέο storage pool, ειδικά για να οργανώνουμε εκεί τα artifacts από τα διάφορα Packer builds; Σκεφτόμαστε μάλιστα ότι το νέο pool καλό θα ήταν να έχει το όνομα packer_mi (Packer machine images) και να είναι συνδεδεμένο στον κατάλογο /usr/local/share/packer_mi. Ο συγκεκριμένος κατάλογος δεν υπάρχει, οπότε πρώτα τον δημιουργούμε (sudo mkdir /usr/local/share/packer_mi) κι αμέσως μετά ορίζουμε το νέο μας storage pool με τη βοήθεια του qboxes: qboxes create pool --name=packer_mi --path=/usr/local/share/packer_mi.

Φτιάχνουμε έναν καινούργιο κατάλογο για τη σύνδεση του νέου storage pool (1). Αμέσως μετά, με τη βοήθεια του qboxes ορίζουμε (και βαφτίζουμε) το νέο storage pool (2). Η όλη διαδικασία είναι εξαιρετικά απλή, όμως ποτέ δεν βλάπτει να βεβαιωνόμαστε ότι όλα πήγαν καλά (3).

Φτιάχνουμε έναν καινούργιο κατάλογο για τη σύνδεση του νέου storage pool (1). Αμέσως μετά, με τη βοήθεια του qboxes ορίζουμε (και βαφτίζουμε) το νέο storage pool (2). Η όλη διαδικασία είναι εξαιρετικά απλή, όμως ποτέ δεν βλέπει να βεβαιωνόμαστε ότι όλα πήγαν καλά (3).

Η εντολή qboxes create pool ... δεν δημιουργεί μόνο ένα νέο pool. Επιπρόσθετα το ενεργοποιεί και το μαρκάρει ως autostart, ώστε να ενεργοποιείται αυτόματα κάθε φορά που το σύστημα ξεκινά. Αν καταφεύγαμε απευθείας στο virsh κι όχι στο qboxes, τότε αντί για μία θα δίναμε τρεις εντολές. Τώρα, για την ένταξη του osuse-leap-42.3.qcow2 στο storage pool ονόματι packer_mi, απλά γράφουμε qboxes assimilate --pool=packer_mi /tmp/packer_out/oSUSE-Leap-42.3-libvirt/osuse-leap-42.3.qcow2. Επαληθεύουμε την ένταξη πληκτρολογώντας qboxes list pools (παρατηρήστε τη γραμμή packer_mi και τη στήλη Volumes) ή και qboxes list volumes, ώστε να πάρουμε τη λίστα με τα storage volumes που γνωρίζει το libvirt.

Ένταξη του artifact που παρήγαγε ο Packer builder για QEMU, στο storage pool με όνομα packer_mi (1). Επαληθεύουμε κοιτάζοντας το πλήθος των volumes σε κάθε pool (2), καθώς και τη λίστα με τα volumes ανεξαρτήτως pool (3).

Ένταξη του artifact που παρήγαγε ο Packer builder για QEMU, στο storage pool με όνομα packer_mi (1). Επαληθεύουμε κοιτάζοντας το πλήθος των volumes σε κάθε pool (2), καθώς και τη λίστα με τα volumes ανεξαρτήτως pool (3).

Νέο libvirt network για τα VMs
Είμαστε πανέτοιμοι να ορίσουμε ένα νέο VM, με δίσκο εκκίνησης το QCOW2 του packer. Πριν το κάνουμε, ίσως χρειαστεί ν’ αποφασίσουμε για το δίκτυο στο οποίο θα ανήκει. Μία μας επιλογή είναι να δώσουμε στο VM bridged networking, ώστε να βρίσκεται στο ίδιο δίκτυο μέσα στο οποίο βρίσκεται κι ο φυσικός υπολογιστής που το φιλοξενεί. Για λόγους φορητότητας, ωστόσο, επιλέγουμε NATed networking για το VM. Πληκτρολογώντας qboxes list networksnets) βλέπουμε ότι, προς το παρόν τουλάχιστον, στον υπολογιστή μας υφίσταται μόνο το προκαθορισμένο libvirt NAT network, με όνομα default.

Ιδού το προκαθορισμένο libvirt network, τύπου NAT, με όνομα default. Ειδικά αν δουλεύουμε σε laptop, αξίζει να βάζουμε τα VM μας εντός του συγκεκριμένου δικτύου -- ή σε κάποιο άλλο δίκτυο του ιδίου τύπου, τέλος πάντων.

Ιδού το προκαθορισμένο libvirt network, τύπου NAT, με όνομα default. Ειδικά αν δουλεύουμε σε laptop, αξίζει να βάζουμε τα VM μας εντός του συγκεκριμένου δικτύου — ή σε κάποιο άλλο δίκτυο του ιδίου τύπου, τέλος πάντων.

Το δίκτυο default είναι μια χαρά. Από την άλλη, θα συμφωνήσετε φανταζόμαστε ότι το “μια χαρά” ποτέ δεν είναι “αρκετά καλό”. Ας δημιουργήσουμε λοιπόν ένα νέο libvirt NAT network, περισσότερο χαρακτηριστικό για τις μηχανές που ορίζουμε με το qboxes. Προκειμένου να δούμε πώς ακριβώς φτιάχνουμε δίκτυα με το qboxes, πληκτρολογούμε qboxes create network help.

Λήψη βοηθείας για συγκεκριμένη εντολή του qboxes, μαζί με παράδειγμα χρήσης. Εδώ βλέπουμε την εντολή create, ειδικά όσον αφορά στα libvirt networks.

Λήψη βοηθείας για συγκεκριμένη εντολή του qboxes, μαζί με παράδειγμα χρήσης. Εδώ βλέπουμε την εντολή create, ειδικά όσον αφορά στα libvirt networks.

Πολύ ωραία. Μπορούμε τώρα να φτιάξουμε ένα δίκτυο τύπου NAT με όνομα qbxnet, domain name το qboxes.here, διεύθυνση router και DNS την 10.10.10.254, μάσκα δικτύου την 255.255.255.0, καθώς και DHCP server (επίσης στο 10.10.10.254) που μοιράζει IP στους πελάτες μεταξύ των διευθύνσεων 10.10.10.200 και 10.10.10.253 συμπεριλαμβανομένων. Το νέο μας δίκτυο θα τα έχει όλα, λοιπόν. Γρήγορα-γρήγορα το υλοποιούμε, πληκτρολογώντας: qboxes create network --type=nated --name=qbxnet --domain=qboxes.here --router=10.10.10.254 --netmask=255.255.255.0 --dhcp=on --from=10.10.10.200 --to=10.10.10.253. Αν και το μήνυμα του qboxes είναι άκρως εφησυχαστικό, επαληθεύουμε ότι όλα πήγαν κατ’ ευχήν δίνοντας κι ένα qboxes list networks.

Δημιουργία νέου libvirt network με όνομα qbxnet, με τον DNS και τον DHCP server του για την εξυπηρέτηση των clients (1). Αν και το μήνυμα του qboxes φανερώνει πως όλα πήγαν καλά, ποτέ δεν βλάπτει να επαληθεύουμε οι ίδιοι (2).

Δημιουργία νέου libvirt network με όνομα qbxnet, με τον DNS και τον DHCP server του για την εξυπηρέτηση των clients (1). Αν και το μήνυμα του qboxes φανερώνει πως όλα πήγαν καλά, ποτέ δεν βλάπτει να επαληθεύουμε οι ίδιοι (2).

Για τα VMs ενός τοπικού δικτύου σαν το qbxnet μπορείτε να έχετε τοπικό resolving, για τον φυσικό host. Έτσι, αντί για διευθύνσεις IP θα πληκτρολογείτε FQDNs ή hostnames. Αν ενδιαφέρεστε διαβάστε την παράγραφο Resolving από το host OS, στο άρθρο μας περί διαχείρισης εικονικών τοπικών δικτύων στον κόσμο του libvirt.

Ορισμός VM με το qboxes
Επιτέλους, καιρός ήταν! Υπενθυμίζουμε ότι όλες τις εντολές του qboxes τις βλέπουμε γράφοντας qboxes help.

Το γενικό σύστημα βοηθείας του qboxes. Παρέχεται και περισσότερο εξειδικευμένη βοήθεια, για κάθε (υπο)εντολή ξεχωριστά.

Το γενικό σύστημα βοηθείας του qboxes. Παρέχεται και περισσότερο εξειδικευμένη βοήθεια, για κάθε (υπο)εντολή ξεχωριστά.

Αυτή που τώρα θέλουμε είναι η define, οπότε τη σύνταξή της τη μαθαίνουμε δίνοντας qboxes define help.

Λήψη βοηθείας για συγκεκριμένη εντολή του qboxes (την define).

Λήψη βοηθείας για συγκεκριμένη εντολή του qboxes (την define).

Για τον ορισμό του νέου VM, πληκτρολογούμε:

qboxes define --ram=1024 --cores=2 \
  --osdisk=osuse-leap-42.3.qcow2 --pool=packer_mi \
  --network=qbxnet --mac=auto --guest-os=opensuse42.3 leap423vm

Όπως και πριν λίγο, με το νέο pool, έτσι και τώρα θέλουμε να επαληθεύσουμε ότι το νέο VM πράγματι δημιουργήθηκε. Γι’ αυτό και πληκτρολογούμε qboxes list vms.

Ορισμός νέου VM με δίσκο εκκίνησης το QCOW2 file που μας έδωσε το Packer, με τη βοήθεια του qboxes. Η διαδικασία ολοκληρώνεται πρακτικά ακαριαία κι επαληθεύουμε πως όλα πήγαν καλά πληκτρολογώντας qboxes list vms.

Ορισμός νέου VM με δίσκο εκκίνησης το QCOW2 file που μας έδωσε το Packer, με τη βοήθεια του qboxes. Η διαδικασία ολοκληρώνεται πρακτικά ακαριαία κι επαληθεύουμε πως όλα πήγαν καλά πληκτρολογώντας qboxes list vms.

Μόλις φτιάξαμε το ολοκαίνουργιο VM μας και φυσικά μπορούμε να το κάνουμε ό,τι θέλουμε, π.χ., να το ξεκινάμε (qboxes activate leap423vm), να το κλείνουμε ομαλά (qboxes deactivate leap423vm), να συνδεόμαστε σ’ αυτό μέσω OpenSSH, να αποκτάμε πρόσβαση στην κονσόλα του μέσω virt-manager ή virt-viewer κ.ο.κ. Παρεμπιπτόντως, το root password στην εγκατάσταση του Leap 42.3 που πραγματοποιεί το Packer, είναι το topsecret.

Ενεργοποίηση της νέας μηχανής (1), αποκάλυψη του IP της (2) και σύνδεση μέσω SSH (3).

Ενεργοποίηση της νέας μηχανής (1), αποκάλυψη του IP της (2) και σύνδεση μέσω SSH (3).

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων