Aujourd’hui: petite journée, puisque nous allons la passer à découvrir un seul module. Mais elle va nous servir à consolider tout ce que nous avons vu jusqu’ici.

Remplacement de raw

Le module raw nous a permis de bien comprendre l’esprit d’Ansible, à savoir un moteur qui effectue des actions élémentaires à distance sur des hosts. En réseau nous utiliserons plutôt le module cli_command qui offre plus de contrôle et de fonctionnalités.

La documentation du module est disponible ici : https://docs.ansible.com/ansible/latest/modules/cli_command_module.html

Nous regardons attentivement le tableau Parameters qui liste les données attendues par le module, qu’on passera via le paramètre –args ou -a.

Pour cli_command, le seul paramètre du module obligatoire est command, il précise la commande à exécuter.

Les arguments à passer à Ansible commencent à prendre forme :

la sélection des routeurs
-ile fichier inventaire
-mle nom du module : cli_command
-ales paramètres du module sous la forme: command=’ma commande’

On n’oubliera pas le paramètre connection :

-cnetwork_cli (nécessaire au module cli_command)

Dans le fichier inventaire, nous plaçons les variables spécifiques à chaque routeur :

  • les identifiants de connexion qui sont communs à notre parc
  • la résolution nom vers adresse IP, puisque mes équipements ne sont pas connus par le DNS

Et je lance ma commande :

screenshot006

Caramba encore raté !

En revanche, nous avons un message d’erreur tout à fait explicite (ce qui n’est pas toujours le cas avec Ansible !) : il manque la variable ansible_network_os.

Première question : où va-t-on renseigner cette variable. Vous avez, bien sûr, en tête les différentes possibilités :

  • en global dans le fichier inventaire
  • pour chaque host du fichier inventaire
  • en ligne de commande avec le paramètre –extra-vars

Ici je vais choisir le paramètre extra-vars qui a l’avantage d’être explicite, mais les autres choix sont respectables.

Le vrai problème, c’est surtout ce qu’on va mettre dans cette variable. Pour cela, il faut se rendre sur la page de la documentation https://docs.ansible.com/ansible/latest/network/user_guide/platform_index.html. Une autre possibilité est d’utiliser le mode verbose qui affiche le module python qui reporte l’erreur, puis d’inspecter ce module.

Ici nous utilisons un routeur Cisco classique, ansible_network_os sera positionné à « ios ».

La commande devient :

ark@amp-ansible:~$ ansible all -i inv 
      -m cli_command -a "command='show clock'" 
      -c network_cli -e "ansible_network_os=ios"

Et là c’est gagné :

screenshot008

Utilisation avancée

Ce module peut interpréter la réponse de l’équipement et répondre en fonction :

ici nous envoyons un reload, puis annulons l’opération :

:~$ ansible all -i inv -m cli_command 
            -a "command='reload' prompt='confirm' answer=n" 
            -c network_cli -e "ansible_network_os=ios"

Les paramètres prompt et answer peuvent être entrés sous forme de listes, si le dialogue entre le routeur et l’automate est un peu plus complexe :

ansible all -i inv -m cli_command -a "command='reload in 30' \
        prompt=Save,confirm answer=y,n check_all=True"     \
        -c network_cli -e "ansible_network_os=ios ansible_command_timeout=20"

Ici, le module répondra ‘y’ quand le routeur demandera si la configuration doit être sauvée, et répondra ‘n’ pour confirmer le reboot.

screenshot009

Nous sommes dès à présent capables d’envoyer des commandes sur un ensemble de routeurs avec un minium de contrôle pendant le dialogue. La prochaine journée sera consacrée au formalisme des données, ensuite nous apprendrons à grouper les actions dans un playbook..

Author

Philippe est architecte réseau chez un opérateur depuis 20 ans. Il a le double rôle de concevoir des réseaux pour les clients, puis de les faire fonctionner. Bien que passionné par l'innovation, il reste un fervent supporter de la RFC 1925 et garde tout son sens critique par rapport au hype et aux promesses féeriques des constructeurs. Ancien développeur, il tente de garder la main en programmant des Arduino en C ou des utilitaires opensource en Ruby. On peut également le croiser en randonnée dans les collines ou dans un club de bridge.

Write A Comment