Nozioni di base su Ansible¶
In questo capitolo imparerai come lavorare con Ansible.
Obiettivi: In questo capitolo imparerai come:
Implementare Ansible;
Applicare modifiche alla configurazione su un server;
Creare i primi playbook Ansible;
ansible, moduli, playbook
Conoscenza:
Complessità:
Tempo di lettura: 30 minuti
Ansible centralizza e automatizza i compiti di amministrazione. È:
- agentless (non richiede implementazioni specifiche sui client),
- idempotent (stesso effetto ogni volta che viene eseguito).
Utilizza il protocollo SSH per configurare in remoto i client Linux o il protocollo WinRM per funzionare con i client Windows. Se nessuno di questi protocolli è disponibile, è sempre possibile per Ansible utilizzare un'API, che rende Ansible un vero coltellino svizzero per la configurazione di server, postazioni di lavoro, servizi docker, attrezzature di rete, ecc. (Quasi tutto in realtà).
Attenzione
L'apertura di flussi SSH o WinRM a tutti i client dal server Ansible lo rende un elemento critico dell'architettura che deve essere attentamente monitorato.
Poiché Ansible è principalmente basato su push, non manterrà lo stato dei suoi server tra le sue esecuzioni. Al contrario, eseguirà nuovi controlli di stato ogni volta che viene eseguito. Si dice che sia senza stato.
Ti aiuterà con:
- fornitura (distribuzione di una nuova VM),
- distribuzione di applicazioni
- gestione della configurazione,
- automazione
- orchestrazione (quando è in uso più di 1 destinazione).
Nota
Ansible è stato originariamente scritto da Michael DeHaan, il fondatore di altri strumenti come Cobbler.
La prima versione è stata la 0.0.1, rilasciata il 9 marzo 2012.
Il 17 ottobre 2015, AnsibleWorks (la società dietro Ansible) è stata acquisita da Red Hat per 150 milioni di dollari.
Per offrire un'interfaccia grafica al tuo uso quotidiano di Ansible, puoi installare alcuni strumenti come Ansible Tower (RedHat), che non è gratuito, la sua controparte opensource Awx, o possono anche essere utilizzati altri progetti come Jenkins e l'eccellente Rundeck.
In astratto
Per seguire questa formazione, avrai bisogno di almeno 2 server con Rocky8:
- il primo sarà la macchina di gestione, Ansible sarà installato su di esso.
- il secondo sarà il server da configurare e gestire (un altro Linux diverso da Rocky Linux andrà altrettanto bene).
Negli esempi seguenti, la stazione di amministrazione ha l'indirizzo IP 172.16.1.10, la stazione gestita 172.16.1.11. Sta a voi adattare gli esempi in base al vostro piano di indirizzamento IP.
Il vocabolario Ansible¶
- La macchina di gestione: la macchina su cui è installato Ansible. Dal momento che Ansible è agentless, nessun software viene distribuito sui server gestiti.
- I nodi gestiti: i dispositivi di destinazione che Ansible gestisce sono anche chiamati "host" Possono essere server, dispositivi di rete o qualsiasi altro computer.
- L'inventory: un file contenente informazioni sui server gestiti.
- I tasks: un task è un blocco che definisce una procedura da eseguire (ad esempio, creare un utente o un gruppo, installare un pacchetto software, ecc.).
- Un module: un modulo astrae un compito. Esistono molti moduli forniti da Ansible.
- I playbook: un semplice file in formato yaml che definisce i server di destinazione e i compiti da eseguire.
- Un role: un role consente di organizzare i playbook e tutti gli altri file necessari (modelli, script, ecc.) per facilitare la condivisione e il riutilizzo del codice.
- Una collection: una collezione comprende un insieme logico di playbook, ruoli, moduli e plugin.
- I facts: sono variabili globali che contengono informazioni sul sistema (nome della macchina, versione del sistema, interfaccia di rete e configurazione, ecc.).
- Gli handler: sono utilizzati per causare l'arresto o il riavvio di un servizio in caso di modifica.
Installazione sul server di gestione¶
Ansible è disponibile nel repository EPEL, ma a volte può essere datato per la versione corrente e si desidera lavorare con una versione più recente.
Prenderemo quindi in considerazione due tipi di installazione:
- quella basata sui repository EPEL
- una basata sul gestore di pacchetti python
pip
L'EPEL è necessario per entrambe le versioni, quindi potete procedere all'installazione:
- Installazione di EPEL:
sudo dnf install epel-release
Installazione da EPEL¶
Se installiamo Ansible da EPEL, possiamo fare quanto segue:
sudo dnf install ansible
Successivamente, verificare l'installazione:
$ ansible --version
ansible [core 2.14.2]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/rocky/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.11/site-packages/ansible ansible collection location = /home/rocky/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.11.2 (main, Jun 22 2023, 04:35:24) [GCC 8.5.0 20210514
(Red Hat 8.5.0-18)] (/usr/bin/python3.11)
jinja version = 3.1.2
libyaml = True
$ python3 --version
Python 3.6.8
Si noti che ansible viene fornito con una propria versione di python, diversa da quella di sistema (qui 3.11.2 contro 3.6.8). È necessario considerarlo quando si installano con pip i moduli python necessari per l'installazione (ad esempio pip3.11 install PyVMomi
).
Installazione da python pip¶
Poiché vogliamo usare una versione più recente di Ansible, la installeremo da python3-pip
:
Nota
Rimuovere Ansible se è stato installato in precedenza da EPEL.
In questa fase, possiamo scegliere di installare ansible con la versione di python che desideriamo.
sudo dnf install python38 python38-pip python38-wheel python3-argcomplete rust cargo curl
Nota
`python3-argcomplete' è fornito da EPEL. Installare epel-release se non è ancora stato fatto. Questo pacchetto vi aiuterà a completare i comandi di Ansible.
Ora possiamo installare Ansible:
pip3.8 install --user ansible
activate-global-python-argcomplete --user
Controllare la versione di Ansible:
$ ansible --version
ansible [core 2.13.11]
config file = None
configured module search path = ['/home/rocky/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/rocky/.local/lib/python3.8/site-packages/ansible
ansible collection location = /home/rocky/.ansible/collections:/usr/share/ansible/collections
executable location = /home/rocky/.local/bin/ansible
python version = 3.8.16 (default, Jun 25 2023, 05:53:51) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)]
jinja version = 3.1.2
libyaml = True
Nota
La versione installata manualmente nel nostro caso è più vecchia della versione pacchettizzata da RPM perché abbiamo usato una versione precedente di python. Questa osservazione varia con il tempo, l'età della distribuzione e la versione di python.
File di configurazione¶
La configurazione del server si trova in /etc/ansible
.
I file di configurazione principali sono due:
- Il file di configurazione principale
ansible.cfg
dove risiedono i comandi, i moduli, i plugin e la configurazione ssh; - Il file di inventario della gestione dei computer client
hosts
in cui sono dichiarati i client e i gruppi di client.
Il file di configurazione viene creato automaticamente se Ansible è stato installato con il suo pacchetto RPM. Con un'installazione pip
, questo file non esiste. Dovremo crearlo a mano con il comando ansible-config
:
$ ansible-config -h
usage: ansible-config [-h] [--version] [-v] {list,dump,view,init} ...
Visualizzare la configurazione di ansibile.
argomenti di posizione:
{list,dump,view,init}
list Stampa tutte le opzioni di configurazione
dump Configurazione Dump
view Visualizza i file di configurazione
init Crea configurazione iniziale
Esempio:
ansible-config init --disabled > /etc/ansible/ansible.cfg
L'opzione --disabled
consente di commentare l'insieme delle opzioni anteponendo ad esse il prefisso ;
.
Nota
Si può anche scegliere di incorporare la configurazione di Ansible nel proprio repository di codice, con Ansible che carica i file di configurazione che trova nel seguente ordine (elaborando il primo file che incontra e ignorando gli altri):
- se la variabile d'ambiente
$ANSIBLE_CONFIG
è impostata, carica il file specificato. ansible.cfg
se esiste nella directory corrente.~/.ansible.cfg
se esiste (nella home directory dell'utente).
Se non viene trovato nessuno di questi tre file, viene caricato il file predefinito.
Il file di inventario /etc/ansible/hosts
¶
Poiché Ansible dovrà lavorare con tutte le macchine configurate, è essenziale fornirgli uno (o più) file di inventario ben strutturati che corrispondano perfettamente alla vostra organizzazione.
A volte è necessario riflettere attentamente su come costruire questo file.
Andare al file di inventario predefinito, che si trova in /etc/ansible/hosts
. Vengono forniti alcuni esempi commentati:
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character
# - Blank lines are ignored
# - Groups of hosts are delimited by [header] elements
# - You can enter hostnames or ip addresses
# - A hostname/ip can be a member of multiple groups
# Ex 1: Ungrouped hosts, specify before any group headers:
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group:
## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110
# If you have multiple hosts following a pattern, you can specify
# them like this:
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group:
## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Here's another example of host ranges, this time there are no
# leading 0s:
## db-[99:101]-node.example.com
Come si può notare, il file fornito come esempio utilizza il formato INI, ben noto agli amministratori di sistema. Si noti che è possibile scegliere un altro formato di file (come yaml, per esempio), ma per i primi test il formato INI si adatta bene ai nostri prossimi esempi.
L'inventario può essere generato automaticamente in produzione, soprattutto se si dispone di un ambiente di virtualizzazione come VMware VSphere o di un ambiente cloud (Aws, OpenStack o altro).
- Creare un gruppo di host in
/etc/ansible/hosts
:
Come avrete notato, i gruppi sono dichiarati tra parentesi quadre. Poi vengono gli elementi che appartengono ai gruppi. Si può creare, ad esempio, un gruppo rocky8
inserendo il seguente blocco nel file:
[rocky8]
172.16.1.10
172.16.1.11
I gruppi possono essere utilizzati all'interno di altri gruppi. In questo caso, occorre specificare che il gruppo padre è composto da sottogruppi con l'attributo :children
, come in questo caso:
[linux:children]
rocky8
debian9
[ansible:children]
ansible_management
ansible_clients
[ansible_management]
172.16.1.10
[ansible_clients]
172.16.1.10
Non ci dilungheremo oltre sull'inventario, ma se siete interessati, valutate la possibilità di consultare questo link.
Ora che il nostro server di gestione è installato e il nostro inventario è pronto, è il momento di eseguire i nostri primi comandi ansible
.
utilizzo della riga di comando ansibile
¶
Il comando ansible
lancia un task su uno o più host di destinazione.
ansible <host-pattern> [-m module_name] [-a args] [options]
Esempi:
Attenzione
Dal momento che non abbiamo ancora configurato l'autenticazione sui nostri 2 server di test, non tutti gli esempi seguenti funzioneranno. Sono forniti come esempi per facilitare la comprensione e saranno completamente funzionanti più avanti in questo capitolo.
- Elenca gli host appartenenti al gruppo rocky8:
ansible rocky8 --list-hosts
- Eseguire il ping di un gruppo di host con il modulo
ping
:
ansible rocky8 -m ping
- Visualizzare i fatti di un gruppo di host con il modulo
setup
:
ansible rocky8 -m setup
- Eseguire un comando su un gruppo di host invocando il modulo
command
con degli argomenti:
ansible rocky8 -m command -a 'uptime'
- Eseguire un comando con privilegi di amministratore:
ansible ansible_clients --become -m command -a 'reboot'
- Eseguire un comando utilizzando un file di inventario personalizzato:
ansible rocky8 -i ./local-inventory -m command -a 'date'
Nota
Come in questo esempio, a volte è più semplice separare la dichiarazione dei dispositivi gestiti in diversi file (ad esempio per progetto cloud) e fornire ad Ansible il percorso di questi file, piuttosto che mantenere un lungo file di inventario.
Opzione | Informazione |
---|---|
-a 'arguments' |
Gli argomenti da passare al modulo. |
-b -K |
Richiede una password ed esegue il comando con privilegi superiori. |
--user=username |
Utilizza questo utente per connettersi all'host di destinazione invece dell'utente corrente. |
--become-user=username |
Esegue l'operazione come questo utente (predefinito: root ). |
-C |
Simulazione. Non apporta alcuna modifica all'obiettivo, ma lo prova per vedere cosa dovrebbe essere modificato. |
-m module |
Esegue il modulo chiamato |
Preparazione del client¶
Sia sulla macchina di gestione che sui client, creeremo un utente ansible
dedicato alle operazioni eseguite da Ansible. Questo utente dovrà utilizzare i diritti di sudo, quindi dovrà essere aggiunto al gruppo wheel
.
Questo utente servirà:
- Sul lato della stazione di amministrazione: per eseguire comandi
ansible
e SSH ai client gestiti. - Sulle stazioni gestite (qui il server che funge da stazione di amministrazione funge anche da client, quindi è gestito da solo) per eseguire i comandi lanciati dalla stazione di amministrazione: deve quindi avere i diritti sudo.
Su entrambe le macchine, creare un utente ansible
, dedicato ad ansible:
sudo useradd ansible
sudo usermod -aG wheel ansible
Impostare una password per questo utente:
sudo passwd ansible
Modificare la configurazione di sudoers per consentire ai membri del gruppo wheel
di eseguire sudo senza password:
sudo visudo
Il nostro obiettivo è commentare l'opzione predefinita e decommentare l'opzione NOPASSWD, in modo che queste righe abbiano l'aspetto seguente:
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
Attenzione
Se si riceve il seguente messaggio di errore quando si inseriscono i comandi di Ansible, probabilmente significa che si è dimenticato questo passaggio su uno dei client:
"msg": " Missing sudo password"
Quando si utilizza la gestione da questo momento in poi, si inizia a lavorare con questo nuovo utente:
sudo su - ansible
Verifica con il modulo ping¶
Per impostazione predefinita, il login con password non è consentito da Ansible.
Togliere il commento alla seguente riga dalla sezione [defaults]
del file di configurazione /etc/ansible/ansible.cfg
e impostarla su True:
ask_pass = True
Eseguire un ping
su ogni server del gruppo rocky8:
# ansible rocky8 -m ping
SSH password:
172.16.1.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.1.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Nota
Viene richiesta la password ansible
dei server remoti, il che rappresenta un problema di sicurezza...
Suggerimento
Se si ottiene questo errore "msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"
, è sufficiente installare sshpass
sulla stazione di gestione:
$ sudo dnf install sshpass
In astratto
Ora puoi testare i comandi che non hanno funzionato in precedenza in questo capitolo.
Autenticazione con chiave¶
L'autenticazione tramite password sarà sostituita da un'autenticazione a chiave privata/pubblica molto più sicura.
Creazione di una chiave SSH¶
La doppia chiave sarà generata con il comando ssh-keygen
sulla stazione di gestione dall'utente ansible
:
[ansible]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Oa1d2hYzzdO0e/K10XPad25TA1nrSVRPIuS4fnmKr9g ansible@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
| .o . +|
| o . =.|
| . . + +|
| o . = =.|
| S o = B.o|
| = + = =+|
| . + = o+B|
| o + o *@|
| . Eoo .+B|
+----[SHA256]-----+
La chiave pubblica può essere copiata sui server:
# ssh-copy-id ansible@172.16.1.10
# ssh-copy-id ansible@172.16.1.11
Ricommentare la seguente riga dalla sezione [defaults]
del file di configurazione /etc/ansible/ansible.cfg
per impedire l'autenticazione tramite password:
#ask_pass = True
Test di autenticazione con chiave privata¶
Per il prossimo test, viene utilizzato il modulo shell
, che consente l'esecuzione di comandi remoti:
# ansible rocky8 -m shell -a "uptime"
172.16.1.10 | SUCCESS | rc=0 >>
12:36:18 up 57 min, 1 user, load average: 0.00, 0.00, 0.00
172.16.1.11 | SUCCESS | rc=0 >>
12:37:07 up 57 min, 1 user, load average: 0.00, 0.00, 0.00
Non è richiesta alcuna password, l'autenticazione a chiave privata/pubblica funziona!
Nota
Nell'ambiente di produzione, si dovrebbero ora rimuovere le password ansible
precedentemente impostate per rafforzare la sicurezza (poiché ora non è necessaria una password di autenticazione).
Usare Ansible¶
Ansible può essere utilizzato dalla shell o tramite playbook.
I moduli¶
L'elenco dei moduli classificati per categoria può essere trovato qui. Ansible ne offre più di 750!
I moduli sono ora raggruppati in raccolte di moduli, il cui elenco può essere trovato qui.
Le collezioni sono un formato di distribuzione per i contenuti di Ansible che possono includere playbook, ruoli, moduli e plugin.
Un modulo viene invocato con l'opzione -m
del comando ansible
:
ansible <host-pattern> [-m module_name] [-a args] [options]
C'è un modulo per quasi tutte le necessità! Si consiglia quindi, invece di utilizzare il modulo shell, di cercare un modulo adatto alle esigenze.
Ogni categoria di esigenze ha un proprio modulo. Ecco un elenco non esaustivo:
Tipo | Esempi |
---|---|
Gestione Sistema | user (gestione utenti), group (gestione gruppi), ecc. |
Gestione del software | dnf ,yum , apt , pip , npm |
Gestione file | copy , fetch , lineinfile , template , archive |
Gestione database | mysql , postgresql , redis |
Gestione cloud | amazon S3 , cloudstack , openstack |
Gestione cluster | consul , zookeeper |
Invia comandi | shell , script , expect |
Downloads | get_url |
Gestione sorgenti | git , gitlab |
Esempio di installazione software¶
Il modulo dnf
consente di installare il software sui client di destinazione:
# ansible rocky8 --become -m dnf -a name="httpd"
172.16.1.10 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
...
\n\nComplete!\n"
]
}
172.16.1.11 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
...
\n\nComplete!\n"
]
}
Essendo il software installato un servizio, è necessario avviarlo con il modulo systemd
:
# ansible rocky8 --become -m systemd -a "name=httpd state=started"
172.16.1.10 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "started"
}
172.16.1.11 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "started"
}
Suggerimento
Provate a lanciare gli ultimi due comandi due volte. Si noterà che la prima volta Ansible intraprenderà delle azioni per raggiungere lo stato impostato dal comando. La seconda volta, non farà nulla perché avrà rilevato che lo stato è già stato raggiunto!
Esercizi¶
Per scoprire di più su Ansible e per abituarsi a consultare la documentazione di Ansible, ecco alcuni esercizi da fare prima di proseguire:
- Creare i gruppi Parigi, Tokio, NewYork
- Creare l'utente
supervisor
- Cambiare l'utente per avere un uid di 10000
- Cambia l'utente in modo che appartenga al gruppo Parigi
- Installare il software ad albero
- Ferma il servizio di crond
- Creare un file vuoto con i permessi
0644
- Aggiorna la distribuzione del client
- Riavvia il tuo client
Attenzione
Non utilizzare il modulo shell. Cercate nella documentazione i moduli appropriati!
modulo setup
: introduzione ai fatti¶
I fatti di sistema sono variabili recuperate da Ansible tramite il suo modulo setup
.
Date un'occhiata ai diversi fatti dei vostri client per avere un'idea della quantità di informazioni che possono essere facilmente recuperate con un semplice comando.
Vedremo più tardi come utilizzare i fatti nei nostri playbook e come creare i nostri fatti.
# ansible ansible_clients -m setup | less
192.168.1.11 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.1.11"
],
"ansible_all_ipv6_addresses": [
"2001:861:3dc3:fcf0:a00:27ff:fef7:28be",
"fe80::a00:27ff:fef7:28be"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "12/01/2006",
"ansible_bios_vendor": "innotek GmbH",
"ansible_bios_version": "VirtualBox",
"ansible_board_asset_tag": "NA",
"ansible_board_name": "VirtualBox",
"ansible_board_serial": "NA",
"ansible_board_vendor": "Oracle Corporation",
...
Ora che abbiamo visto come configurare un server remoto con Ansible dalla riga di comando, saremo in grado di introdurre la nozione di playbook. I playbook sono un altro modo di utilizzare Ansible, non molto più complesso, ma che renderà più facile il riutilizzo del codice.
Playbooks¶
I playbook di Ansible descrivono una politica da applicare ai sistemi remoti, per forzarne la configurazione. I playbook sono scritti in un formato di testo facilmente comprensibile che raggruppa un insieme di attività: il formato yaml
.
Nota
Ulteriori informazioni su yaml qui
ansible-playbook <file.yml> ... [options]
Le opzioni sono identiche al comando ansible
.
Il comando restituisce i seguenti codici di errore:
Codice | Errore |
---|---|
0 |
OK o nessun host corrispondente |
1 |
Errore |
2 |
Uno o più host hanno fallito |
3 |
Uno o più host sono irraggiungibili |
4 |
Analizzare errore |
5 |
Opzioni errate o incomplete |
99 |
Esecuzione interrotta dall'utente |
250 |
Errore inaspettato |
Nota
Si noti che ansible
restituirà Ok quando nessun host corrisponde al target, il che potrebbe trarre in inganno!
Esempio di playbook Apache e MySQL¶
Il seguente playbook ci permetterà di installare Apache e MariaDB sui nostri server di destinazione.
Crea un file test.yml
con il seguente contenuto:
---
- hosts: rocky8 <1>
become: true <2>
become_user: root
tasks:
- name: ensure apache is at the latest version
dnf: name=httpd,php,php-mysqli state=latest
- name: ensure httpd is started
systemd: name=httpd state=started
- name: ensure mariadb is at the latest version
dnf: name=mariadb-server state=latest
- name: ensure mariadb is started
systemd: name=mariadb state=started
...
- <1> Il gruppo o il server in questione devono esistere nell'inventario
- <2> Una volta connesso, l'utente diventa
root
(tramitesudo
per impostazione predefinita)
L'esecuzione del playbook avviene con il comando ansible-playbook
:
$ ansible-playbook test.yml
PLAY [rocky8] ****************************************************************
TASK [setup] ******************************************************************
ok: [172.16.1.10]
ok: [172.16.1.11]
TASK [ensure apache is at the latest version] *********************************
ok: [172.16.1.10]
ok: [172.16.1.11]
TASK [ensure httpd is started] ************************************************
changed: [172.16.1.10]
changed: [172.16.1.11]
TASK [ensure mariadb is at the latest version] **********************************
changed: [172.16.1.10]
changed: [172.16.1.11]
TASK [ensure mariadb is started] ***********************************************
changed: [172.16.1.10]
changed: [172.16.1.11]
PLAY RECAP *********************************************************************
172.16.1.10 : ok=5 changed=3 unreachable=0 failed=0
172.16.1.11 : ok=5 changed=3 unreachable=0 failed=0
Per una maggiore leggibilità, è consigliabile scrivere i playbook in formato yaml completo. Nell'esempio precedente, gli argomenti sono indicati sulla stessa riga del modulo, con il valore dell'argomento che segue il suo nome separato da un =
. Guardate lo stesso playbook in yaml completo:
---
- hosts: rocky8
become: true
become_user: root
tasks:
- name: ensure apache is at the latest version
dnf:
name: httpd,php,php-mysqli
state: latest
- name: ensure httpd is started
systemd:
name: httpd
state: started
- name: ensure mariadb is at the latest version
dnf:
name: mariadb-server
state: latest
- name: ensure mariadb is started
systemd:
name: mariadb
state: started
...
Suggerimento
dnf
è uno dei moduli che permette di fornire un elenco come argomento.
Nota sulle collezioni: Ansible ora fornisce moduli sotto forma di collezioni. Alcuni moduli sono forniti di default nella collezione ansible.builtin
, altri devono essere installati manualmente tramite il:
ansible-galaxy collection install [collectionname]
dove [collectionname] è il nome dell'insieme (le parentesi quadre servono a evidenziare la necessità di sostituirlo con il nome effettivo dell'insieme e NON fanno parte del comando).
L'esempio precedente dovrebbe essere scritto come segue:
---
- hosts: rocky8
become: true
become_user: root
tasks:
- name: ensure apache is at the latest version
ansible.builtin.dnf:
name: httpd,php,php-mysqli
state: latest
- name: ensure httpd is started
ansible.builtin.systemd:
name: httpd
state: started
- name: ensure mariadb is at the latest version
ansible.builtin.dnf:
name: mariadb-server
state: latest
- name: ensure mariadb is started
ansible.builtin.systemd:
name: mariadb
state: started
...
Un playbook non è limitato a un obiettivo:
---
- hosts: webservers
become: true
become_user: root
tasks:
- name: ensure apache is at the latest version
ansible.builtin.dnf:
name: httpd,php,php-mysqli
state: latest
- name: ensure httpd is started
ansible.builtin.systemd:
name: httpd
state: started
- hosts: databases
become: true
become_user: root
- name: ensure mariadb is at the latest version
ansible.builtin.dnf:
name: mariadb-server
state: latest
- name: ensure mariadb is started
ansible.builtin.systemd:
name: mariadb
state: started
...
Puoi controllare la sintassi del tuo playbook:
ansible-playbook --syntax-check play.yml
È anche possibile utilizzare un "linter" per yaml:
dnf install -y yamllint
quindi controllare la sintassi yaml dei tuoi playbook:
$ yamllint test.yml
test.yml
8:1 error syntax error: could not find expected ':' (syntax)
Risultati degli esercizi¶
- Creare i gruppi Parigi, Tokio, NewYork
- Creare l'utente
supervisor
- Cambiare l'utente per avere un uid di 10000
- Cambiare l'utente in modo che appartenga al gruppo Parigi
- Installare l'albero del software
- Fermare il servizio crond
- Creare un file vuoto con i permessi
0644
- Aggiornare la distribuzione del client
- Riavviare il tuo client
ansible ansible_clients --become -m group -a "name=Paris"
ansible ansible_clients --become -m group -a "name=Tokio"
ansible ansible_clients --become -m group -a "name=NewYork"
ansible ansible_clients --become -m user -a "name=Supervisor"
ansible ansible_clients --become -m user -a "name=Supervisor uid=10000"
ansible ansible_clients --become -m user -a "name=Supervisor uid=10000 groups=Paris"
ansible ansible_clients --become -m dnf -a "name=tree"
ansible ansible_clients --become -m systemd -a "name=crond state=stopped"
ansible ansible_clients --become -m copy -a "content='' dest=/tmp/test force=no mode=0644"
ansible ansible_clients --become -m dnf -a "name=* state=latest"
ansible ansible_clients --become -m reboot
Author: Antoine Le Morvan
Contributors: Steven Spencer, tianci li, Aditya Putta, Ganna Zhyrnova