Vor ein paar Tagen haben wir besprochen, wie man mit Vagrant ein Ansible-Lab mit drei Knoten einrichtet unter Linux. In diesem Artikel lernen wir grundlegende Ansible-Konzepte wie Ansible-Inventar und Konfigurationsdateien im Detail kennen.
Grundstruktur von Ansible
Wenn Sie anfangen, mit Ansible zu arbeiten, gibt es zwei wichtige Dateien, die Sie verstehen sollten. Eine davon ist Ansible Inventory Datei und die zweite ist die Ansible-Konfiguration Datei.
Die Konfiguration enthält alle Konfigurationen, die Ansible während der Laufzeit verwendet. Wenn Sie Ansible mit dem Paketmanager des Betriebssystems installieren, können Sie sehen, dass es eine Standardkonfigurationsdatei mit dem Namen "ansible.cfg
" gibt " erstellt in /etc/ansible
Verzeichnis.
Die Inventardatei enthält die IP-Adresse oder DNS-Informationen über die Liste der verwalteten Hosts, mit denen wir arbeiten möchten. Ansible liest die Hostnamen aus der Inventardatei und die Aufgaben/Spiele werden auf diesen Knoten ausgeführt. Inventardateien können in ini
erstellt werden , yaml
und json
Formate.
Unten ist die Struktur meines Projekts. Ich habe eine ansible.cfg
Konfigurationsdatei, eine hosts-Datei und ein Playbook, das in yaml
geschrieben ist formatieren.
Wenn ich das Playbook auslöse, liest Ansible die Konfiguration aus ansible.cfg
Datei und die Host-Details aus der Hosts-Datei, um die Stücke auszuführen.
[email protected]:~/ansible_project$ tree . . ├── ansible.cfg ├── hosts └── playbook.yml 0 directories, 3 files
Lassen Sie uns im Detail über diese beiden Dateien sprechen und wir werden schließlich einige Ad-hoc-Befehle ausführen.
Ansible-Konfigurationsdatei
Ansible verwendet die Konfigurationsdatei, um die Parameter zu laden, die zum Ausführen der Ansible-Aufgabe erforderlich sind. Wenn Sie Ansible mit dem Paketmanager installiert haben , haben Sie eine ansible.cfg
Datei in /etc/ansible
Verzeichnis.
Unten ist das Beispiel der ansible.cfg
Datei.
Ansible sucht in der folgenden Reihenfolge nach der Konfigurationsdatei.
ANSIBLE_CONFIG
- Umgebungsvariableansible.cfg
- Aktuelles Verzeichnis, von dem aus Sie den Befehl ausführen.ansible.cfg
- Benutzer-Home-Verzeichnis/etc/ansible/ansible.cfg
- In/etc/ansible
Verzeichnis
Führen Sie ansible --version
aus Befehl, um zu sehen, welche Konfigurationsdatei Ansible auswählt.
$ ansible --version ansible [core 2.12.3] config file = /home/vagrant/ansible_project/ansible.cfg configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible ansible collection location = /home/vagrant/.ansible/collections:/usr/share/ansible/collections executable location = /usr/local/bin/ansible python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0] jinja version = 2.10.1 libyaml = True
Ich habe ein benutzerdefiniertes Projektverzeichnis erstellt und eine ansible.cfg
erstellt Datei. Meine Konfigurationsdatei enthält nur zwei Eigenschaften, den Inventarspeicherort und die deaktivierte Überprüfung des Hostschlüssels.
[defaults] inventory = /home/karthick/ansible_project/hosts host_key_checking = False
Es gibt unzählige andere Eigenschaften, aber im Moment können Sie damit beginnen, sie zu verwenden, indem Sie nur die "Inventar"-Eigenschaft hinzufügen.
Ansible-Inventardatei
In der Inventardatei geben wir die IP-Adresse oder DNS von Servernamen, Netzwerkgeräten, Cloud-Diensten oder allem, womit Ansible arbeiten kann, an.
Inventare können in ini
geschrieben werden , json
und yaml
Format und Sie haben auch Skripte, um ein Inventarformat in andere Formate zu konvertieren.
Standardmäßig finden Sie eine Inventardatei (Hosts) in /etc/ansible
Verzeichnis, wenn Sie Ansible mit dem OS-Paketmanager installiert haben. Es wird immer empfohlen, ein separates Projektverzeichnis anzulegen und eine Inventar- und Konfigurationsdatei anzulegen.
Die folgende Tabelle zeigt, wie mein Ansible-Labor eingerichtet ist. Ich werde die Inventardatei für dieses Lab-Setup erstellen und das Ping-Modul ausführen, um zu demonstrieren, wie die Dinge in der Inventardatei funktionieren.
KNOTENTYP | KNOTENNAME | IP-ADRESSE | OS-GESCHMACK |
Kontrollknoten | controller.anslab.com | 192.168.10.3 | ubuntu/focal64 |
Verwalteter Knoten | managed1.anslab.com | 192.168.10.4 | ubuntu/focal64 |
Verwalteter Knoten | managed2.anslab.com | 192.168.10.5 | ubuntu/focal64 |
Inventardatei ohne explizite Gruppierung
Die Inventardatei hat ein Konzept namens Gruppierung, bei dem Sie Ihre Ressourcen gruppieren und Aufgaben für diese Gruppe ausführen. Es hat die folgende Struktur.
[group-name] Resource1 Resource2 .... Resource N
Sie können die Inventardatei erstellen, ohne Gruppen zu verwenden. In diesem Fall verwendet Ansible zwei Standardgruppen "all" und "nicht gruppiert" .
- ALLE GRUPPE - Alle Ressourcen, die standardmäßig in der Inventardatei verfügbar sind, werden der Gruppe alle zugewiesen .
- GRUPPE AUFHEBEN - Ressourcen, die keiner benutzerdefinierten Gruppe angehören, werden automatisch der ungruppierten Gruppe zugewiesen .
Ich habe eine Inventardatei ohne Gruppen erstellt. Jetzt werden diese beiden Knoten sowohl unter alle Gruppen als auch unter die nicht gruppierte Gruppe fallen.
$ cat hosts
managed1.anslab.com
managed2.anslab.com
Sie können den folgenden ansible-Befehl ausführen, um die Liste der Hosts unter allen und der nicht gruppierten Gruppe zu überprüfen.
$ ansible all --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
$ ansible ungrouped --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
Inventardatei mit Gruppierung
Wie bereits erwähnt, ist die Gruppierung eine großartige Möglichkeit, Ihre Ressourcen zu organisieren, damit Sie die Aufgabe einfach für die jeweilige Gruppe ausführen können. Ich habe zwei verwaltete Knoten und sie führen Ubuntu 20.04LTS aus.
Angenommen, ich möchte meine Inventardatei basierend auf dem Betriebssystemtyp gruppieren, dann sieht die Inventardatei wie folgt aus. Hier ubuntu ist der Gruppenname.
[ubuntu]
managed1.anslab.com
managed2.anslab.com
Aufgaben können gegen diese Gruppe ausgeführt werden.
$ ansible ubuntu -m ping -o managed1.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} managed2.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
Wenn ich jetzt nach der "nicht gruppierten" Gruppe suche, wird kein Host dort sein.
$ ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
Sie können beliebig viele Gruppen in der Inventardatei erstellen und dieselben Ressourcennamen verwenden.
[ubuntu] managed1.anslab.com managed2.anslab.com [dev] managed1.anslab.com [test] managed2.anslab.com
$ ansible ubuntu -m ping -o $ ansible dev -m ping -o $ ansible test -m ping -o
Inventardatei mit Bereichen
Wenn Sie ein gemeinsames Benennungsmuster für Ihre Ressourcen haben, können Sie Bereiche verwenden. Schauen Sie sich das folgende Beispiel an, in dem ich statt der Wiederholung des DNS den Bereich verwendet habe, um ihn zu verkürzen.
[ubuntu]
managed[1:2].anslab.com
Inventardatei mit untergeordneten Gruppen
Sie können eine Gruppe erstellen und andere Gruppennamen darunter verwenden. Schauen Sie sich das folgende Beispiel an, ich habe die Ubuntu-Gruppe, die meine Servernamen hat. Ich habe eine andere Gruppe namens Server erstellt, die die Ubuntu-Gruppe enthält.
Es ist wichtig, dass Sie :children hinzufügen an den Gruppennamen andernfalls behandelt die Servergruppe "ubuntu " als Servername anstelle des Gruppennamens.
[ubuntu] managed[1:2].anslab.com [server:children] ubuntu
Inventardatei mit Host-Variablen und Gruppen-Variablen
Die Inventardatei unterstützt Host- und Gruppenvariablen. Host-Variablen sind nichts anderes als Variablen und ihre Werte, die in der Inventardatei an den Host übergeben werden. In der folgenden Konfiguration sage ich ansible, dass es ostechnix verwenden soll als mein Benutzer und verwenden Sie anstelle des Standard-SSH-Ports Port 2222 .
[ubuntu]
managed1.anslab.com ansible_user=ostechnix ansible_port=2222
managed2.anslab.com ansible_user=ostechnix ansible_port=2222
Gruppen-Variablen sind dieselben wie Host-Variablen, aber die Variablen werden auf die gesamte Gruppe anstatt auf einen einzelnen Host angewendet. Sie können aus der obigen Konfiguration ersehen, dass ansible_user und ansible_port für beide Knoten gleich sind. Sie können also eine Gruppenvariable erstellen, in der die Variablen von allen Knoten in der Gruppe geerbt werden. Sie müssen :vars hinzufügen um die Gruppe als Gruppenvariable zu erstellen.
[ubuntu] managed1.anslab.com managed2.anslab.com [ubuntu:vars] ansible_user=ostechnix ansible_port=2222
Vorsicht: Wenn Sie sowohl eine Gruppenvariable als auch eine Hostvariable für denselben Knoten haben, hat die Hostvariable hohe Priorität.
Es gibt viele Inventarparameter, die Sie verwenden können, und Sie können die Liste aus dem offiziellen Dokument abrufen .
Inventardatei mit Alias
Sie können einen Alias für die Ressource wie unten erstellen. Hier sind m1 und m2 Aliase.
[ubuntu] m1 ansible_host=managed1.anslab.com m2 ansible_host=managed2.anslab.com
Jetzt kann dieser Alias verwendet werden, um einige Aufgaben auszuführen.
$ ansible m1 -m ping -o m1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} $ ansible m2 -m ping -o m2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
Inventardatei im YAML-Format
Inventardateien können auch im YAML-Format geschrieben werden. Alles, was wir in den vorherigen Abschnitten besprochen haben, ist im YAML-Format geschrieben.
Das folgende Bild zeigt zwei Knoten mit einigen Host-Variablen.
Das folgende Bild zeigt zwei Knoten mit Gruppenvariablen.
Ansible Inventory-Befehl
Ansible hat einen Inventory-Befehl, der sehr hilfreich sein wird, um die Informationen der Inventory-Dateien anzuzeigen.
Um die Liste der unterstützten Optionen zu erhalten, führen Sie den Befehl help aus.
$ ansible-inventory --help
Um die Bestandsdetails im Diagrammformat abzurufen, verwenden Sie --graph
Flagge. Wenn Sie unterschiedliche Inventardateien haben, können Sie -i
verwenden Flag, um explizit auf die Inventardatei zu verweisen.
$ ansible-inventory --graph
Sie können die Host- und Gruppen-Variableninformationen drucken, indem Sie --vars
übergeben Flag zusammen mit --graph
Flagge.
$ ansible-inventory --graph --vars
Wenn Sie die --list
verwenden Flag, erfolgt die Ausgabe im JSON-Format.
$ ansible-inventory -list
Sie können Informationen über einen bestimmten Knoten mit --host
abrufen Flagge.
$ ansible-inventory --host managed1.anslab.com
Schlussfolgerung
In diesem Artikel haben wir ein wichtiges Konzept gesehen, das den Kern der Ansible-Architektur bildet. Wenn Sie ein Anfänger sind, konzentrieren Sie sich darauf, das Inventar im INI-Format zu erstellen, und später werden Sie mehr über Best Practices erfahren, wenn Sie mit der Arbeit an Produktionsprojekten beginnen.
Weiterlesen:
- Ansible SSH-Authentifizierung und Rechteausweitung
- Erste Schritte mit Ansible Ad-Hoc-Befehlen