ITA - Ansible - Un Breve Riepilogo
September 2023 (750 Words, 5 Minutes)
Introduzione
Ansible è un software open source che consente di automatizzare le procedure di configurazione e gestione di sistemi unix-like e Windows.
Quello che segue è un post che cerca di riassumere il più possibile il funzionamento di ansible, un analisi approfondita non è in programma, per informazioni approfondite fare riferimento alla documentazione ufficiale.
Concetti Base
Ansible sfrutta due tipi di host:
- Managed nodes: sono gli host da controllare e configurare
- Control nodes: sono le macchine che contengono le ricette.
- Inventory: lista degli host gestiti
- Playbooks: sono un insieme di Plays
- Plays: sono l’oggetto che mette in relazione gli hosts e gli altri elementi del playbook
- Roles: un sottoinsieme di contenuti (tasks, handlers, variabili, plugins, templates e files)
- Tasks: definizione di un azione che deve essere applicata su un sistema gestito
- Handlers: un task speciale che viene eseguito solo quando un altro task viene eseguito.
- Modules: sono binari o scripts copiati sui nodi gestiti durante l’esecuzione di ansible.
- Plugins: sono componenti software che controllano come il nodo di controllo si connette e interagisce con i nodi gestiti.
- Collections: un modo per distribuire vari componenti, per esempio playbooks, roles, modules e plugins.
- AAP (Ansible Automation Platform): questo è un contenitore per prodotti di livello enterprise, come: ansible-core, awx, galaxyNG.
Il master si collega ai nodi usando il protocollo SSH; in generale le caratteristiche sono:
- Minimale. Per funzionare non è necessario che sui nodi sia installato un agent;
- Sicuro. Ansible non utilizza agenti sui nodi ma è richiesto solo il server OpenSSH;
- Affidabile. Se scritto con attenzione, un Playbook può essere in grado di gestire anche situazioni inaspettate sui nodi;
- Semplice. i Playbook sono scritti in YAML,
Installazione
Nonostante ansible sia disponibile nei repositori ufficiali di molte distribuzioni:
- opensuse:
$ sudo zypper in ansible
- debian:
$ sudo apt install ansible
La documentazione propone di installarlo usando pip:
$ pip install --user ansible
Vedere ansible installation guide
Ansible
Inventory
L’inventory è l’elenco degli host gestiti, di default è il file /etc/ansible/hosts
, per esempio:
[myvirtualmachines]
192.0.2.50
192.0.2.51
192.0.2.52
Oppure possono essere files yaml:
virtualmachines:
hosts:
vm01:
ansible_host: 192.0.2.50
vm02:
ansible_host: 192.0.2.51
vm03:
ansible_host: 192.0.2.52
Per conoscere l’elenco dei nodi configurati si può usare:
$ ansible all --list-hosts
Per testare la connettività:
$ ansible all -m ping
l’output dovrebbe essere:
192.0.2.50 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
192.0.2.51 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
192.0.2.52 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Un inventory può essere passato da linea di comando ad ansible:
$ ansible all -m ping -i inventory.yaml
Creare un Inventory
Creando un Inventory è buona norma:
- nomi dei gruppi univoci
- non usare spazi, caratteri speciali, non iniziare i nomi con numeri
- raggruppare gli hosts sulla base : Cosa, Dove, Quando
Metagruppi
Una buona pratica è quella di usare i metagruppi:
metagroupname:
children:
Usare variabili
Una altra buona pratica è quella di usare variabili nei gruppi:
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
vars:
ansible_user: my_server_user
Ansible Playbook
Esempio semplice, creiamo il file playbook.yaml
- name: My first play
hosts: virtualmachines
tasks:
- name: Ping my hosts
ansible.builtin.ping:
- name: Print message
ansible.builtin.debug:
msg: Hello world
E lo si può eseguire:
$ ansible-playbook -i inventory.yaml playbook.yaml
Struttura di esempio per un playbook:
production # inventory file for production servers
staging # inventory file for staging environment
group_vars/
group1.yml # here we assign variables to particular groups
group2.yml
host_vars/
hostname1.yml # here we assign variables to particular systems
hostname2.yml
library/ # if any custom modules, put them here (optional)
module_utils/ # if any custom module_utils to support modules, put them here (optional)
filter_plugins/ # if any custom filter plugins, put them here (optional)
site.yml # master playbook
webservers.yml # playbook for webserver tier
dbservers.yml # playbook for dbserver tier
roles/
common/ # this hierarchy represents a "role"
tasks/ #
main.yml # <-- tasks file can include smaller files if warranted
handlers/ #
main.yml # <-- handlers file
templates/ # <-- files for use with the template resource
ntp.conf.j2 # <------- templates end in .j2
files/ #
bar.txt # <-- files for use with the copy resource
foo.sh # <-- script files for use with the script resource
vars/ #
main.yml # <-- variables associated with this role
defaults/ #
main.yml # <-- default lower priority variables for this role
meta/ #
main.yml # <-- role dependencies
library/ # roles can also include custom modules
module_utils/ # roles can also include custom module_utils
lookup_plugins/ # or other types of plugins, like lookup in this case
webtier/ # same kind of structure as "common" was above, done for the webtier role
monitoring/ # ""
fooapp/ # ""
Riferimenti
- Wikipedia : Ansible
- ansible.com
- ansible doc
- ansible getting started
- ansible playbook guide
- ansible installation guide
- ansible basic concepts
- ansible get started inventory
- ansible get started playbook
- esempi ufficiali
- playbooks best practices
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale Theme Moonwalk