Sobes.tech
Middle

Ποια είναι η ιεραρχία των μεταβλητών στους διάφορους ρόλους του DevOps;

sobes.tech AI

Απάντηση από AI

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

Η ιεραρχία (από το χαμηλότερο στο υψηλότερο):

  1. Προεπιλεγμένος ρόλος (Role defaults): Μεταβλητές που ορίζονται στο defaults/main.yml μέσα στον ρόλο. Έχουν την χαμηλότερη προτεραιότητα, προορίζονται για την ορισμό προεπιλεγμένων τιμών, που μπορούν εύκολα να αντικατασταθούν.
  2. Μεταβλητές στον φάκελο του ρόλου (Role vars): Μεταβλητές που ορίζονται στο vars/main.yml μέσα στον ρόλο. Έχουν υψηλότερη προτεραιότητα από τις προεπιλεγμένες μεταβλητές του ρόλου.
  3. Μεταβλητές από το inventory (Inventory variables):
    • Παγκόσμιες μεταβλητές inventory (group_vars/all / host_vars/all ή στο κύριο αρχείο του inventory).
    • Μεταβλητές ομάδας inventory (group_vars/<όνομα_ομάδας>). Η προτεραιότητα εξαρτάται από τη σειρά των ομάδων στο inventory και το playbook, αλλά συνήθως οι ομάδες με βαθύτερη εμβάθυνση ή αυτές που ορίζονται αργότερα έχουν υψηλότερη προτεραιότητα.
    • Μεταβλητές host inventory (host_vars/<όνομα_host> ή στο κύριο αρχείο του inventory). Έχουν υψηλότερη προτεραιότητα από τις μεταβλητές ομάδας.
  4. Μεταβλητές από το play (Play variables): Μεταβλητές που ορίζονται απευθείας στη ενότητα vars του playbook.
  5. Μεταβλητές από το play_hosts (Play vars_files): Μεταβλητές που φορτώνονται μέσω vars_files. Η σειρά τους καθορίζει την προτεραιότητα.
  6. Μεταβλητές από τα facts (Facts): Μεταβλητές που συλλέγονται μετά την εκτέλεση του module gather_facts. Έχουν υψηλή προτεραιότητα, καθώς αντιπροσωπεύουν την τρέχουσα κατάσταση του συστήματος.
  7. Μεταβλητές από τις καταχωρημένες εργασίες (Task variables): Μεταβλητές που ορίζονται μέσω register μετά την εκτέλεση μιας εργασίας. Έχουν υψηλή προτεραιότητα, διατίθενται μόνο στο τρέχον playbook μετά την εκτέλεση της εργασίας.
  8. Μεταβλητές γραμμής εντολών (Command line variables): Μεταβλητές που περνιούνται με τη χρήση της σημαίας -e ή --extra-vars κατά την εκτέλεση του ansible-playbook. Έχουν την υψηλότερη προτεραιότητα και αντικαθιστούν όλες τις άλλες μεταβλητές.

Παράδειγμα playbook με μεταβλητές:

---
# main.yml playbook
- hosts: webservers
  vars:
    global_var: "παγκόσμια_τιμή_από_play" # Μεταβλητή playbook (προτεραιότητα 4)
  roles:
    - webservers # Ρόλος με defaults/main.yml και vars/main.yml (προτεραιότητα 1 και 2)
  tasks:
    - name: Εκτύπωση μεταβλητής
      debug:
        msg: "Η τιμή της μεταβλητής είναι: {{ my_variable }}"
      vars: # Μεταβλητή εργασίας (προτεραιότητα 7)
        my_variable: "ειδική_τιμή_εργασίας"

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

# inventory
[webservers]
webserver1 ansible_host=192.168.1.10 # Μεταβλητή host (προτεραιότητα 3)

[all:vars]
my_variable="τιμή_όλων_του_inventory" # Παγκόσμια μεταβλητή inventory (προτεραιότητα 3)

Παράδειγμα defaults για ρόλο:

# roles/webservers/defaults/main.yml
---
my_variable: "προεπιλεγμένη_τιμή_από_ρόλο" # Μεταβλητή defaults ρόλου (προτεραιότητα 1)

Παράδειγμα vars για ρόλο:

# roles/webservers/vars/main.yml
---
my_variable: "τιμή_από_vars_ρόλου" # Μεταβλητή vars ρόλου (προτεραιότητα 2)

Όταν εκτελείτε το ansible-playbook -i inventory main.yml -e "my_variable=extra_vars_value":

  1. Θα χρησιμοποιηθεί η τιμή από το -e: extra_vars_value (προτεραιότητα 8).
  2. Αν το -e δεν υπάρχει, αλλά υπάρχει μεταβλητή εργασίας, θα χρησιμοποιηθεί αυτή: task_specific_value (προτεραιότητα 7).
  3. Αν δεν υπάρχει μεταβλητή εργασίας και το -e, θα χρησιμοποιηθεί το fact (αν ισχύει).
  4. Στη συνέχεια, η μεταβλητή του play: global_value_from_play (προτεραιότητα 4).
  5. Στη συνέχεια, η μεταβλητή host από το inventory: ansible_host=192.168.1.10 (προτεραιότητα 3).
  6. Στη συνέχεια, η μεταβλητή ομάδας από το inventory (group_vars ή στο inventory).
  7. Στη συνέχεια, η παγκόσμια μεταβλητή inventory: inventory_all_value (προτεραιότητα 3).
  8. Στη συνέχεια, η μεταβλητή vars του ρόλου: vars_value_from_role (προτεραιότητα 2).
  9. Τέλος, η μεταβλητή defaults του ρόλου: default_value_from_role (προτεραιότητα 1).

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