Alcuni giorni fa abbiamo discusso di come configurare un lab Ansible a tre nodi utilizzando Vagrant in Linux. In questo articolo, impareremo in dettaglio i concetti fondamentali di Ansible come l'inventario Ansible e i file di configurazione.
Struttura di base di Ansible
Quando inizi a lavorare con ansible, ci sono due file importanti che dovresti conoscere. Uno è Inventario Ansible e il secondo è la Configurazione Ansible file.
La configurazione contiene tutte le configurazioni che ansible utilizzerà durante il runtime. Quando installi ansible utilizzando il gestore pacchetti del sistema operativo, puoi vedere che esiste un file di configurazione predefinito chiamato "ansible.cfg
" creato in /etc/ansible
directory.
Il file di inventario contiene l'indirizzo IP o le informazioni DNS sull'elenco di host gestiti con cui vogliamo lavorare. Ansible leggerà i nomi host dal file di inventario e le attività/le riproduzioni verranno eseguite su quei nodi. I file di inventario possono essere creati in ini
, yaml
e json
formati.
Di seguito la struttura del mio progetto. Ho un ansible.cfg
file di configurazione, un file hosts e un playbook scritto in yaml
formato.
Quando attivo il playbook, ansible leggerà la configurazione da ansible.cfg
file e i dettagli dell'host dal file hosts per eseguire le riproduzioni.
[email protected]:~/ansible_project$ tree . . ├── ansible.cfg ├── hosts └── playbook.yml 0 directories, 3 files
Parliamo in dettaglio di questi due file e finalmente eseguiremo alcuni comandi ad hoc.
File di configurazione Ansible
Ansible utilizza il file di configurazione per caricare i parametri necessari per eseguire l'attività ansible. Se hai installato ansible utilizzando il gestore di pacchetti , avrai un ansible.cfg
file in /etc/ansible
directory.
Di seguito è riportato l'esempio di ansible.cfg
file.
Ansible cercherà il file di configurazione nel seguente ordine.
ANSIBLE_CONFIG
- variabile d'ambienteansible.cfg
- Directory corrente da cui stai eseguendo il comando.ansible.cfg
- Directory principale degli utenti/etc/ansible/ansible.cfg
- In/etc/ansible
directory
Esegui ansible --version
comando per vedere quale file di configurazione sta selezionando ansible.
$ ansible --version ansible [core 2.12.3] config file = /home/vagrant/ansible_project/ansible.cfg configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible ansible collection location = /home/vagrant/.ansible/collections:/usr/share/ansible/collections executable location = /usr/local/bin/ansible python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0] jinja version = 2.10.1 libyaml = True
Ho creato una directory di progetto personalizzata e creato un ansible.cfg
file. Il mio file di configurazione contiene solo due proprietà, la posizione dell'inventario e il controllo della chiave host disabilitato.
[defaults] inventory = /home/karthick/ansible_project/hosts host_key_checking = False
Ci sono un sacco di altre proprietà, ma al momento puoi iniziare a usarle aggiungendo solo la proprietà "inventario".
File di inventario Ansible
Nel file di inventario, forniremo l'indirizzo IP o il DNS di nomi di server, dispositivi di rete, servizi cloud o qualsiasi cosa con cui ansible può lavorare.
Gli inventari possono essere scritti in ini
, json
e yaml
formato e hai anche script per convertire un formato di inventario in altri formati.
Per impostazione predefinita, puoi trovare un file di inventario (host) in /etc/ansible
directory se hai installato ansible utilizzando il gestore di pacchetti del sistema operativo. Si consiglia sempre di creare una directory di progetto separata e creare un inventario e un file di configurazione.
La tabella seguente rappresenta come è impostato il mio laboratorio ansible. Creerò il file di inventario per questa configurazione del lab ed eseguirò il modulo ping per dimostrare come funzionano le cose nel file di inventario.
TIPO DI NODO | NOME DEL NODO | INDIRIZZO IP | OS FLAVOUR |
Nodo di controllo | controller.anslab.com | 192.168.10.3 | ubuntu/focal64 |
Nodo gestito | managed1.anslab.com | 192.168.10.4 | ubuntu/focal64 |
Nodo gestito | managed2.anslab.com | 192.168.10.5 | ubuntu/focal64 |
File di inventario senza raggruppamento esplicito
Il file di inventario ha un concetto chiamato raggruppamento in cui raggrupperai le tue risorse ed eseguirai attività su quel gruppo. Sarà nella seguente struttura.
[group-name] Resource1 Resource2 .... Resource N
È possibile creare il file di inventario senza utilizzare i gruppi. In questo caso, Ansible utilizzerà due gruppi predefiniti "tutti" e "separato" .
- TUTTO IL GRUPPO - Tutte le risorse disponibili nel file di inventario per impostazione predefinita verranno assegnate a tutti i gruppi .
- NON GRUPPI - Le risorse che non fanno parte di alcun gruppo definito dall'utente verranno automaticamente assegnate al gruppo non raggruppato .
Ho creato un file di inventario senza alcun gruppo. Ora, questi due nodi rientreranno in tutti i gruppi e nel gruppo non raggruppato.
$ cat hosts
managed1.anslab.com
managed2.anslab.com
Puoi eseguire il seguente comando ansible per controllare l'elenco degli host in tutti e gruppi non raggruppati.
$ ansible all --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
$ ansible ungrouped --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
File di inventario con raggruppamento
Come predetto, il raggruppamento è un ottimo modo per organizzare le tue risorse, quindi sarà facile per te eseguire l'attività rispetto al gruppo specifico. Ho due nodi gestiti e eseguono Ubuntu 20.04LTS.
Diciamo che voglio raggruppare il mio file di inventario in base al tipo di sistema operativo, quindi il file di inventario apparirà come di seguito. Qui ubuntu è il nome del gruppo.
[ubuntu]
managed1.anslab.com
managed2.anslab.com
Le attività possono essere eseguite su questo gruppo.
$ ansible ubuntu -m ping -o managed1.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} managed2.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
Se controllo ora il gruppo "non raggruppato", non ci sarà nessun host.
$ ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
Puoi creare tutti i gruppi che desideri nel file di inventario e utilizzare gli stessi nomi di risorse.
[ubuntu] managed1.anslab.com managed2.anslab.com [dev] managed1.anslab.com [test] managed2.anslab.com
$ ansible ubuntu -m ping -o $ ansible dev -m ping -o $ ansible test -m ping -o
File di inventario con intervalli
Quando hai un modello di denominazione comune per le tue risorse, puoi usare gli intervalli. Dai un'occhiata all'esempio seguente in cui invece di ripetere il DNS ho usato l'intervallo per accorciarlo.
[ubuntu]
managed[1:2].anslab.com
File di inventario con gruppi figlio
Puoi creare un gruppo e utilizzare altri nomi di gruppo sotto di esso. Dai un'occhiata all'esempio seguente, ho il gruppo Ubuntu che ha i nomi dei miei server. Ho creato un altro gruppo denominato server che contiene il gruppo Ubuntu.
È importante aggiungere :bambini al nome del gruppo, altrimenti il gruppo di server tratterà "ubuntu " come nome del server invece del nome del gruppo.
[ubuntu] managed[1:2].anslab.com [server:children] ubuntu
File di inventario con variabili host e variabili di gruppo
Il file di inventario supporta le variabili host e di gruppo. Le variabili host non sono altro che variabili e i loro valori passati all'host nel file di inventario. Nella configurazione seguente sto dicendo ansible di usare otechnix come mio utente e invece di usare la porta ssh standard, usa la porta 2222 .
[ubuntu]
managed1.anslab.com ansible_user=ostechnix ansible_port=2222
managed2.anslab.com ansible_user=ostechnix ansible_port=2222
Group vars è uguale a host vars ma le variabili verranno applicate all'intero gruppo anziché a un singolo host. Puoi vedere dalla configurazione sopra, ansible_user e ansible_port è lo stesso per entrambi i nodi. Quindi puoi creare un gruppo var in cui le variabili verranno ereditate da tutti i nodi del gruppo. Devi aggiungere :vars per rendere il gruppo come gruppo vars.
[ubuntu] managed1.anslab.com managed2.anslab.com [ubuntu:vars] ansible_user=ostechnix ansible_port=2222
Avviso: Quando hai sia group var che host var per lo stesso nodo, host var ha la precedenza elevata.
Esistono molti parametri di inventario che puoi utilizzare e puoi ottenere l'elenco dal documento ufficiale .
File di inventario con alias
Puoi creare un alias per la risorsa come di seguito. Qui m1 e m2 sono alias.
[ubuntu] m1 ansible_host=managed1.anslab.com m2 ansible_host=managed2.anslab.com
Ora questo alias può essere utilizzato per eseguire alcune attività.
$ ansible m1 -m ping -o m1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} $ ansible m2 -m ping -o m2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
File di inventario in formato YAML
I file di inventario possono anche essere scritti in formato YAML. Tutto ciò di cui abbiamo discusso nelle sezioni precedenti è scritto in formato YAML.
L'immagine seguente rappresenta due nodi con un paio di variabili host.
L'immagine sotto rappresenta due nodi con variabili di gruppo.
Comando Ansible Inventory
Ansible ha un comando di inventario che sarà molto utile per visualizzare le informazioni sui file di inventario.
Per ottenere l'elenco delle opzioni supportate, esegui il comando help.
$ ansible-inventory --help
Per ottenere i dettagli dell'inventario in formato grafico, utilizza --graph
bandiera. Se disponi di file di inventario diversi, puoi utilizzare -i
flag per puntare esplicitamente al file di inventario.
$ ansible-inventory --graph
Puoi stampare le informazioni sulla var dell'host e del gruppo passando --vars
flag insieme a --graph
bandiera.
$ ansible-inventory --graph --vars
Quando usi --list
flag, l'output sarà in formato JSON.
$ ansible-inventory -list
Puoi ottenere informazioni su un particolare nodo usando --host
bandiera.
$ ansible-inventory --host managed1.anslab.com
Conclusione
In questo articolo, abbiamo visto un concetto importante che costituisce il nucleo dell'architettura ansible. Se sei un principiante, concentrati sulla creazione dell'inventario con il formato ini e in futuro imparerai di più sulle migliori pratiche quando inizierai a lavorare su progetti di produzione.
Leggi il prossimo:
- Autenticazione SSH Ansible ed escalation dei privilegi
- Iniziare con i comandi ad hoc Ansible