Πώς να δημιουργήσετε Ansible Plays και Playbooks - Μέρος 5
Σε αυτό το Μέρος 5 της σειράς Ansible, θα εξηγήσουμε πώς να δημιουργήσετε Ansible Plays και Playbooks χρησιμοποιώντας μονάδες Ansible.
Το Ansible αποστέλλεται με αυτόνομα σενάρια που ονομάζονται modules που χρησιμοποιούνται σε βιβλία παιχνιδιού για την εκτέλεση εξειδικευμένων εργασιών σε απομακρυσμένους κόμβους.
Οι Ενότητες είναι χρήσιμες για την αυτοματοποίηση εργασιών όπως η διαχείριση πακέτων, η αρχειοθέτηση και η αντιγραφή αρχείων για να αναφέρουμε μόνο μερικές. Σας επιτρέπουν να κάνετε τροποποιήσεις σε αρχεία διαμόρφωσης και να διαχειρίζεστε συσκευές όπως δρομολογητές, διακόπτες, εξισορροπητές φορτίου, τείχη προστασίας και μια σειρά από άλλες συσκευές.
Ο στόχος αυτού του υποθέματος είναι να σας δώσει μια επισκόπηση διαφόρων εργασιών που μπορούν να επιτευχθούν από ενότητες Ansible:
Διαχείριση πακέτων σε Linux
Η διαχείριση πακέτων είναι μια από τις πιο βασικές και συχνές εργασίες που αναλαμβάνουν οι διαχειριστές συστημάτων. Το Ansible αποστέλλεται με λειτουργικές μονάδες που σας βοηθούν να εκτελέσετε εργασίες διαχείρισης πακέτων τόσο σε συστήματα που βασίζονται στο RedHat και στο Debian.
Είναι σχετικά εύκολο να μαντέψει κανείς. Υπάρχει η apt module για διαχείριση πακέτων YUM και μονάδα dnf που σχετίζεται με νεότερες διανομές RHEL.
Ακολουθούν μερικά παραδείγματα για το πώς μπορούν να χρησιμοποιηθούν οι μονάδες σε ένα βιβλίο παιχνιδιού:
Παράδειγμα 1: Εγκατάσταση του διακομιστή Web Apache στο RHEL 8
--- - name: install Apache webserver hosts: webservers tasks: - name: install httpd dnf: name: httpd State: latest
Παράδειγμα 2: Εγκατάσταση του διακομιστή Web Apache στο Debian 10
--- - name: install Apache webserver hosts: databases tasks: - name: install Apache webserver apt: name: apache2 State: latest
Μονάδα εξυπηρέτησης
Η ενότητα υπηρεσιών επιτρέπει στους διαχειριστές συστήματος να ξεκινούν, να διακόπτουν, να ενημερώνουν, να αναβαθμίζουν και να φορτώνουν ξανά υπηρεσίες στο σύστημα.
Παράδειγμα 1: Εκκίνηση του διακομιστή Web Apache
--- - name: Start service httpd, if not started service: name: httpd state: started
Παράδειγμα 2: Διακοπή διακομιστή Web Apache
--- - name: Stop service httpd service: name: httpd state: stopped
Παράδειγμα 3: Επανεκκίνηση μιας διεπαφής δικτύου enp2s0
--- - name: Restart network service for interface eth0 service: name: network state: restarted args: enp2s0
Ενότητα αντιγραφής
Όπως υποδηλώνει το όνομα, η μονάδα αντιγραφής αντιγράφει αρχεία από μια θέση στο απομακρυσμένο μηχάνημα σε διαφορετική θέση στο ίδιο μηχάνημα.
Παράδειγμα 1: Αντιγραφή αρχείων από τοπικό σε απομακρυσμένο Linux
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Το playbook αντιγράφει το αρχείο διαμόρφωσης tecmint.conf από τον κατάλογο /etc/files/ στον κατάλογο /srv/ ως tecmint > χρήστης με δικαιώματα 0644.
Τα δικαιώματα μπορούν επίσης να αναπαρασταθούν χρησιμοποιώντας συμβολική αναπαράσταση όπως φαίνεται στην τελευταία γραμμή.
Παράδειγμα 2: Αντιγραφή αρχείων από τοπικό σε απομακρυσμένο Linux
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: u=rw, g=r, o=r
Τα δικαιώματα στο προηγούμενο παράδειγμα μπορούν να αναπαρασταθούν όπως φαίνεται στην τελευταία γραμμή. Στον χρήστη εκχωρούνται δικαιώματα ανάγνωσης και εγγραφής, στην ομάδα εκχωρούνται δικαιώματα εγγραφής και τα υπόλοιπα στον κόσμο εκχωρούνται δικαιώματα ανάγνωσης.
Ενότητα αρχείου
Η μονάδα αρχείων χρησιμοποιείται για τη μεταφορά πολλών λειτουργιών αρχείων, συμπεριλαμβανομένης της δημιουργίας αρχείων και καταλόγων, της εκχώρησης δικαιωμάτων αρχείων και της ρύθμισης συμβολικών συνδέσμων.
Παράδειγμα 1: Εκτελέστε δικαιώματα αρχείων Linux
--- - name: Change file ownership, group, and permissions file: path: /etc/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Η παραπάνω αναπαραγωγή δημιουργεί ένα αρχείο που ονομάζεται tecmint.conf στα δικαιώματα ρύθμισης του καταλόγου /etc σε 0644.
Παράδειγμα 2: Διαγραφή αρχείου Linux
--- - name: Remove file (delete file) file: path: /etc/tecmint.conf state: absent
Αυτό αφαιρεί ή διαγράφει το αρχείο tecmint.conf.
Παράδειγμα 3: Δημιουργία καταλόγου
--- - name: create a directory if it doesn’t exist file: path: /etc/mydirectory State: directory mode: '0777'
Αυτό θα δημιουργήσει έναν κατάλογο στα δικαιώματα ρύθμισης καταλόγου /etc σε 0777.
Παράδειγμα 4: Επαναληπτική διαγραφή καταλόγου
--- - name: Recursively deleting a directory file: path: /etc/tecmint.conf state: absent
Η παραπάνω αναπαραγωγή διαγράφει αναδρομικά έναν κατάλογο.
Ενότητα Lineinfile
Η ενότητα lineinfile είναι χρήσιμη όταν θέλετε να αλλάξετε μία γραμμή σε ένα αρχείο. Μπορεί να αντικαταστήσει μια υπάρχουσα γραμμή.
Παράδειγμα 1: Χειρισμός αρχείων στο Linux
--- - name: Ensure SELinux is set to enforcing mode lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: SELINUX=disabled
Το παραπάνω παιχνίδι ορίζει την τιμή SELINUX σε απενεργοποιημένο.
SELINUX=disabled
Παράδειγμα 2: Αλλαγή αρχείων στο Linux
--- - name: Add a line to a file if the file does not exist, without passing regexp lineinfile: path: /etc/hosts line: 10.200.50.51 linux-console.net create: yes
Αυτό προσθέτει την καταχώρηση 10.200.50.51 linux-console.net στο αρχείο /etc/hosts.
Ενότητα αρχείου
Μια λειτουργική μονάδα Αρχείο χρησιμοποιείται για τη δημιουργία ενός συμπιεσμένου αρχείου ενός ή πολλαπλών αρχείων. Υποθέτει ότι η πηγή συμπίεσης υπάρχει στον προορισμό-στόχο. Μετά την αρχειοθέτηση, το αρχείο προέλευσης μπορεί αργότερα να διαγραφεί ή να αφαιρεθεί χρησιμοποιώντας τη δήλωση remove=True
.
Παράδειγμα 1: Δημιουργία αρχείου αρχειοθέτησης
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz archive: path: /path/to/tecmint_dir dest: /path/to/tecmint.tgz This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
Παράδειγμα 2: Δημιουργήστε ένα αρχείο αρχειοθέτησης και αφαιρέστε
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it archive: path: /path/to/tecmint dest: /path/to/tecmint.tgz remove: yes
Στην παραπάνω αναπαραγωγή, το αρχείο προέλευσης /path/to/tecmint διαγράφεται μετά την ολοκλήρωση της αρχειοθέτησης.
Παράδειγμα 3: Δημιουργία αρχείου αρχειοθέτησης
- name: Create a bz2 archive of /path/to/tecmint archive: path: /path/to/tecmint format: bz2
Αυτό δημιουργεί ένα συμπιεσμένο αρχείο σε μορφή bz2 από το αρχείο /path/to/tecmint.
Ενότητα Git
Η ενότητα διαχειρίζεται τα ταμεία git των αποθετηρίων λογισμικού.
Παράδειγμα 1: Ελέγξτε τα αποθετήρια Git
- git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /srv/checkout version: release-0.22
Ενότητα εντολών
Μία από τις πιο συχνά χρησιμοποιούμενες λειτουργικές μονάδες, η ενότητα εντολή παίρνει το όνομα της εντολής και αργότερα ακολουθείται από μια λίστα ορισμάτων. Η εντολή περνά με τον ίδιο τρόπο που θα πληκτρολογούσατε σε ένα κέλυφος Linux.
Παράδειγμα 1: Εκτελέστε μια εντολή
- name: Executing a command using the command module command: cat helloworld.txt
Παράδειγμα 2: Έλεγχος χρόνου λειτουργίας απομακρυσμένου Linux
--- - name: Check the remote host uptime hosts: servers tasks: - name: Execute the Uptime command over Command module register: uptimeoutput command: "uptime" - debug: var: uptimeoutput.stdout_lines
Η μονάδα εντολών ανακτά το χρόνο λειτουργίας των απομακρυσμένων διακομιστών.
Μεταβλητές για την ανάκτηση των αποτελεσμάτων των εντολών εκτέλεσης
Συνήθως, τα βιβλία αναπαραγωγής Ansible χρησιμοποιούνται για την εκτέλεση εργασιών σε διαχειριζόμενους κεντρικούς υπολογιστές χωρίς να εμφανίζεται η έξοδος στη γραμμή εντολών. Υπάρχουν περιπτώσεις, ωστόσο, που μπορεί να σας ζητηθεί να καταγράψετε την έξοδο ή τα αποτελέσματα. Σε αυτήν την ενότητα, σας καθοδηγούμε πώς μπορείτε να καταγράψετε την έξοδο ενός βιβλίου αναπαραγωγής σε μια μεταβλητή και αργότερα να την εμφανίσετε.
Ένας καταχωρητής ansible χρησιμοποιείται για τη λήψη της εξόδου μιας εργασίας και την αποθήκευση μιας μεταβλητής. Στη συνέχεια, η μεταβλητή θα περιέχει το stdout της εργασίας.
Για παράδειγμα, ας υποθέσουμε ότι θέλετε να ελέγξετε τη χρήση του δίσκου των διαχειριζόμενων κόμβων σε αντίστοιχους ριζικούς καταλόγους χρησιμοποιώντας την εντολή df -Th /
. Θα χρησιμοποιήσετε την ενότητα ‘command’
για να ορίσετε την εντολή και το ‘register’
για να αποθηκεύσετε την έξοδο std σε μια μεταβλητή.
Για να εμφανίσετε την εντολή, θα χρησιμοποιήσετε τη λειτουργική μονάδα ‘debug’
μαζί με την επιστρεφόμενη τιμή stdout.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout
Τώρα, ας τρέξουμε το playbook. Σε αυτήν την περίπτωση, έχουμε ονομάσει το βιβλίο μας check_disk_space.yml.
# ansible-playbook check_disk_space.yml
Όπως είδατε, η έξοδος είναι μπερδεμένη και καθιστά δύσκολη την παρακολούθηση.
Για να ευθυγραμμίσετε την έξοδο και να διευκολύνετε την ανάγνωση, αντικαταστήστε την τιμή επιστροφής stdout με stdout_lines.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout_lines
Χρησιμοποιήστε τις προϋποθέσεις για τον έλεγχο της εκτέλεσης αναπαραγωγής
Όπως και στις γλώσσες προγραμματισμού, οι δηλώσεις υπό όρους χρησιμοποιούνται όταν είναι δυνατά περισσότερα από ένα αποτελέσματα. Ας ρίξουμε μια ματιά σε μερικές από τις συνήθως χρησιμοποιούμενες προτάσεις υπό όρους στα βιβλία παιχνιδιού Ansible.
Πότε δήλωση
Μερικές φορές, μπορεί να θέλετε να εκτελέσετε εργασίες σε συγκεκριμένους κόμβους και όχι σε άλλους. Η υπό όρους πρόταση when
είναι αρκετά εύκολη στη χρήση και την εφαρμογή σε ένα βιβλίο παιχνιδιού. Όταν χρησιμοποιείτε τον όρο when
, απλώς δηλώστε τη συνθήκη δίπλα στον όρο όπως φαίνεται:
when: condition
Όταν η συνθήκη ικανοποιηθεί, τότε η εργασία εκτελείται στο απομακρυσμένο σύστημα.
Ας δούμε μερικά παραδείγματα:
Παράδειγμα 1: Χρήση Όταν χειριστής
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian”
Το παραπάνω παιχνίδι εγκαθιστά τον διακομιστή ιστού Nginx σε οικοδεσπότες που εκτελούν την οικογένεια διανομών του Debian.
Μπορείτε επίσης να χρησιμοποιήσετε τους τελεστές OR
και AND
μαζί με την υπό όρους πρόταση όταν.
Παράδειγμα 2: Χρήση AND Operator με Πότε
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” and ansible_distribution_version == “18.04”
Όταν χρησιμοποιείτε τον τελεστή AND
, πρέπει να ικανοποιούνται και οι δύο δηλώσεις για να εκτελεστεί η εργασία.
Το παραπάνω παιχνίδι εγκαθιστά το Nginx σε Nodes που εκτελούν μια οικογένεια λειτουργικών συστημάτων Debian που είναι η έκδοση 18.04. Προφανώς, αυτό θα είναι το Ubuntu 18.04.
Παράδειγμα 3: Χρήση OR Operator με Πότε
Με τον τελεστή OR
, η εργασία εκτελείται εάν πληρούται κάποια από τις προϋποθέσεις.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” or Ansible_os_family == “SUSE”
Το παραπάνω παιχνίδι εγκαθιστά διακομιστές ιστού Nginx είτε στην οικογένεια λειτουργικών συστημάτων Debian είτε σε SUSE ή και στα δύο.
ΣΗΜΕΙΩΣΗ: Φροντίζετε πάντα να χρησιμοποιείτε το διπλό σύμβολο ισότητας ==
κατά τον έλεγχο μιας συνθήκης.
Προϋποθέσεις σε βρόχους
Οι προϋποθέσεις μπορούν επίσης να χρησιμοποιηθούν σε βρόχο. Ας πούμε, για παράδειγμα, ότι έχετε μια λίστα με πολλά πακέτα που πρέπει να εγκατασταθούν σε απομακρυσμένους κόμβους.
Στον παρακάτω πίνακα παιχνιδιού, έχουμε έναν πίνακα που ονομάζεται πακέτα που περιέχει μια λίστα πακέτων που πρέπει να εγκατασταθούν. Αυτές οι εργασίες θα εκτελούνται η μία μετά την άλλη εάν η ρήτρα απαιτείται οριστεί σε Αληθής.
--- - name: Install Software packages hosts: all vars: packages: • name: nginx required: True • name: mysql required: True • name: apache required: False tasks: • name: Install “{{ item.name }}”on Debian apt: name: “{{ item.name }}” state: present When: item.required == True loop: “{{ packages }}”
Διαμόρφωση χειρισμού σφαλμάτων
Μερικές φορές, οι εργασίες αποτυγχάνουν κατά την εκτέλεση βιβλίων αναπαραγωγής. Ας υποθέσουμε ότι εκτελείτε 5 εργασίες σε 3 διακομιστές όπως φαίνεται στον παρακάτω πίνακα αναπαραγωγής. Εάν παρουσιαστεί σφάλμα στην εργασία 3 (Έναρξη MySQL) στον διακομιστή 2, το Ansible θα σταματήσει να εκτελεί τις υπόλοιπες εργασίες στον διακομιστή 2 και θα προσπαθήσει να ολοκληρώσει τις υπόλοιπες εργασίες στους υπόλοιπους διακομιστές.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> - name: Install MySQL database << some code >> - name: Start MySQL << some code >> - name: Install Nginx << some code >> - name: Start Nginx << some code >>
Εάν θέλετε συνοχή στην εκτέλεση του βιβλίου αναπαραγωγής, για παράδειγμα, διακόψτε την εκτέλεση ενός βιβλίου αναπαραγωγής, εάν ένας από τους διακομιστές αποτύχει, προσθέστε την επιλογή.
--- - name: Install Software packages hosts: server1, server2, server3 any_errors_fatal: true tasks:
Με αυτόν τον τρόπο, εάν μια εργασία αποτύχει σε έναν διακομιστή, το Ansible θα σταματήσει την εκτέλεση ολόκληρου του βιβλίου αναπαραγωγής σε όλους τους διακομιστές και θα βγει.
Εάν θέλετε το playbook να αγνοήσει τα σφάλματα και να προχωρήσει στην εκτέλεση του υπόλοιπου συνόλου εργασιών, χρησιμοποιήστε την επιλογή ignore_errors: True.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> ignore_errors: True
Δημιουργήστε Playbooks για να ρυθμίσετε τα συστήματα σε μια καθορισμένη κατάσταση
Σε αυτήν την ενότητα, εξετάζουμε ορισμένες πρόσθετες επιλογές που είναι διαθέσιμες κατά την εκτέλεση ενός βιβλίου αναπαραγωγής.
Ας ξεκινήσουμε με την επιλογή Check ή Dry run. Η επιλογή ξηρής εκτέλεσης ή λειτουργίας ελέγχου χρησιμοποιείται κατά την εκτέλεση ενός βιβλίου αναπαραγωγής για να ελεγχθεί εάν θα παρουσιαστούν σφάλματα και εάν υπάρχουν αλλαγές που θα γίνουν στους διαχειριζόμενους κεντρικούς υπολογιστές. Ωστόσο, δεν κάνει καμία αλλαγή στους απομακρυσμένους κόμβους.
Για παράδειγμα, για να εκτελέσετε στεγνό ένα βιβλίο αναπαραγωγής που ονομάζεται httpd.yml
που εγκαθιστά και ξεκινά την εκτέλεση του διακομιστή ιστού Apache:
# ansible-playbook httpd.yml --check
Η άλλη επιλογή που πρέπει να εξετάσουμε είναι η επιλογή --start-at-task
. Αυτό χρησιμοποιείται κατά τον καθορισμό του ονόματος της εργασίας από την οποία θα πρέπει να ξεκινήσει ή να ξεκινήσει το βιβλίο αναπαραγωγής.
Ας πάρουμε ένα παράδειγμα: Το βιβλίο παιχνιδιού παρακάτω περιγράφει 2 εργασίες: Η πρώτη αναπαραγωγή εγκαθιστά τον διακομιστή ιστού Apache και η δεύτερη εγκαθιστά το βοηθητικό πρόγραμμα htop.
--- - name: Install httpd hosts: all tasks: yum: name: httpd state: Installed - name: Install htop yum: name: htop state: started
Εάν θέλετε να παραλείψετε την εγκατάσταση του διακομιστή ιστού Apache και να εγκαταστήσετε το βοηθητικό πρόγραμμα htop run:
# ansible-playbook playbook.yml --start-at-task “Install htop”
Τέλος, μπορείτε να προσθέσετε ετικέτες στις εργασίες ή τις αναπαραγωγές σας προσθέτοντας την επιλογή ετικέτες στο βιβλίο αναπαραγωγής σας, όπως φαίνεται. Αυτό είναι χρήσιμο όταν έχετε αρκετά μεγάλο βιβλίο και θέλετε να εκτελέσετε συγκεκριμένες εργασίες από ολόκληρο το βιβλίο.
--- - name: Install httpd tags: Install and start hosts: all tasks: yum: name: httpd state: Installed tags: Install • service: name: httpd state: started
# ansible-playbook playbook.yml -tags "Install"
Για να παραλείψετε τις ετικέτες χρησιμοποιήστε τις επιλογές --skip-tags
όπως φαίνεται.
# ansible-playbook playbook.yml --skip-tags "Install"
συμπέρασμα
Σε αυτό το θέμα, σας περιγράψαμε τις συνήθως χρησιμοποιούμενες ενότητες στο Ansible, πώς να ανακτήσετε το stdout από την εκτέλεση ενός βιβλίου αναπαραγωγής για ανάλυση, τη χρήση συνθηκών στο βιβλίο αναπαραγωγής και τον τρόπο διαχείρισης σφαλμάτων που ενδέχεται να προκύψουν κατά την εκτέλεση καθήκοντα. Τέλος, ανακεφαλαιώσαμε τη διαμόρφωση των βιβλίων αναπαραγωγής και τον τρόπο με τον οποίο μπορείτε να χρησιμοποιήσετε πρόσθετες επιλογές για να αποφασίσετε ποιες εργασίες θα εκτελέσετε εάν δεν σκοπεύετε να εκτελέσετε ολόκληρο το βιβλίο αναπαραγωγής.