Dieser Artikel beschreibt die verschiedenen Teile eines Ansible-Playbooks, beginnend mit einem sehr breiten Überblick darüber, was Ansible ist und wie Sie es verwenden können. Ansible ist eine Möglichkeit, eine leicht lesbare YAML-Syntax zu verwenden, um Playbooks zu schreiben, die Aufgaben für Sie automatisieren können. Diese Playbooks können sehr einfach bis sehr komplex sein und ein Playbook kann sogar in ein anderes eingebettet sein.
Installation von httpd mit einem Playbook
Nachdem Sie nun über dieses Grundwissen verfügen, schauen wir uns ein grundlegendes Playbook an, das den httpd installiert Paket. Ich habe eine Inventardatei mit zwei angegebenen Hosts und habe sie im Web abgelegt Gruppe:
[root@ansible test]# cat inventory
[web]
ansibleclient.usersys.redhat.com
ansibleclient2.usersys.redhat.com
Schauen wir uns das eigentliche Playbook an, um zu sehen, was es enthält:
[root@ansible test]# cat httpd.yml
---
- name: this playbook will install httpd
hosts: web
tasks:
- name: this is the task to install httpd
yum:
name: httpd
state: latest
Wenn Sie dies aufschlüsseln, sehen Sie, dass die erste Zeile im Playbook ---
ist . Dadurch wissen Sie, dass dies der Anfang des Playbooks ist. Als nächstes gab ich dem Stück einen Namen. Dies ist nur ein einfaches Playbook mit nur einem Play, aber ein komplexeres Playbook kann mehrere Plays enthalten. Als Nächstes gebe ich die Hosts an, auf die ich abzielen möchte. In diesem Fall wähle ich das Web aus Gruppe, aber ich hätte auch ansibleclient.usersys.redhat.com angeben können oder ansibleclient2.usersys.redhat.com stattdessen, wenn ich nicht auf beide Systeme abzielen wollte. Die nächste Zeile teilt Ansible mit, dass Sie sich mit den Aufgaben befassen werden, die die eigentliche Arbeit erledigen. In diesem Fall hat mein Playbook nur eine Aufgabe, aber Sie können mehrere Aufgaben haben, wenn Sie möchten. Hier gebe ich an, dass ich den httpd installieren werde Paket. Die nächste Zeile sagt, dass ich das yum verwenden werde Modul. Ich sage ihm dann den Namen des Pakets, httpd , und dass ich möchte, dass die neueste Version installiert wird.
[ Leser mochten auch: Erste Schritte mit Ansible ]
Wenn ich die httpd.yml
ausführe Playbook zweimal, bekomme ich das auf dem Terminal:
[root@ansible test]# ansible-playbook httpd.yml
PLAY [this playbook will install httpd] ************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [ansibleclient.usersys.redhat.com]
ok: [ansibleclient2.usersys.redhat.com]
TASK [this is the task to install httpd] ***********************************************************************************************************
changed: [ansibleclient2.usersys.redhat.com]
changed: [ansibleclient.usersys.redhat.com]
PLAY RECAP *****************************************************************************************************************************************
ansibleclient.usersys.redhat.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansibleclient2.usersys.redhat.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible test]# ansible-playbook httpd.yml
PLAY [this playbook will install httpd] ************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [ansibleclient.usersys.redhat.com]
ok: [ansibleclient2.usersys.redhat.com]
TASK [this is the task to install httpd] ***********************************************************************************************************
ok: [ansibleclient.usersys.redhat.com]
ok: [ansibleclient2.usersys.redhat.com]
PLAY RECAP *****************************************************************************************************************************************
ansibleclient.usersys.redhat.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansibleclient2.usersys.redhat.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible test]#
Beachten Sie, dass ich in beiden Fällen ein ok=2 erhalten habe , aber im zweiten Durchlauf des Playbooks wurde nichts geändert. Die neueste Version von httpd war zu diesem Zeitpunkt bereits installiert.
Um Informationen über die verschiedenen Module zu erhalten, die Sie in einem Playbook verwenden können, können Sie das ansible-doc
verwenden Befehl. Zum Beispiel:
[root@ansible test]# ansible-doc yum
> YUM (/usr/lib/python3.6/site-packages/ansible/modules/packaging/os/yum.py)
Installs, upgrade, downgrades, removes, and lists packages and groups with the `yum' package manager. This module only works on Python 2. If you require Python 3 support, see the [dnf] module.
* This module is maintained by The Ansible Core Team
* note: This module has a corresponding action plugin.
< output truncated >
Es ist schön, ein Playbook zu haben, das httpd installiert , aber um es flexibler zu gestalten, können Sie Variablen verwenden, anstatt das Paket als httpd fest zu codieren . Dazu könnten Sie ein Playbook wie dieses verwenden:
[root@ansible test]# cat httpd.yml
---
- name: this playbook will install {{ myrpm }}
hosts: web
vars:
myrpm: httpd
tasks:
- name: this is the task to install {{ myrpm }}
yum:
name: "{{ myrpm }}"
state: latest
Hier können Sie sehen, dass ich einen Abschnitt namens "vars" hinzugefügt und eine Variable myrpm deklariert habe mit dem Wert httpd . Dann kann ich diese myrpm verwenden Variable im Playbook und passe sie an das an, was ich installieren möchte. Da ich außerdem das zu installierende RPM mithilfe einer Variablen angegeben habe, kann ich überschreiben, was ich in das Playbook geschrieben habe, indem ich die Variable in der Befehlszeile mit -e
spezifiziere :
[root@ansible test]# cat httpd.yml
---
- name: this playbook will install {{ myrpm }}
hosts: web
vars:
myrpm: httpd
tasks:
- name: this is the task to install {{ myrpm }}
yum:
name: "{{ myrpm }}"
state: latest
[root@ansible test]# ansible-playbook httpd.yml -e "myrpm=at"
PLAY [this playbook will install at] ***************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [ansibleclient.usersys.redhat.com]
ok: [ansibleclient2.usersys.redhat.com]
TASK [this is the task to install at] **************************************************************************************************************
changed: [ansibleclient2.usersys.redhat.com]
changed: [ansibleclient.usersys.redhat.com]
PLAY RECAP *****************************************************************************************************************************************
ansibleclient.usersys.redhat.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansibleclient2.usersys.redhat.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible test]#
Eine andere Möglichkeit, die Aufgaben dynamischer zu gestalten, ist die Verwendung von Schleifen . In diesem Snippet können Sie sehen, dass ich rpms deklariert habe als Liste, um mailx zu haben und postfix . Um sie zu verwenden, verwende ich loop
in meiner Aufgabe:
vars:
rpms:
- mailx
- postfix
tasks:
- name: this will install the rpms
yum:
name: "{{ item }}"
state: installed
loop: "{{ rpms }}"
Sie haben vielleicht bemerkt, dass bei der Wiedergabe dieser Stücke Fakten über die Gastgeber gesammelt werden:
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [ansibleclient.usersys.redhat.com]
ok: [ansibleclient2.usersys.redhat.com]
Diese Fakten können als Variablen verwendet werden, wenn Sie das Spiel ausführen. Sie könnten zum Beispiel eine motd.yml
haben Datei, die Inhalte wie folgt festlegt:
“This is the system {{ ansible_facts['fqdn'] }}.
This is a {{ ansible_facts['distribution'] }} version {{ ansible_facts['distribution_version'] }} system.”
Für jedes System, auf dem Sie dieses Playbook ausführen, werden der korrekte vollqualifizierte Domänenname (FQDN), die Betriebssystemverteilung und die Verteilungsversion festgelegt, auch ohne dass Sie diese Variablen manuell definieren.
[ Brauchen Sie mehr zu Ansible? Nehmen Sie an einem kostenlosen technischen Überblickskurs von Red Hat teil. Ansible Essentials:Einfachheit in der Automatisierung Technischer Überblick. ]
Abschluss
Dies war eine kurze Einführung in das Aussehen von Ansible-Playbooks, was die verschiedenen Teile tun und wie Sie weitere Informationen zu den Modulen erhalten. Weitere Informationen finden Sie in der Ansible-Dokumentation.