Πώς να δημιουργήσετε 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 από την εκτέλεση ενός βιβλίου αναπαραγωγής για ανάλυση, τη χρήση συνθηκών στο βιβλίο αναπαραγωγής και τον τρόπο διαχείρισης σφαλμάτων που ενδέχεται να προκύψουν κατά την εκτέλεση καθήκοντα. Τέλος, ανακεφαλαιώσαμε τη διαμόρφωση των βιβλίων αναπαραγωγής και τον τρόπο με τον οποίο μπορείτε να χρησιμοποιήσετε πρόσθετες επιλογές για να αποφασίσετε ποιες εργασίες θα εκτελέσετε εάν δεν σκοπεύετε να εκτελέσετε ολόκληρο το βιβλίο αναπαραγωγής.