Πώς να εργαστείτε με Ansible μεταβλητές και γεγονότα - Μέρος 8


Αναφέραμε μεταβλητές σε αυτή τη σειρά Ansible και απλώς για να σας κουράξουμε λίγο. Μια μεταβλητή, όπως σε πολλές γλώσσες προγραμματισμού, είναι ουσιαστικά ένα κλειδί που αντιπροσωπεύει μια τιμή.

Τι συνιστά ένα έγκυρο όνομα μεταβλητής;

Ένα όνομα μεταβλητής περιλαμβάνει γράμματα, αριθμούς, κάτω παύλες ή συνδυασμό 2 ή όλων αυτών. Ωστόσο, έχετε κατά νου ότι ένα όνομα μεταβλητής πρέπει πάντα να ξεκινά με ένα γράμμα και δεν πρέπει να περιέχει κενά.

Ας ρίξουμε μια ματιά σε μερικά παραδείγματα έγκυρων και μη αποδεκτών ονομάτων μεταβλητών:

Παραδείγματα ονομάτων έγκυρης μεταβλητής:

football 
foot_ball
football20 
foot_ball20

Παραδείγματα ονομάτων μη έγκυρων μεταβλητών:

foot ball
20 
foot-ball

Ας συζητήσουμε τους τύπους μεταβλητών:

1. Μεταβλητές Playbook

Οι μεταβλητές Playbook είναι αρκετά εύκολες και απλές. Για να ορίσετε μια μεταβλητή σε ένα βιβλίο, απλώς χρησιμοποιήστε τη λέξη-κλειδί vars πριν γράψετε τις μεταβλητές σας με εσοχή.

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

Ακολουθεί ένα απλό παράδειγμα βιβλίου:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

Στο παραπάνω playbook, η μεταβλητή greeting αντικαθίσταται από την τιμή Hello world! όταν εκτελείται το playbook. Το playbook απλώς εκτυπώνει το μήνυμα Hello world! όταν εκτελεστεί.

Επιπλέον, μπορείτε να έχετε μια λίστα ή μια σειρά μεταβλητών όπως φαίνεται:

Το βιβλίο παιχνιδιού παρακάτω δείχνει μια μεταβλητή που ονομάζεται ήπειροι. Η μεταβλητή έχει 5 διαφορετικές τιμές – ονόματα ηπείρων. Καθεμία από αυτές τις τιμές είναι εύκολα προσβάσιμη χρησιμοποιώντας το ευρετήριο 0 ως πρώτη μεταβλητή.

Το παρακάτω παράδειγμα του playbook ανακτά και εμφανίζει την Ασία (Ευρετήριο 1).

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

Η λίστα μεταβλητών μπορεί παρομοίως να δομηθεί όπως φαίνεται:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

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

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Ένας άλλος τύπος μεταβλητής Ansible είναι η μεταβλητή λεξικό.

Οι μεταβλητές Λεξικό υποστηρίζονται επιπλέον στο βιβλίο αναπαραγωγής. Για να ορίσετε τη μεταβλητή του λεξικού, απλώς προσδιορίστε το ζεύγος κλειδιού-τιμής ακριβώς κάτω από το όνομα της μεταβλητής του λεξικού.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

Στο παραπάνω παράδειγμα, το vlans είναι η μεταβλητή του λεξικού, ενώ το id και το port είναι τα ζεύγη κλειδιού-τιμής.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

Για το port_id, καθώς ξεκινάμε την τιμή με κείμενο και όχι με τη μεταβλητή, τα εισαγωγικά δεν είναι απαραίτητα για να περιβάλλουν τα σγουρά άγκιστρα.

2. Ειδικές Μεταβλητές

Το Ansible παρέχει μια λίστα με προκαθορισμένες μεταβλητές που μπορούν να αναφέρονται σε πρότυπα και βιβλία αναπαραγωγής Jinja2, αλλά δεν μπορούν να τροποποιηθούν ή να καθοριστούν από τον χρήστη.

Συλλογικά, η λίστα των προκαθορισμένων μεταβλητών Ansible αναφέρεται ως Ansible γεγονότα και συλλέγονται όταν εκτελείται ένα βιβλίο αναπαραγωγής.

Για να λάβετε μια λίστα με όλες τις μεταβλητές Ansible, χρησιμοποιήστε την ενότητα setup στην εντολή Ad-hoc Ansible όπως φαίνεται παρακάτω:

# ansible -m setup hostname

Αυτό εμφανίζει την έξοδο σε μορφή JSON όπως φαίνεται:

# ansible -m setup localhost

Από την έξοδο, μπορούμε να δούμε ότι μερικά από τα παραδείγματα των ειδικών μεταβλητών Ansible περιλαμβάνουν:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Υπάρχουν πολλές άλλες ειδικές μεταβλητές Ansible, αυτές είναι μόνο μερικά παραδείγματα.

Αυτές οι μεταβλητές μπορούν να χρησιμοποιηθούν σε ένα πρότυπο Jinja2 όπως φαίνεται:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. Μεταβλητές Αποθέματος

Τέλος, στη λίστα, έχουμε μεταβλητές αποθέματος Ansible. Ένα απόθεμα είναι ένα αρχείο σε μορφή INI που περιέχει όλους τους κεντρικούς υπολογιστές που πρέπει να διαχειρίζονται το Ansible.

Στα αποθέματα, μπορείτε να αντιστοιχίσετε μια μεταβλητή σε ένα κεντρικό σύστημα και αργότερα να τη χρησιμοποιήσετε σε ένα βιβλίο αναπαραγωγής.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

Τα παραπάνω μπορούν να αναπαρασταθούν σε ένα αρχείο playbook YAML όπως φαίνεται:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

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

Για παράδειγμα:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

Τα παραπάνω μπορούν να δομηθούν ως εξής:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

Και στο αρχείο playbook YAML, αυτό θα οριστεί όπως φαίνεται:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Απαιτούμενα Γεγονότα

Όταν εκτελείτε βιβλία αναπαραγωγής, η πρώτη εργασία που κάνει το Ansible είναι η εκτέλεση της εργασίας εγκατάστασης. Είμαι σίγουρος ότι πρέπει να έχετε συναντήσει το αποτέλεσμα:

TASK:  [Gathering facts] *********

Τα ανεξήγητα γεγονότα δεν είναι παρά ιδιότητες συστήματος ή κομμάτια πληροφοριών σχετικά με απομακρυσμένους κόμβους στους οποίους έχετε συνδεθεί. Αυτές οι πληροφορίες περιλαμβάνουν την αρχιτεκτονική του συστήματος, την έκδοση του λειτουργικού συστήματος, πληροφορίες BIOS, ώρα και ημερομηνία συστήματος, χρόνο λειτουργίας συστήματος, διεύθυνση IP και πληροφορίες υλικού για να αναφέρουμε μόνο μερικές.

Για να λάβετε τα στοιχεία για οποιοδήποτε σύστημα, απλώς χρησιμοποιήστε την ενότητα setup όπως φαίνεται στην παρακάτω εντολή:

# ansible -m setup hostname

Για παράδειγμα:

# ansible -m setup database_server

Αυτό εκτυπώνει ένα μεγάλο σύνολο δεδομένων σε μορφή JSON όπως φαίνεται:

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

Προσαρμοσμένα γεγονότα

Γνωρίζατε επίσης ότι μπορείτε να δημιουργήσετε τα δικά σας προσαρμοσμένα στοιχεία που μπορούν να συγκεντρωθούν από την Ansible; Ναι μπορείς. Λοιπόν, πώς το κάνετε; Ας αλλάξουμε ταχύτητα και ας δούμε πώς.

Το πρώτο βήμα είναι να δημιουργήσετε έναν κατάλογο /etc/ansible/facts.d στον διαχειριζόμενο ή στον απομακρυσμένο κόμβο.

Μέσα σε αυτόν τον κατάλογο, δημιουργήστε ένα αρχείο(α) με επέκταση .fact. Αυτά τα αρχεία θα επιστρέψουν δεδομένα JSON όταν το βιβλίο αναπαραγωγής εκτελείται στον κόμβο ελέγχου Ansible, ο οποίος περιλαμβάνει τα άλλα γεγονότα που ανακτά το Ansible μετά από μια εκτέλεση του βιβλίου αναπαραγωγής.

Ακολουθεί ένα παράδειγμα προσαρμοσμένου αρχείου δεδομένων που ονομάζεται date_time.fact που ανακτά την ημερομηνία και την ώρα.

# mkdir -p /etc/ansible/facts.d
# vim /etc/ansible/facts.d/date_time.fact

Προσθέστε τις ακόλουθες γραμμές σε αυτό.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Αποθηκεύστε και βγείτε από το αρχείο.

Τώρα εκχωρήστε τα δικαιώματα εκτέλεσης:

# chmod +x /etc/ansible/facts.d/date_time.fact

Τώρα, δημιούργησα ένα βιβλίο αναπαραγωγής στον κόμβο ελέγχου Ansible που ονομάζεται check_date.yml.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Προσθέστε το αρχείο δεδομένων στη μεταβλητή ansible_local. Το ansible_local αποθηκεύει όλα τα προσαρμοσμένα στοιχεία.

Τώρα εκτελέστε το playbook και παρατηρήστε την ανάκτηση πληροφοριών Ansible που είναι αποθηκευμένες στο αρχείο γεγονότων:

# ansible_playbook check_date.yml
συμπέρασμα

Αυτό μας φέρνει στο τέλος αυτού του σεμιναρίου σχετικά με την εργασία με μεταβλητές και γεγονότα Ansible.