Πώς να εργαστείτε με 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.