Ansible Navigator

Andrea Dainese
6 Ottobre 2023
Post cover

Ansible Navigator è una interfaccia testuale, basata su container, che permette di gestire una serie di componenti di Ansible. In un certo senso è una sorta di wrapper, di interfaccia unificata verso l’ecosistema Ansible. Inizialmente l’uso che faremo di Ansible Navigator non richiede l’uso di container: useremo quindi il parametro --ee=false.

Tra i moduli di Ansible Navigator, troviamo:

  • run: esegue un playbook.
  • replay: mostra il risultato di un playbook eseguito precedentemente.
  • inventory: mostra uno specifico inventario di Ansible, descrivendone host, gruppi, variabili.
  • config: mostra la configurazione di Ansible, descrivendone i singoli parametri.
  • settings: mostra la configurazione corrente di Ansible Navigator, descrivendone i singoli parametri.
  • lint: formatta in modo corretto (linting) playbook e ruoli.

Vediamo quindi nella pratica come usare Ansible Navigator.

Run: esecuzione di un playbook Ansible

Un playbook Ansible può essere eseguito tramite Ansible Navigator nel seguente modo:

ansible-navigator --ee=false run playbook-print_all_vars.yml -i inventory.yml

Rispetto all’output di Ansible, Ansible Navigator ci offre una leggibilità decisamente migliore:

  Play name             Ok Changed Unreachable Failed Skipped Ignored In progress Task count   Progress
0│PRINT DEBUG VARIABLES  6       0           0      0       0       0           0          6   Complete

Possiamo ottenere i dettagli del playbook utilizzando il numero di riga (0 nel nostro caso), o : con il numero di riga (:0 nel nostro caso).

Possiamo quindi vedere l’elenco dei task:

  Result Host      Number Changed Task                                  Task action           Duration
0│Ok     localhost      0 False   Gathering Facts                       gather_facts                1s
1│Ok     localhost      1 False   PRINT MODULE VARIABLES (vars)         ansible.builtin.debug       0s
2│Ok     localhost      2 False   PRINT ENVIRONMENT VARIABLES (environmeansible.builtin.debug       0s
3│Ok     localhost      3 False   PRINT GROUP NAMES VARIABLES (group_namansible.builtin.debug       0s
4│Ok     localhost      4 False   PRINT GROUPS VARIABLES (groups)       ansible.builtin.debug       0s
5│Ok     localhost      5 False   PRINT HOST VARIABLES (hostvars)       ansible.builtin.debug       0s

In modo simile possiamo vedere il dettaglio di ciascun task:

Play name: PRINT DEBUG VARIABLES:1
Task name: PRINT MODULE VARIABLES (vars)
Ok: localhost ['-------------------------------------------------------------------------', '{', '    "a
   0│---                                                                                               ▒
   1│duration: 0.042759
   2│end: '2023-10-06T11:39:11.611558'
   3│event_loop: null
   4│host: localhost
   5│play: PRINT DEBUG VARIABLES
   6│play_pattern: all
   7│playbook: /Users/dainese/src/patreon/ansible/Recipes/playbook-print_all_vars.yml
   8│remote_addr: localhost
   9│res:
  10│  _ansible_no_log: null
  11│  _ansible_verbose_always: true
  12│  changed: false
  13│  msg:
[...]

Replay: review di una passata esecuzione

Ad ogni esecuzione (run), Ansible Navigator crea un file JSON chiamato artifact. Questo permette di analizzare a posteriori i dettagli dell’esecuzione di un playbook.

Possiamo ricaricare i dati di un playbook precedentemente eseguito con:

ansible-navigator --ee=false replay playbook-print_all_vars-artifact-2023-10-06T11\:39\:11.912452+00\:00.json

L’interfaccia ci presenta la stessa schermata mostrata nel paragrafo precedente. (run).

Inventory: analisi di un inventario

L’inventario di Ansible è il punto centrale nell’esecuzione dei playbook. Molte variabili sono definite a livello di inventario, poiché, come vedremo, l’inventario può leggere parametri esterni ( Dynamic Inventory ). Ansible Navigator ci da quindi uno strumento per poter visualizzare in modo semplice la struttura di un inventario, i gruppi e le variabili definite a livello di gruppo e a livello di host:

ansible-navigator --ee=false inventory -i inventory.yml

Config: analisi della configurazione di Ansible

Ansible può essere configurato agendo su un altissimo numero di parametri. Mi è capitato di non essere certo che uno specifico parametro fosse configurato nel posto corretto e quindi venisse ignorato.

Possiamo visualizzare la configurazione di Ansible verificando i parametri configurati, il loro valore e dove possono essere configurati:

ansible-navigator --ee=false config

L’output relativo al parametro host_key_checking è il seguente:

Host key checking (current: False)  (default: True)
 0│---
 1│current_config_file: None
 2│current_value: false
 3│default: false
 4│default_value: true
 5│description: Set this to "False" if you want to avoid host key checking by the underlying
 6│  tools Ansible uses to connect to the host
 7│env:
 8│- name: ANSIBLE_HOST_KEY_CHECKING
 9│ini:
10│- key: host_key_checking
11│  section: defaults
12│name: Host key checking
13│option: HOST_KEY_CHECKING
14│source: env
15│type: boolean
16│via: ANSIBLE_HOST_KEY_CHECKING

Settings: analisi della configurazione di Ansible Navigator

In modo simile a quanto descritto nel paragrafo precedente, è possibile analizzare la configurazione di Ansible Navigator:

ansible-navigator --ee=false settings

Lint: formattazione di playbook e ruoli

Quando scriviamo codice, qualunque sia il linguaggio, ci troviamo difronte al problema di usare degli standard: spazi, nomi delle variabili, commenti… Linting è quel processo che in modo automatico, semi-automatico o manuale, ci permette di adeguarci ad uno standard riconosciuto.

Ansible Navigator ci permette di standardizzare i nostri playbook eseguendo la funzione di linting:

ansible-navigator --ee=false lint *yml roles

Consiglio tuttavia di accoppiare Ansible Navigator i seguenti linter:

yamllint *yml roles
yamlfmt *yml roles
ansible-lint