Questo articolo descrive le diverse parti di un playbook Ansible iniziando con una panoramica molto ampia di cosa sia Ansible e come puoi usarlo. Ansible è un modo per utilizzare la sintassi YAML di facile lettura per scrivere playbook che possono automatizzare le attività per te. Questi playbook possono variare da molto semplici a molto complessi e un playbook può anche essere incorporato in un altro.
Installazione di httpd con un playbook
Ora che hai le conoscenze di base, diamo un'occhiata a un playbook di base che installerà httpd pacchetto. Ho un file di inventario con due host specificati e li ho inseriti nel Web gruppo:
[root@ansible test]# cat inventory
[web]
ansibleclient.usersys.redhat.com
ansibleclient2.usersys.redhat.com
Diamo un'occhiata al playbook effettivo per vedere cosa contiene:
[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
Analizzando questo, vedrai che la prima riga nel playbook è ---
. Questo ti consente di sapere che è l'inizio del playbook. Successivamente, ho dato un nome alla commedia. Questo è solo un semplice playbook con una sola riproduzione, ma un playbook più complesso può contenere più riproduzioni. Successivamente, specifico gli host a cui voglio indirizzare. In questo caso, sto selezionando il web gruppo, ma avrei potuto specificare ansibleclient.usersys.redhat.com o ansibleclient2.usersys.redhat.com invece se non volessi prendere di mira entrambi i sistemi. La riga successiva dice ad Ansible che ti occuperai delle attività che svolgono il lavoro vero e proprio. In questo caso, il mio playbook ha solo un'attività, ma puoi avere più attività se lo desideri. Qui specifico che installerò il httpd pacchetto. La riga successiva dice che userò yum modulo. Quindi gli dico il nome del pacchetto, httpd e che voglio che sia installata l'ultima versione.
[ Ai lettori è piaciuto anche: Iniziare con Ansible ]
Quando eseguo httpd.yml
playbook due volte, ricevo questo sul terminale:
[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]#
Tieni presente che in entrambi i casi ho ricevuto un ok=2 , ma nella seconda esecuzione del playbook non è stato modificato nulla. L'ultima versione di httpd era già installato a quel punto.
Per ottenere informazioni sui vari moduli che puoi utilizzare in un playbook, puoi utilizzare il ansible-doc
comando. Ad esempio:
[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 >
È bello avere un playbook che installa httpd , ma per renderlo più flessibile, puoi utilizzare le variabili invece di codificare il pacchetto come httpd . Per farlo, puoi utilizzare un playbook come questo:
[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
Qui puoi vedere che ho aggiunto una sezione chiamata "vars" e ho dichiarato una variabile myrpm con il valore di httpd . Quindi posso usare quel myrpm variabile nel playbook e adattarlo a ciò che voglio installare. Inoltre, poiché ho specificato l'RPM da installare utilizzando una variabile, posso sovrascrivere ciò che ho scritto nel playbook specificando la variabile sulla riga di comando usando -e
:
[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]#
Un altro modo per rendere le attività più dinamiche è utilizzare loop . In questo frammento puoi vedere che ho dichiarato rpm come elenco per avere mailx e postfisso . Per usarli, utilizzo loop
nel mio compito:
vars:
rpms:
- mailx
- postfix
tasks:
- name: this will install the rpms
yum:
name: "{{ item }}"
state: installed
loop: "{{ rpms }}"
Potresti aver notato che quando vengono eseguite queste riproduzioni, vengono raccolti i dati sugli host:
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [ansibleclient.usersys.redhat.com]
ok: [ansibleclient2.usersys.redhat.com]
Questi fatti possono essere usati come variabili quando esegui il gioco. Ad esempio, potresti avere un motd.yml
file che imposta contenuti come:
“This is the system {{ ansible_facts['fqdn'] }}.
This is a {{ ansible_facts['distribution'] }} version {{ ansible_facts['distribution_version'] }} system.”
Per qualsiasi sistema in cui esegui quel playbook, verrebbero impostati il nome di dominio completo (FQDN), la distribuzione del sistema operativo e la versione della distribuzione corretti, anche senza definire manualmente tali variabili.
[ Hai bisogno di più su Ansible? Partecipa a un corso di panoramica tecnica gratuito di Red Hat. Ansible Essentials:Semplicità nell'automazione Panoramica tecnica. ]
Concludi
Questa è stata una rapida introduzione all'aspetto dei playbook Ansible, a cosa fanno le diverse parti e a come ottenere maggiori informazioni sui moduli. Ulteriori informazioni sono disponibili nella documentazione di Ansible.