Come lavorare con variabili e fatti Ansible - Parte 8
Abbiamo menzionato le variabili in questa serie Ansible e solo per rinfrescarti un po' la mente. Una variabile, proprio come in molti linguaggi di programmazione, è essenzialmente una chiave che rappresenta un valore.
Cosa costituisce un nome di variabile valido?
Un nome di variabile include lettere, numeri, trattini bassi o un mix di 2 o tutti questi. Tieni però presente che il nome di una variabile deve sempre iniziare con una lettera e non deve contenere spazi.
Diamo un'occhiata ad alcuni esempi di nomi di variabili validi e non accettabili:
Esempi di nomi di variabili validi:
football
foot_ball
football20
foot_ball20
Esempi di nomi di variabili non validi:
foot ball
20
foot-ball
Parliamo dei tipi di variabili:
1. Variabili del playbook
Le variabili Playbook sono abbastanza semplici e dirette. Per definire una variabile in un playbook, utilizza semplicemente la parola chiave vars prima di scrivere le variabili con rientro.
Per accedere al valore della variabile, inserirla tra le doppie parentesi graffe racchiuse tra virgolette.
Ecco un semplice esempio di playbook:
- hosts: all
vars:
greeting: Hello world!
tasks:
- name: Ansible Basic Variable Example
debug:
msg: "{{ greeting }}"
Nel playbook riportato sopra, la variabile saluto viene sostituita dal valore Hello world! quando viene eseguito il playbook. Il playbook stampa semplicemente il messaggio Hello world! quando viene eseguito.
Inoltre, puoi avere un elenco o un array di variabili come mostrato:
Il playbook riportato di seguito mostra una variabile denominata continenti. La variabile contiene 5 valori diversi: nomi di continenti. È possibile accedere facilmente a ciascuno di questi valori utilizzando l'indice 0 come prima variabile.
L'esempio del playbook riportato di seguito recupera e visualizza Asia (indice 1).
- hosts: all
vars:
continents:
- Africa
- Asia
- South America
- North America
- Europe
tasks:
- name: Ansible List variable Example
debug:
msg: "{{ continents [1] }}"
L'elenco delle variabili può essere strutturato in modo simile come mostrato:
vars:
Continents: [Africa, Asia, South America, North America, Europe]
Per elencare tutti gli elementi dell'elenco, utilizza il modulo with_items. Questo eseguirà il loop di tutti i valori nell'array.
- hosts: all
vars:
continents: [Africa, Asia, South America, North America, Europe]
tasks:
- name: Ansible array variables example
debug:
msg: "{{ item }}"
with_items:
- "{{ continents }}"
Un altro tipo di variabile Ansible è la variabile dizionario.
Le variabili del dizionario sono inoltre supportate nel playbook. Per definire la variabile del dizionario, identifica semplicemente la coppia chiave-valore appena sotto il nome della variabile del dizionario.
hosts: switch_f01
vars:
http_port: 8080
default_gateway: 10.200.50.1
vlans:
id: 10
port: 2
Nell'esempio sopra, vlans è la variabile del dizionario mentre id e port sono le coppie chiave-valore.
hosts: switch_f01
vars:
http_port: 8080
default_gateway:
vlans:
id: 10
port: 20
tasks:
name: Configure default gateway
system_configs:
default_gateway_ip: “{{ default_gateway }}“
name: Label port on vlan 10
vlan_config:
vlan_id: “{{ vlans[‘id’] }}“
port_id: 1/1/ {{ vlans[‘port’] }}
Per port_id, poiché stiamo iniziando il valore con il testo e non con la variabile, le virgolette non sono necessarie per racchiudere le parentesi graffe.
2. Variabili speciali
Ansible fornisce un elenco di variabili predefinite a cui è possibile fare riferimento nei modelli e nei playbook Jinja2 ma che non possono essere modificate o definite dall'utente.
Collettivamente, l'elenco delle variabili predefinite Ansible viene definito fatti Ansible e questi vengono raccolti quando viene eseguito un playbook.
Per ottenere un elenco di tutte le variabili Ansible, utilizzare il modulo setup nel comando ad hoc Ansible come mostrato di seguito:
ansible -m setup hostname
Questo visualizza l'output in formato JSON come mostrato:
ansible -m setup localhost
Dall'output, possiamo vedere che alcuni esempi di variabili speciali Ansible includono:
ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux
Esistono molte altre variabili speciali Ansible, questi sono solo alcuni esempi.
Queste variabili possono essere utilizzate in un modello Jinja2 come mostrato:
<html>
<center>
<h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
<h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>
3. Variabili di inventario
Infine, nell'elenco abbiamo le variabili di inventario Ansible. Un inventario è un file in formato INI che contiene tutti gli host che devono essere gestiti da Ansible.
Negli inventari è possibile assegnare una variabile a un sistema host e utilizzarla successivamente in un playbook.
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080
Quanto sopra può essere rappresentato in un file YAML del playbook come mostrato:
---
web_servers:
web_server_1:
ansible_user=centos
http_port=80
web_server_2:
ansible_user=ubuntu
http_port=8080
Se i sistemi host condividono le stesse variabili, è possibile definire un altro gruppo nel file di inventario per renderlo meno ingombrante ed evitare ripetizioni inutili.
Per esempio:
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80
Quanto sopra può essere strutturato come:
[web_servers]
web_server_1
web_server_2
[web_servers:vars]
ansible_user=centos
http_port=80
E nel file YAML del playbook, questo sarà definito come mostrato:
---
web_servers:
hosts:
web_server_1:
web_server_2:
vars:
ansible_user=centos
http_port=80
Fatti ansibili
Quando si eseguono playbook, la prima attività eseguita da Ansible è l'esecuzione dell'attività di configurazione. Sono abbastanza sicuro che devi aver trovato l'output:
TASK: [Gathering facts] *********
I fatti Ansible non sono altro che proprietà del sistema o informazioni sui nodi remoti a cui ti sei connesso. Queste informazioni includono l'architettura del sistema, la versione del sistema operativo, le informazioni sul BIOS, l'ora e la data del sistema, il tempo di attività del sistema, l'indirizzo IP e le informazioni sull'hardware, per citarne solo alcune.
Per ottenere informazioni su qualsiasi sistema è sufficiente utilizzare il modulo setup come mostrato nel comando seguente:
ansible -m setup hostname
Per esempio:
ansible -m setup database_server
Verrà stampato un ampio set di dati in formato JSON come mostrato:
I fatti Ansible sono utili per aiutare gli amministratori di sistema su quali operazioni eseguire, ad esempio, a seconda del sistema operativo, possono sapere quali pacchetti software devono essere installati, come devono essere configurati, ecc.
Fatti personalizzati
Sapevi anche che puoi creare i tuoi dati personalizzati che possono essere raccolti da Ansible? Si, puoi. Quindi come procedere? Cambiamo marcia e vediamo come.
Il primo passaggio è creare una directory /etc/ansible/facts.d sul nodo gestito o remoto.
All'interno di questa directory, crea uno o più file con estensione .fact
. Questi file restituiranno i dati JSON quando il playbook viene eseguito sul nodo di controllo Ansible, che include gli altri fatti che Ansible recupera dopo l'esecuzione del playbook.
Ecco un esempio di un file di fatti personalizzato chiamato date_time.fact che recupera data e ora.
mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact
Aggiungi le seguenti righe al suo interno.
#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"
Salvare ed uscire dal file.
Ora assegna i permessi di esecuzione:
chmod +x /etc/ansible/facts.d/date_time.fact
Ora ho creato un playbook sul nodo di controllo Ansible chiamato check_date.yml.
---
- hosts: webservers
tasks:
- name: Get custom facts
debug:
msg: The custom fact is {{ansible_local.date_time}}
Aggiungi il file dei fatti alla variabile ansible_local. ansible_local memorizza tutti i dati personalizzati.
Ora esegui il playbook e osserva Ansible mentre recupera le informazioni salvate nel file dei fatti:
ansible_playbook check_date.yml
Conclusione
Questo ci porta alla fine di questo tutorial su come lavorare con variabili e fatti Ansible.