Il costo della complessità: Ansible AWX
5 Maggio 2024
Comandi una tantum su Cisco IOS con Ansible
In questo articolo vediamo un primo esempio per effettuare dei comandi massivi con Ansible su dispositivi Cisco IOS. Utilizzeremo il laboratorio “Cisco Legacy Core-Access topology” preconfigurato, a disposizione nel repository DevNetOps course material:
Per prima cosa occorre creare un inventario. In questo momento non ci interessa discutere in modo approfondito l’argomento, ma ci basta creare un file contenente tutti i dispositivi presenti nel laboratorio e un minimo di variabili necessarie, quali:
ansible_host
: ossia l’indirizzo IP del dispositivo, non avendo noi un sistema di DNS che ci permette la risoluzione automatica;ansible_user
: ossia l’utente (admin) per accedere al dispositivo;ansible_ssh_pass
: ossia la password (cisco) per accedere al dispositivo;ansible_connection
: ossia la modalità di connessione che Ansible deve utilizzare per connettersi;ansible_network_os
: ossia il tipo di dispositivo.
Il file inventory.yml
sarà quindi come segue:
all:
hosts:
sw1.example.com:
ansible_host: 169.254.1.101
ansible_user: admin
ansible_ssh_pass: cisco
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: cisco.ios.ios
Poiché stiamo lavorando con dispositivi che supportano solo algoritmi obsoleti, dobbiamo abilitarli in modo specifico. In particolare faremo questo lavorando su un file di tipo SSH client config denominato ansible_libssh.conf
:
KexAlgorithms diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
HostKeyAlgorithms ssh-rsa,ssh-dss
Host *
ServerAliveInterval 5
ServerAliveCountMax 3
In teoria sarebbe sufficiente specificare solamente gli algoritmi da aggiungere, anteponendo il simbolo +
. Tuttavia nei miei test questa sintassi potrebbe creare problemi. Consiglio quindi di definire tutti gli algoritmi che ci serviranno nei nostri test.
Il file ansible_libssh.conf
sarà referenziato dal file ansible.cfg
che definisce le impostazioni della libreria libssh:
[persistent_connection]
ssh_type = libssh
[libssh_connection]
host_key_checking = false
look_for_keys = false
config_file = ../ansible_libssh_conf
Avviamo quindi i nodi e verifichiamo che essi siano raggiungibili:
ansible all -i inventory.yml -m ping
Il comando precedente esegue on cosiddetto Ad hoc commands. In altre parole abbiamo eseguito il comando ping su tutti (all) i dispositivi configurati nell’inventario.
In modo simile possiamo decidere di eseguire un comando su tutti i dispositivi:
ansible all -i inventory.yml -m cisco.ios.ios_command -a "commands='show version'"
Possiamo variare il numero di processi paralleli che eseguono il playbook. Questo numero dipende dalle risorse disponibili, in particolare dal numero di CPU, ma non solo. L’esecuzione di un playbook infatti ha una serie di “tempi morti”, ossia di tempo nel quale la macchina Ansible è in attesa dell’output dal dispositivo. Nel caso di dispositivi Cisco si pensi infatti a quanto tempo passa dall’immissione del comando show running-config
alla visualizzazione effettiva dell’output sullo schermo. Possiamo quindi aumentare tranquillamente il numero di fork al doppio dei processori a disposizione, senza rischiare di sovraccaricare la macchina Ansible:
[defaults]
forks = 8