Πώς να δημιουργήσετε πρότυπα στο Ansible για να δημιουργήσετε διαμορφώσεις σε διαχειριζόμενους κόμβους - Μέρος 7


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

Τι είναι το Templating στο Ansible;

Για να έχετε μια καλύτερη αίσθηση του τι είναι ένα πρότυπο, ας σκεφτούμε ότι ένας διευθυντής IT συντάσσει ένα email για να προσκαλέσει το τμήμα του για ένα κοκτέιλ πάρτι. Το email αποστέλλεται σε κάθε ένα από τα μέλη και τα προσκαλεί επίσης να κάνουν tag μαζί με τους συζύγους τους.

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

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

Το Jinja2 χρησιμοποιεί τα διπλά σγουρά άγκιστρα {{ ... }} για να περικλείσει μια μεταβλητή που έχει οριστεί. Για σχόλια, χρησιμοποιήστε {{# #} και για δηλώσεις υπό όρους χρησιμοποιήστε {% … %}.

Ας υποθέσουμε ότι έχετε ένα μοντέλο δεδομένων VLAN στο δίκτυό σας με συστήματα κεντρικού υπολογιστή που θέλετε να προωθήσετε στα αντίστοιχα VLAN όπως φαίνεται.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

Για την απόδοση αυτής της διαμόρφωσης, το αντίστοιχο πρότυπο jinja2 που ονομάζεται vlans.j2 θα εμφανιστεί όπως φαίνεται. Όπως μπορείτε να δείτε, οι μεταβλητές vlan.id και vlan.name έχουν εγκλειστεί σε σγουρά άγκιστρα.

vlan {{ vlan.id }}
  name {{ vlan.name }}

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

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

Παράδειγμα 1: Διαμόρφωση διακομιστών Web σε διαφορετικές διανομές

Σε αυτό το παράδειγμα, θα δημιουργήσουμε αρχεία index.html που θα εμφανίζουν πληροφορίες σχετικά με το όνομα κεντρικού υπολογιστή και το λειτουργικό σύστημα 2 διακομιστών ιστού που εκτελούν CentOS και Ubuntu .

Ρύθμιση

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

Ο διακομιστής ιστού Apache έχει ήδη εγκατασταθεί και στους δύο διακομιστές.

Για το CentOS 7

Για το Ubuntu 18.04

Ας δημιουργήσουμε λοιπόν ένα playbook test_server.yml όπως φαίνεται:

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

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

Ας δημιουργήσουμε τώρα το αρχείο προτύπου index.html.j2.

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

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

Τώρα, ας τρέξουμε το playbook.

ansible-playbook test_server.yml

Τώρα, ας φορτώσουμε ξανά τις ιστοσελίδες και για τους διακομιστές ιστού CentOS 7 και Ubuntu.

Για το CentOS 7

Για το Ubuntu 18.04

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

ΦΙΛΤΡΑ:

Μερικές φορές, μπορεί να αποφασίσετε να αντικαταστήσετε την τιμή μιας μεταβλητής με μια συμβολοσειρά που εμφανίζεται με συγκεκριμένο τρόπο.

Παράδειγμα 1: Κάντε τις συμβολοσειρές να εμφανίζονται με κεφαλαία/πεζά

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

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

Ομοίως, μπορείτε να μετατρέψετε την έξοδο συμβολοσειράς σε πεζά προσθέτοντας το μικρότερο όρισμα.

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

Παράδειγμα 2: Αντικαταστήστε μια συμβολοσειρά με μια άλλη

Επιπλέον, μπορείτε να αντικαταστήσετε μια συμβολοσειρά με μια άλλη.

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

Ο τίτλος της ταινίας είναι {{ movie_name }} => Ο τίτλος της ταινίας είναι Ring.

Για να αντικαταστήσετε την έξοδο με μια άλλη συμβολοσειρά, χρησιμοποιήστε το όρισμα αντικατάστασης όπως φαίνεται:

Ο τίτλος της ταινίας είναι {{ movie_name | αντικαταστήστε ("Ring", "Heist") }} => Ο τίτλος της ταινίας είναι Heist.

Παράδειγμα 3: Καταγράφει και ορίζει φίλτρα

Για να ανακτήσετε τη μικρότερη τιμή σε έναν πίνακα, χρησιμοποιήστε το φίλτρο min.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

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

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

Για να εμφανίσετε μοναδικές τιμές, χρησιμοποιήστε το φίλτρο μοναδικό.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

Χρησιμοποιήστε το φίλτρο τυχαίο για να λάβετε έναν τυχαίο αριθμό μεταξύ του 0 και της τιμής.

{{ 50 | random }} =>  Some random number

ΔΡΟΜΟΙ :

Όπως και στις γλώσσες προγραμματισμού, έχουμε βρόχους στο Ansible Jinja2.

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

Παράδειγμα 1:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

Μπορείτε επίσης να συνδυάσετε τον βρόχο for με προτάσεις if-else για να φιλτράρετε και να λάβετε ορισμένες τιμές.

Παράδειγμα 2:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

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