Ricerca nel sito web

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.