Ansible Tutorial για Αρχάριους: Εγχειρίδιο & Εντολές
⚡ Έξυπνη Σύνοψη
Το Ansible είναι μια μηχανή αυτοματισμού ανοιχτού κώδικα, χωρίς agent, που διαμορφώνει διακομιστές μέσω SSH, εκτελεί ad-hoc εντολές και ενορχηστρώνει σύνθετες αναπτύξεις μέσω εγχειριδίων YAML, ρόλων και επαναχρησιμοποιήσιμων προτύπων σε Linux και... Windows υποδομή.

Το Ansible είναι ένα από τα πιο ευρέως χρησιμοποιούμενα εργαλεία αυτοματισμού ανοιχτού κώδικα στη σύγχρονη εποχή. DevOps, εκτιμάται για τον σχεδιασμό χωρίς agent και τα απλά, ευανάγνωστα αρχεία ρυθμίσεων. Αυτό το σεμινάριο του Ansible για αρχάριους εξηγεί τι είναι το Ansible, πώς να το εγκαταστήσετε και πώς να χρησιμοποιήσετε ad-hoc εντολές, εγχειρίδια παιχνιδιού, ρόλους και πρότυπα μέσω πρακτικών παραδειγμάτων.
Τι είναι το Ansible;
Πιθανό είναι ένα εργαλείο αυτοματοποίησης και ενορχήστρωσης ανοιχτού κώδικα για την παροχή λογισμικού, τη διαχείριση διαμόρφωσης και την ανάπτυξη λογισμικού. Διαμορφώνει συστήματα τύπου Unix και Windows συστήματα, παρέχοντας υποδομή ως κώδικα μέσω της δικής του δηλωτικής γλώσσας. Το Ansible συχνά συγκρίνεται με εργαλεία που βασίζονται σε πράκτορες, όπως το μαριονέτα.
Το Ansible είναι δημοφιλές για την απλή εγκατάστασή του, την εύκολη συνδεσιμότητα με πελάτες και τον σχεδιασμό χωρίς agent. Συνδέεται με πελάτες μέσω SSH, επομένως δεν απαιτείται ειδικός παράγοντας από την πλευρά του πελάτη. Η Ansible προωθεί ενότητες σε κάθε πελάτη, οι ενότητες εκτελούνται τοπικά και η έξοδός τους επιστρέφεται στον διακομιστή της Ansible.
Επειδή βασίζεται σε SSH, το Ansible συνδέεται εύκολα με τους πελάτες χρησιμοποιώντας κλειδιά SSH, γεγονός που απλοποιεί ολόκληρη τη διαδικασία. Τα στοιχεία των πελατών, όπως ονόματα κεντρικών υπολογιστών ή διευθύνσεις IP και θύρες SSH, αποθηκεύονται σε αρχεία που ονομάζονται αρχεία απογραφής. Μόλις δημιουργήσετε και συμπληρώσετε ένα αρχείο απογραφής, το Ansible μπορεί να το χρησιμοποιήσει.
Γιατί να χρησιμοποιήσετε το Ansible;
Ακολουθούν ορισμένα σημαντικά οφέλη από τη χρήση του Ansible:
- Ένα από τα πιο σημαντικά πλεονεκτήματα του Ansible είναι ότι είναι δωρεάν για όλους.
- Δεν απαιτεί ειδικές δεξιότητες διαχειριστή συστήματος για την εγκατάσταση και τη χρήση του και η επίσημη τεκμηρίωση είναι πολύ πλήρης.
- Η δυνατότητα αρθρωτών ρυθμίσεων σε πρόσθετα, ενότητες, αποθέματα και εγχειρίδια παιχνιδιού καθιστά το Ansible έναν εξαιρετικό σύντροφο για τη διαχείριση μεγάλων περιβαλλόντων.
- Το Ansible είναι ελαφρύ και συνεπές, χωρίς περιορισμούς στο λειτουργικό σύστημα ή στο υποκείμενο υλικό.
- Είναι πολύ ασφαλές χάρη στον σχεδιασμό χωρίς agent και στη χρήση χαρακτηριστικών ασφαλείας OpenSSH.
- Το Ansible έχει μια ομαλή καμπύλη εκμάθησης, υποστηριζόμενη από λεπτομερή τεκμηρίωση και μια εύχρηστη δομή και διαμόρφωση.
Αυτά τα δυνατά σημεία, ειδικά όταν σταθμίζονται σε σχέση με άλλα εναλλακτικές λύσεις για το Ansible, βοηθούν στην εξήγηση της ταχείας υιοθέτησής του. Πριν από την εγκατάστασή του, είναι χρήσιμο να κατανοήσουμε πώς εξελίχθηκε το έργο.
Ιστορία του Ansible
Εδώ είναι τα σημαντικά ορόσημα στην ιστορία του Ansible:
- Το έργο Ansible ξεκίνησε τον Φεβρουάριο του 2012. Αναπτύχθηκε αρχικά από τον Michael DeHaan, τον δημιουργό του Cobbler και του Func (Fedora Unified Network Controller).
- Αρχικά ονομαζόταν AnsibleWorks Inc, η εταιρεία που χρηματοδοτούσε την Ansible εξαγοράστηκε από την RedHat το 2015 και αργότερα, μαζί με την RedHat, μεταφέρθηκε υπό την IBM ομπρέλα.
- Σήμερα, το Ansible περιλαμβάνεται σε διανομές όπως το Fedora Linux, το RHEL, το CentOS και Oracle Linux.
Σημαντικοί όροι που χρησιμοποιούνται στο Ansible
Οι ακόλουθοι όροι εμφανίζονται σε όλο αυτό το σεμινάριο του Ansible και αξίζει να τους γνωρίζετε πριν ξεκινήσετε:
Ansible διακομιστής
Το μηχάνημα όπου είναι εγκατεστημένο το Ansible και από το οποίο εκτελούνται όλες οι εργασίες και τα εγχειρίδια.
Μονάδα μέτρησης
Μια ενότητα είναι μια εντολή ή ένα σύνολο παρόμοιων εντολών Ansible, που προορίζονται να εκτελεστούν στην πλευρά του πελάτη.
Έργο
Μια εργασία είναι μια ενότητα που αποτελείται από μία μόνο διαδικασία που πρέπει να ολοκληρωθεί.
Ρόλος
Ένας τρόπος οργάνωσης εργασιών και σχετικών αρχείων, ώστε να μπορούν να κληθούν αργότερα σε ένα εγχειρίδιο οδηγιών.
Γεγονός
Πληροφορίες που ανακτώνται από τις καθολικές μεταβλητές του συστήματος-πελάτη μέσω της λειτουργίας gather_facts.
Απόθεμα
Ένα αρχείο που περιέχει δεδομένα σχετικά με τους διακομιστές-πελάτες της Ansible. Ορίζεται σε μεταγενέστερα παραδείγματα ως το αρχείο hosts.
Δοκιμάστε να παίξετε
Η εκτέλεση ενός εγχειριδίου στρατηγικής.
Handler
Μια εργασία που καλείται μόνο όταν υπάρχει ένας ειδοποιητής.
Ειδοποιητής
Μια ενότητα που αποδίδεται σε μια εργασία που καλεί έναν χειριστή εάν αλλάξει η έξοδος.
ετικέτα
Ένα όνομα που έχει οριστεί σε μια εργασία και το οποίο μπορεί να χρησιμοποιηθεί αργότερα για την εκτέλεση μόνο της συγκεκριμένης εργασίας ή ομάδας εργασιών.
Εγκατάσταση Ansible σε Linux
Μόλις ζυγίσετε τις επιλογές σας και αποφασίσετε να υιοθετήσετε το Ansible, το επόμενο βήμα είναι να το εγκαταστήσετε στο σύστημά σας. Η ακόλουθη σύντομη αναλυτική παρουσίαση καλύπτει την εγκατάσταση στα πιο δημοφιλή Linux διανομές.
Εγκαταστήστε το Ansible σε συστήματα Centos/RedHat
Βήμα 1) Εγκαταστήστε το αποθετήριο EPEL.
[root@ansible-server ~]# sudo yum install epel-release
Βήμα 2) Εγκαταστήστε το πακέτο ansible.
[root@ansible-server ~]# sudo yum install -y ansible
Εγκατάσταση ansible σε Ubuntu/Συστήματα Debian
Βήμα 1) Εκτελέστε μια ενημέρωση στα πακέτα.
$ sudo apt update
Βήμα 2) Εγκαταστήστε το πακέτο software-properties-common.
$ sudo apt install software-properties-common
Βήμα 3) Εγκαταστήστε το αρχείο προσωπικών πακέτων ansible.
$ sudo apt-add-repository ppa:ansible/ansible
Βήμα 4) Εγκαταστήστε το Ansible.
$ sudo apt update $ sudo apt install ansible
Ansible ad-hoc εντολές
Ένας από τους απλούστερους τρόπους χρήσης του Ansible είναι μέσω ad-hoc εντολών. Αυτές είναι χρήσιμες όταν θέλετε να εκδώσετε μια εντολή σε έναν μόνο διακομιστή ή σε μια ομάδα διακομιστών. Οι ad-hoc εντολές δεν αποθηκεύονται για μελλοντική χρήση, αλλά αποτελούν έναν γρήγορο τρόπο αλληλεπίδρασης με τους διακομιστές που επιλέγετε.
Για αυτό το σεμινάριο του Ansible, διαμορφώνεται ένα απλό αρχείο hosts δύο διακομιστών, το οποίο περιέχει τους host1 και host2.
Μπορείτε να επιβεβαιώσετε ότι οι κεντρικοί υπολογιστές είναι προσβάσιμοι από τον διακομιστή Ansible εκδίδοντας ένα ping εντολή σε όλους τους κεντρικούς υπολογιστές.
[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Επεξήγηση:
- Κατάσταση της εντολής, σε αυτήν την περίπτωση, ΕΠΙΤΥΧΙΑ
- Κεντρικός υπολογιστής στον οποίο εκτελέστηκε η εντολή
- Η εντολή που εκδίδεται μέσω της παραμέτρου -m, σε αυτήν την περίπτωση, ping
- Με την παράμετρο -i, μπορείτε να υποδείξετε το αρχείο hosts.
Μπορείτε επίσης να εκδώσετε την ίδια εντολή σε έναν μόνο κεντρικό υπολογιστή όταν χρειάζεται.
[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Επεξήγηση:
- Η παράμετρος ορίου μπορεί να χρησιμοποιηθεί για την έκδοση εντολών μόνο σε συγκεκριμένους κεντρικούς υπολογιστές στο αρχείο του κεντρικού υπολογιστή
- Το όνομα του κεντρικού υπολογιστή όπως ορίζεται στο αρχείο αποθέματος
Αν χρειάζεται να αντιγράψετε γρήγορα ένα αρχείο σε πολλούς προορισμούς, χρησιμοποιήστε τη λειτουργική μονάδα αντιγραφής, η οποία βασίζεται στο SCP. Η εντολή και η έξοδός της μοιάζουν με τα εξής:
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/testfile",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
"state": "file",
"uid": 0
}
host2 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/testfile",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
"state": "file",
"uid": 0
}
Επεξήγηση:
- Ορίστηκε μονάδα αντιγραφής
- Τα ορίσματα της μονάδας, σε αυτήν την περίπτωση, είναι η απόλυτη διαδρομή πηγής και η απόλυτη διαδρομή προορισμού.
- Αντίστοιχη έξοδος εντολών που αντικατοπτρίζει την επιτυχία της εντολής αντιγραφής και άλλες λεπτομέρειες, όπως τα αθροίσματα ελέγχου sha1 ή md5 για έλεγχο ακεραιότητας αρχείων και μεταδεδομένα όπως κάτοχος, μέγεθος ή δικαιώματα. Είναι εύκολο να εγκαταστήσετε ένα πακέτο σε μια δέσμη διακομιστών. Το Ansible έχει πολλές ενότητες που αλληλεπιδρούν με μεταχειρισμένα προγράμματα εγκατάστασης, όπως yum, apt, dnf κ.λπ.
Στο επόμενο παράδειγμα, θα εγκαταστήσετε ένα πακέτο με την ενότητα yum σε δύο κεντρικούς υπολογιστές CentOS.
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nInstalling:\n ncdu x86_64 1.14-1.el7 epel 51 k\n\nTransaction Summary\n========================================================================\nInstall 1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nInstalled:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
host2 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nInstalling:\n ncdu x86_64 1.14-1.el7 epel 51 k\n\nTransaction Summary\n========================================================================\nInstall 1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nInstalled:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
Επεξήγηση:
- Η μονάδα Yum χρησιμοποιείται σε αυτό το παράδειγμα
- Ορίζει τα ορίσματα της ενότητας και σε αυτήν την περίπτωση, θα επιλέξετε το όνομα του πακέτου και την κατάστασή του. Εάν η κατάσταση απουσιάζει, για παράδειγμα, το πακέτο θα αναζητηθεί και εάν βρεθεί, θα αφαιρεθεί
- Όταν χρωματιστεί με κίτρινο χρώμα, θα δείτε την έξοδο της εντολής ansible με την κατάσταση αλλαγμένη, που σημαίνει σε αυτήν την περίπτωση ότι το πακέτο βρέθηκε και εγκαταστάθηκε.
- Κατάσταση της εντολής εγκατάστασης yum που εκδόθηκε μέσω του ansible. Σε αυτήν την περίπτωση εγκαταστάθηκε το πακέτο ncdu.x86_64 0:1.14-1.el7.
Φυσικά, όλες οι επιλογές εγκατάστασης του yum μπορούν να χρησιμοποιηθούν μέσω του Ansible, συμπεριλαμβανομένης της ενημέρωσης, της εγκατάστασης, της τελευταίας έκδοσης και της αφαίρεσης.
Στο παρακάτω παράδειγμα, εκδίδεται η ίδια εντολή για την κατάργηση του προηγουμένως εγκατεστημένου πακέτου ncdu.
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nRemoving:\n ncdu x86_64 1.14-1.el7 @epel 87 k\n\nTransaction Summary\n========================================================================\nRemove 1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nRemoved:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
host2 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nRemoving:\n ncdu x86_64 1.14-1.el7 @epel 87 k\n\nTransaction Summary\n========================================================================\nRemove 1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nRemoved:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
Επεξήγηση:
- Η έξοδος της εντολής yum δείχνει ότι το πακέτο καταργήθηκε.
Ένα άλλο βασικό χαρακτηριστικό του Ansible είναι η ικανότητά του να συλλέγει πληροφορίες σχετικά με ένα σύστημα. Συλλέγει πληροφορίες υλικού, λογισμικού και έκδοσης και αποθηκεύει κάθε τιμή σε μια μεταβλητή που μπορείτε να επαναχρησιμοποιήσετε αργότερα.
Όταν χρειάζεστε λεπτομερείς πληροφορίες σχετικά με τα συστήματα που θα τροποποιήσει η Ansible, η ενότητα εγκατάστασης συλλέγει αυτά τα στοιχεία από τις μεταβλητές συστήματος.
Ansible Playbooks
Ansible Playbooks είναι ο τρόπος αποστολής εντολών σε απομακρυσμένα συστήματα μέσω σεναρίων. Τα εγχειρίδια playbooks διαμορφώνουν πολύπλοκα περιβάλλοντα συστημάτων και αυξάνουν την ευελιξία εκτελώντας ένα μόνο σενάριο σε ένα ή περισσότερα συστήματα. Συμπεριφέρονται περισσότερο σαν γλώσσα διαμόρφωσης παρά σαν γλώσσα προγραμματισμού.
Οι εντολές του Playbook χρησιμοποιούν τη μορφή YAML, επομένως χρειάζεται λίγη σύνταξη, αλλά πρέπει να τηρούνται οι εσοχές. Όπως υποδηλώνει το όνομα, ένα playbook είναι μια συλλογή από plays. Μέσω ενός playbook, μπορείτε να αναθέσετε συγκεκριμένους ρόλους σε ορισμένους κεντρικούς υπολογιστές και διαφορετικούς ρόλους σε άλλους, ενορχηστρώνοντας πολλούς διακομιστές σε ένα αρχείο.
Πριν συνεχίσουμε με τα παραδείγματα του εγχειριδίου playbook, είναι χρήσιμο να ορίσουμε μια εργασία. Οι εργασίες είναι η διεπαφή για τις ενότητες του Ansible για ρόλους και εγχειρίδια playbook.
Τώρα, σκεφτείτε ένα εγχειρίδιο παιχνιδιού Ansible με ένα παιχνίδι που περιέχει πολλαπλές εργασίες, όπως φαίνεται παρακάτω:
---
- hosts: group1
tasks:
- name: Install lldpad package
yum:
name: lldpad
state: latest
- name: check lldpad service status
service:
name: lldpad
state: started
Στο παραπάνω εγχειρίδιο, οι κεντρικοί υπολογιστές group1 στο αρχείο hosts προορίζονται για εγκατάσταση του πακέτου lldpad χρησιμοποιώντας τη λειτουργική μονάδα yum. Η υπηρεσία lldpad που δημιουργείται μετά την εγκατάσταση ξεκινά στη συνέχεια χρησιμοποιώντας τη λειτουργική μονάδα service, η οποία αλληλεπιδρά κυρίως με το σύνολο systemd.
Επεξήγηση:
- Ομάδα κεντρικών υπολογιστών στους οποίους θα εκτελείται το playbook
- Η μονάδα Yum χρησιμοποιείται σε αυτήν την εργασία για εγκατάσταση lldpad
- Η μονάδα σέρβις χρησιμοποιείται για να ελέγξει εάν η υπηρεσία είναι σε λειτουργία και λειτουργεί μετά την εγκατάσταση
Κάθε εγχειρίδιο παιχνιδιού της Ansible λειτουργεί με ένα αρχείο απογραφής. Το αρχείο απογραφής περιέχει μια λίστα διακομιστών χωρισμένων σε ομάδες, παρέχοντας καλύτερο έλεγχο σε λεπτομέρειες όπως η διεύθυνση IP και η θύρα SSH για κάθε κεντρικό υπολογιστή.
Το αρχείο απογραφής για αυτό το παράδειγμα εγχειριδίου παιχνιδιού μοιάζει με το ακόλουθο. Υπάρχουν δύο ομάδες, η ομάδα1 και η ομάδα2, καθεμία από τις οποίες περιέχει τους host1 και host2 αντίστοιχα.
[group1] host1 ansible_host=192.168.100.2 ansible_ssh_port=22 [group2] host2 ansible_host=192.168.100.3 ansible_ssh_port=22
Επεξήγηση:
- Όνομα ομάδας
- Όνομα κεντρικού υπολογιστή, με διεύθυνση IP και θύρα ssh, σε αυτήν την περίπτωση, το προεπιλεγμένο, 22.
Το επόμενο παράδειγμα εγχειριδίου χειρισμού του Ansible περιέχει δύο χειρισμούς για δύο ομάδες κεντρικών υπολογιστών. Για την πρώτη ομάδα, την ομάδα 1, το SELinux είναι ενεργοποιημένο και όταν ενεργοποιηθεί, εμφανίζεται ένα μήνυμα στην οθόνη του κεντρικού υπολογιστή.
Για τη δεύτερη ομάδα, το πακέτο httpd εγκαθίσταται μόνο εάν το ansible_os_family είναι RedHat και το ansible_system_vendor είναι HP.
Οι ansible_os_family και ansible_system_vendor είναι μεταβλητές που συλλέγονται με την επιλογή gather_facts και μπορούν να χρησιμοποιηθούν όπως σε αυτό το παράδειγμα υπό όρους.
---
- hosts: group1
tasks:
- name: Enable SELinux
selinux:
state: enabled
when: ansible_os_family == 'Debian'
register: enable_selinux
- debug:
Imsg: "Selinux Enabled. Please restart the server to apply changes."
when: enable_selinux.changed == true
- hosts: group2
tasks:
- name: Install apache
yum:
name: httpd
state: present
when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'
Επεξήγηση:
- Παράδειγμα της ρήτρας when, Σε αυτήν την περίπτωση, όταν ο τύπος λειτουργικού συστήματος είναι Debian. Η μεταβλητή ansible_os_family συγκεντρώνεται μέσω της λειτουργικότητας collect_facts.
- Η έξοδος της εργασίας καταχωρείται για μελλοντική χρήση, με το όνομά της enable_selinux
- Ένα άλλο παράδειγμα της ρήτρας όταν. Σε αυτήν την περίπτωση, θα εμφανιστεί ένα μήνυμα για τον κεντρικό χρήστη εάν το SELinux ήταν όντως ενεργοποιημένο στο παρελθόν.
- Ένα άλλο παράδειγμα της ρήτρας όταν αποτελείται από δύο κανόνες
Εκτός από τις εργασίες, υπάρχουν επίσης ειδικές εργασίες που ονομάζονται χειριστές. Ένας χειριστής πρέπει να έχει ένα μοναδικό όνομα σε όλο το εγχειρίδιο. Οι χειριστές λειτουργούν όπως μια κανονική εργασία, αλλά ένας χειριστής μπορεί να ειδοποιηθεί μέσω ενός ειδοποιητή.
Εάν ένας χειριστής δεν ειδοποιηθεί κατά την εκτέλεση ενός εγχειριδίου στρατηγικής, δεν εκτελείται. Ωστόσο, εάν περισσότερες από μία εργασίες ειδοποιήσουν έναν χειριστή, εκτελείται μόνο μία φορά μετά την ολοκλήρωση όλων των εργασιών.
Στο παρακάτω παράδειγμα, μια συγκεκριμένη εργασία έχει μια ενότητα ειδοποίησης που καλεί μια άλλη εργασία. Εάν αλλάξει η έξοδος της πρώτης εργασίας, καλείται μια εργασία χειρισμού. Ένα συνηθισμένο παράδειγμα είναι η αλλαγή ενός αρχείου διαμόρφωσης και στη συνέχεια η επανεκκίνηση της επηρεαζόμενης υπηρεσίας.
---
- hosts: group2
tasks:
- name: sshd config file modify port
lineinfile:
path: /etc/ssh/sshd_config
regexp: 'Port 28675'
line: '#Port 22'
notify:
- restart sshd
handlers
- name: restart sshd
service: sshd
name: sshd
state: restarted
Σε αυτήν την περίπτωση, εάν η πρώτη εργασία, "sshd config file modify port", αλλάξει, δηλαδή η θύρα δεν είναι ήδη 28675, η θύρα τροποποιείται και η εργασία ειδοποιεί τον χειριστή με το ίδιο όνομα, ο οποίος επανεκκινεί την υπηρεσία sshd.
Επεξήγηση:
- Παράδειγμα ειδοποιητή
- Παράδειγμα χειριστή
Αναισθητικοί Ρόλοι
Όταν εργάζεστε με μεγάλα εγχειρίδια playbook, είναι ευκολότερο να χωρίσετε τις εργασίες σε ρόλους. Οι ρόλοι διευκολύνουν επίσης την επαναχρησιμοποίηση της εργασίας αργότερα. Ένας ρόλος είναι μια συλλογή εργασιών που μπορούν να μετακινηθούν από ένα εγχειρίδιο playbook σε ένα άλλο και να εκτελεστούν ανεξάρτητα, αν και μόνο μέσω ενός αρχείου εγχειριδίου playbook.
Οι ρόλοι αποθηκεύονται σε ξεχωριστούς καταλόγους και ακολουθούν μια συγκεκριμένη δομή καταλόγου.
[root@ansible-server test2]# tree
.
`-- role1
|-- defaults
| `-- main.yml
|-- handlers
| `-- main.yml
|-- meta
| `-- main.yml
|-- README.md
|-- tasks
| `-- main.yml
|-- tests
| |-- inventory
| `-- test.yml
`-- vars
`-- main.yml
7 directories, 8 files
Το αρχείο YAML στον κατάλογο προεπιλογών περιέχει τις προεπιλεγμένες μεταβλητές που χρησιμοποιούνται με το εγχειρίδιο παιχνιδιού. Ο κατάλογος χειριστών αποθηκεύει χειριστές και ο κατάλογος μετα-κατάλογος περιέχει πληροφορίες σχετικά με τον συγγραφέα και τις εξαρτήσεις ρόλων. Ο κατάλογος εργασιών περιέχει το κύριο αρχείο YAML για τον ρόλο.
Ο κατάλογος δοκιμών περιέχει ένα δείγμα εγχειριδίου YAML και ένα δείγμα αρχείου απογραφής και χρησιμοποιείται κυρίως για δοκιμές πριν από τη δημιουργία του πραγματικού ρόλου.
Ο κατάλογος vars περιέχει το αρχείο YAML όπου ορίζονται όλες οι μεταβλητές που χρησιμοποιούνται από τον ρόλο. Οι κατάλογοι templates και files περιέχουν τα πρότυπα και τα αρχεία που χρησιμοποιούνται από τις εργασίες στον ρόλο.
Για να δημιουργήσετε το δέντρο καταλόγων για έναν ρόλο, χρησιμοποιήστε την ακόλουθη εντολή με το όνομα του ρόλου ως τελευταία παράμετρο:
[root@ansible-server test2]# ansible-galaxy init role1
Το Ansible λειτουργεί επίσης καλά με πρότυπα και χρησιμοποιεί το Jinja2 ως γλώσσα δημιουργίας προτύπων.
Το επόμενο παράδειγμα δείχνει πώς μοιάζει ένα βασικό πρότυπο Jinja2 και πώς να το χρησιμοποιήσετε σε έναν ρόλο.
Κατά τον χρόνο εκτέλεσης, ανάλογα για παράδειγμα με το κέντρο δεδομένων στο οποίο βρίσκεται ο διακομιστής σας, μπορείτε να επιλέξετε από διάφορους διακομιστές ονομάτων, ο καθένας από τους οποίους αντιστοιχεί σε ένα κέντρο δεδομένων, χρησιμοποιώντας τη μεταβλητή resolver_ip_addresses.
{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}
options timeout:1
options attempts:5
options rotate
Σε αυτό το παράδειγμα, ο κατάλογος playbook ορίζει διάφορες μεταβλητές, συμπεριλαμβανομένων των resolver_ip_addresses, με διαφορετικές τιμές ανάλογα με το κέντρο δεδομένων.
- name: Set resolver for server
template:
src: dns.j2
dest: /etc/resolv.conf
group: root
owner: root
mode: "0644"
tag: resolver
Επεξήγηση:
- Όνομα του προτύπου που θα χρησιμοποιηθεί. Το πρότυπο βρίσκεται στα πρότυπα στη διαδρομή ρόλου
- Διαδρομή προορισμού του ονόματος αρχείου που θα αντικατασταθεί με το πρότυπο, στην πλευρά του πελάτη.
- Δικαιώματα του αρχείου προορισμού
Οι εργασίες ρόλων μπορούν επίσης να έχουν ένα πεδίο ετικέτας με ένα εκχωρημένο όνομα. Περισσότερες από μία εργασίες μπορούν να χρησιμοποιούν την ίδια ετικέτα και όταν εκτελείτε ένα εγχειρίδιο στρατηγικής, μπορείτε να καθορίσετε μια ετικέτα, ώστε να εκτελούνται μόνο οι εργασίες με ετικέτα.
Ansible Case Study
Σε αυτήν την ενότητα, αναλύουμε μια μελέτη περίπτωσης ενός βασικού εγχειριδίου Ansible που έχει τρεις ρόλους. Στόχος είναι να δώσουμε ένα πρακτικό παράδειγμα των εννοιών που καλύφθηκαν μέχρι στιγμής. Ορισμένα προηγούμενα παραδείγματα από αυτό το σεμινάριο έχουν προσαρμοστεί και επαναχρησιμοποιηθούν σε αυτό το εγχειρίδιο.
Παρακάτω είναι η δομή καταλόγου του εγχειριδίου. Το αρχείο YAML που χρησιμοποιείται είναι το p4.yml.
[root@ansible-server test_ansible]# ls -lrth total 16K -rw-r--r--. 1 root root 0 Jul 3 10:13 testfile -rw-r--r--. 1 root root 203 Jul 3 13:30 p1.yml -rw-r--r--. 1 root root 125 Jul 3 15:00 hosts -rw-r--r--. 1 root root 488 Jul 3 16:40 p2.yml -rw-r--r--. 1 root root 188 Jul 4 17:33 p4.yml drwxr-xr-x. 5 root root 47 Jul 4 17:35 roles [root@ansible-server test_ansible]# cd roles [root@ansible-server roles]# ls -lrth total 12K drwxr-xr-x. 9 root root 4.0K Jul 4 12:52 httpd drwxr-xr-x. 9 root root 4.0K Jul 4 13:55 selinux drwxr-xr-x. 9 root root 4.0K Jul 4 16:54 resolver
Το εγχειρίδιο έχει τρεις ρόλους. Ο ρόλος resolver ορίζει έναν συγκεκριμένο διακομιστή ονομάτων στους διακομιστές αντιγράφοντας ένα αρχείο στον προορισμό /etc/resolv.conf. Ο ρόλος httpd εγκαθιστά το πακέτο httpd με την ενότητα yum και ο τρίτος ρόλος ενεργοποιεί το SELinux και ειδοποιεί τον συνδεδεμένο χρήστη να επανεκκινήσει το σύστημα. Κάθε ρόλος δημιουργήθηκε με την εντολή ansible-galaxy.
Ρόλος επίλυσης, εργασία main.yml:
Ρόλος Httpd, εργασία main.yml:
Ρόλος Selinux, εργασία main.yml:
Παρακάτω είναι το εγχειρίδιο playbook p4.yml. Εκτελείται σε όλους τους κεντρικούς υπολογιστές εκτός εάν ορίζεται διαφορετικά στη γραμμή εντολών, εκτελείται ως χρήστης root στη θύρα 22 (SSH), συλλέγει δεδομένα πριν από την εκτέλεση των ρόλων και εκτελεί και τους τρεις ρόλους. Κάθε ρόλος μπορεί να εκτελεστεί ανεξάρτητα καθορίζοντας την ετικέτα του στη γραμμή εντολών ansible-playbook με την παράμετρο –t.
---
- hosts: all
user: root
port: 22
gather_facts: True
roles:
- { role: selinux, tags: selinux }
- { role: httpd, tags: httpd }
- { role: resolver, tags: resolver }
Στη συνέχεια, μπορείτε να εκτελέσετε το εγχειρίδιο p4.yml στους δύο κεντρικούς υπολογιστές και να ερμηνεύσετε την έξοδο. Η ίδια εντολή μπορεί να εκτελεστεί με την παράμετρο –check για μια δοκιμαστική εκτέλεση και με την παράμετρο -k όταν θέλετε να χρησιμοποιήσετε έλεγχο ταυτότητας με κωδικό πρόσβασης.
Επεξήγηση:
- Εντολή Ansible-playbook που εκτελεί το p4.yml
- Το Playbook παρακάμπτει το ρόλο SELinux επειδή είναι ήδη ενεργοποιημένος.
- Ο Ansible διαπίστωσε ότι το πακέτο httpd είναι ήδη εγκατεστημένο, οπότε επιστρέφει οκ.
- Το πρόγραμμα επίλυσης ορίστηκε και η κατάσταση του εργαλείου επίλυσης ρόλων άλλαξε.
Φύλλο εξαπάτησης εντολών Ansible
Εγκαταστήστε το EPEL repo σε συστήματα Centos/RHEL
[root@ansible-server ~]# sudo yum install epel-release
Εγκαταστήστε το πακέτο ansible σε συστήματα Centos/RHEL
[root@ansible-server ~]# sudo yum install -y ansible
Εκτελέστε μια ενημέρωση στα πακέτα στο Debian/Ubuntu συστήματα
$ sudo apt update
Εγκαταστήστε το λογισμικό-ιδιότητες-κοινό πακέτο στο Debian/Ubuntu συστήματα
$ sudo apt install software-properties-common
Εγκαταστήστε το αρχείο προσωπικών πακέτων ansible στο Debian/Ubuntu συστήματα
$ sudo apt-add-repository ppa:ansible/ansible
Εγκαταστήστε το ansible στο Debian/Ubuntu συστήματα
$ sudo apt update $ sudo apt install ansible
Τεύχος α ping εντολή σε όλους τους διακομιστές που ορίζονται στο αρχείο απογραφής με το όνομα hosts
[root@ansible-server test_ansible]# ansible -i hosts all -m ping
Τεύχος α ping εντολή μόνο στον host2
[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
Αντιγράψτε το αρχείο "testfile" σε όλους τους κεντρικούς υπολογιστές στο αρχείο αποθέματος
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
Εγκαταστήστε το πακέτο ncdu σε όλους τους κεντρικούς υπολογιστές
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
Καταργήστε το πακέτο ncdu σε όλους τους κεντρικούς υπολογιστές
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
Δημιουργήστε τη δομή καταλόγου για το ρόλο με το όνομα role1.
[root@ansible-server test2]# ansible-galaxy init role1
Dry-run p4.yml playbook
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check
Εκτελέστε το p4.yml playbook με έλεγχο ταυτότητας κωδικού πρόσβασης για όλους τους κεντρικούς υπολογιστές
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k















