Auswahl von Hosts mit Basis- und Wildcard-Mustern
In diesem Schritt lernen Sie die Grundlagen der gezielten Ansprache spezifischer Hosts in Ihrer Ansible-Automatisierung. Der Kern davon ist die Ansible-Inventardatei, die die von Ihnen verwalteten Server auflistet, und die hosts
-Direktive in einem Playbook, die angibt, gegen welche dieser Server eine Reihe von Tasks ausgeführt werden soll. Wir beginnen mit der Installation von Ansible, der Erstellung eines grundlegenden Inventars und Playbooks und untersuchen dann, wie Hosts mithilfe von Gruppennamen und Wildcard-Mustern ausgewählt werden.
Zuerst stellen wir sicher, dass Ansible in Ihrer Umgebung installiert ist. Ansible ist nicht standardmäßig installiert, daher müssen Sie es mit dem DNF-Paketmanager installieren. Das Paket ansible-core
stellt die wesentlichen Ansible-Befehlszeilentools bereit, einschließlich ansible-playbook
. Führen Sie den folgenden Befehl aus:
sudo dnf install -y ansible-core
Sie sollten eine Ausgabe ähnlich dieser sehen:
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
Als Nächstes erstellen wir ein dediziertes Verzeichnis für diese Übung, um unsere Dateien organisiert zu halten. Alle nachfolgenden Aktionen in diesem Schritt finden innerhalb dieses neuen Verzeichnisses statt:
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
Erstellen Sie nun eine Inventardatei. Ein Inventar ist eine Textdatei, die die Hosts und Host-Gruppen definiert, auf denen Ansible-Befehle, Module und Tasks ausgeführt werden. Wir verwenden das INI-Format aufgrund seiner Einfachheit.
Verwenden Sie den nano
-Editor, um eine Datei namens inventory
zu erstellen:
nano inventory
Fügen Sie den folgenden Inhalt in die Datei inventory
ein. Dies definiert zwei Gruppen, webservers
und dbservers
, die jeweils zwei Hosts enthalten:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
Speichern Sie die Datei und beenden Sie nano
, indem Sie Strg+X
, dann Y
und Enter
drücken.
Mit unserem vorbereiteten Inventar erstellen wir nun ein einfaches Playbook. Dieses Playbook verwendet das Modul ansible.builtin.debug
, um eine Nachricht auszugeben und zu bestätigen, auf welchem Host der Task ausgeführt wird. Dies ist eine großartige Möglichkeit, Host-Muster zu testen, ohne tatsächliche Änderungen am System vorzunehmen.
Erstellen Sie eine neue Datei namens playbook.yml
:
nano playbook.yml
Fügen Sie den folgenden YAML-Inhalt hinzu. Anfangs zielt es auf alle Hosts in der Gruppe webservers
ab:
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Speichern und beenden Sie den Editor. Führen Sie nun das Playbook mit ansible-playbook
aus. Das Flag -i
gibt unsere benutzerdefinierte Inventardatei an:
ansible-playbook playbook.yml -i inventory
Die Ausgabe sollte wie folgt aussehen:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Wie Sie sehen können, wurden nur die Hosts aus der Gruppe webservers
angesprochen. Ändern wir nun das Playbook, um einen Wildcard (*
) zu verwenden. Wildcards ermöglichen eine flexiblere Mustererkennung.
Bearbeiten Sie playbook.yml
und ändern Sie die Zeile hosts
zu hosts: "*.lab.net"
. Denken Sie daran, Muster, die Wildcards enthalten, in Anführungszeichen zu setzen:
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Führen Sie das Playbook erneut aus:
ansible-playbook playbook.yml -i inventory
Sie sollten eine Ausgabe ähnlich dieser sehen:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Dieses Mal wurde das Play nur auf Hosts ausgeführt, deren Namen auf .lab.net
enden. Lassen Sie uns schließlich das spezielle Schlüsselwort all
verwenden, um jeden im Inventar definierten Host anzusprechen.
Bearbeiten Sie playbook.yml
ein letztes Mal und ändern Sie die Zeile hosts
zu hosts: all
:
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Führen Sie das Playbook aus, um das Ergebnis zu sehen:
ansible-playbook playbook.yml -i inventory
Die Ausgabe zeigt, dass alle Hosts angesprochen werden:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Das Playbook wird nun auf allen vier Hosts aus Ihrem Inventar ausgeführt und demonstriert die Leistungsfähigkeit des all
-Musters.