Indice

Categorie

Category cover

Automazione
18 posts

Category cover

CISO
10 posts

Category cover

Sicurezza Personale
7 posts

Category cover

Infrastruttura
4 posts

Category cover

Sicurezza
3 posts

Category cover

Libri
2 posts

Category cover

Vita
1 posts

Comandi una tantum su Cisco IOS con Ansible

Andrea Dainese
25 Settembre 2023
Post cover

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:

Lab topology

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