Mise à jour de la configuration

1. Théorie

Le module *_config

Les modules *_config spécifiques aux fabricants de solutions permettent notamment de mettre à jour la configuration des périphériques du réseau. Il existe plusieurs manières d’utiliser le module *_config.

Pour placer des commandes de configuration :

  tasks:
    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW
          - snmp-server community ansible-test RO

Pour placer un fichier de configuration :

  tasks:
    - name: ENSURE THAT ROUTERS ARE SECURE
      ios_config:
        src: secure_router.cfg

Valider des changements avant qu’ils soient appliqués

Ansible permet de valider l’impact d’une configuration proposée grâce à l’option --check. Cette option utilisée en combinaison avec la verbosité --verbose permet de vérifier les éventuels changements.

ansible-playbook router_configs.yml  --check -v
PLAY [UPDATE THE SNMP RO/RW STRINGS] ********************************************************************************************************************************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] *************************************************************************************************************************************
changed: [rtr3] => {"banners": {}, "changed": true, "commands": ["snmp-server community ansible-test RO"],
"updates": ["snmp-server community ansible-test RO"]}

2. Lab

Nous venons d’apprendre qu’il est possible de mettre à jour la configuration des routeurs en poussant soit directement des commandes de configuration, soit en poussant un fichier de configuration.

Étape 1

Veuillez créer un nouveau fichier nommé router_configs.yml (soit avec vim, nano ou encore en le poussant à partir de votre station de travail, à partir du repo github associé, …) et veuillez ajouter cette définition d’un jeu.

---
- name: SNMP RO/RW STRING CONFIGURATION
  hosts: cisco
  gather_facts: no
  connection: network_cli

Étape 2

Veuillez ajouter une tâche qui s’assure que les communautés SNMP ansible-public et ansible-private sont présentes sur tous les routeurs avec le module ios_config.

Il est toujours utile de relire la documentation des modules avec le binaire local ansible-doc ios_config ou à parit du site Web https://docs.ansible.com. Les exemples sont très instructifs.

---
- name: SNMP RO/RW STRING CONFIGURATION
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW

Étape 3

Veuillez exécuter le livre de jeu :

ansible-playbook router_configs.yml
PLAY [UPDATE THE SNMP RO/RW STRINGS] ********************************************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] *************************************************
changed: [rtr4]
changed: [rtr1]
changed: [rtr3]
changed: [rtr2]

PLAY RECAP **********************************************************************************************
rtr1                       : ok=1    changed=1    unreachable=0    failed=0
rtr2                       : ok=1    changed=1    unreachable=0    failed=0
rtr3                       : ok=1    changed=1    unreachable=0    failed=0
rtr4                       : ok=1    changed=1    unreachable=0    failed=0

N’hésitez pas à vous connecter sur les périphériques et à vérifier de visu la mise à jour de la configuration.

Étape 4

Le module ios_config est idempotent. Cela signifie qu’un changement de configuration n’est réalisé sur le périphérique gérés seulement si cet élément n’existe pas sur la cible. Exécuter à plusieurs reprises l’action déjà réalisée ne devrait pas changer la situation.

Tentons de valider cette idée en relançant une nouvelle fois le même livre de jeu.

ansible-playbook router_configs.yml
PLAY [UPDATE THE SNMP RO/RW STRINGS] ********************************************************************************************************************************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] *************************************************************************************************************************************
ok: [rtr1]
ok: [rtr2]
ok: [rtr4]
ok: [rtr3]

PLAY RECAP **********************************************************************************************************************************************************************************
rtr1                       : ok=1    changed=0    unreachable=0    failed=0
rtr2                       : ok=1    changed=0    unreachable=0    failed=0
rtr3                       : ok=1    changed=0    unreachable=0    failed=0
rtr4                       : ok=1    changed=0    unreachable=0    failed=0

Note : Le paramètre changed dans le PLAY RECAP indique aucun (0) changement.

Étape 5

Veuillez mettre à jour la tâche en ajoutant une communauté SNMP RO nommée “ansible-test”.

---
- name: UPDATE THE SNMP RO/RW STRINGS
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW
          - snmp-server community ansible-test RO

Étape 6

Tentons de valider les changements avant de les appliquer grâce aux options --check -v.

ansible-playbook router_configs.yml  --check -v
PLAY [UPDATE THE SNMP RO/RW STRINGS] ********************************************************************************************************************************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] *************************************************************************************************************************************
changed: [rtr3] => {"banners": {}, "changed": true, "commands": ["snmp-server community ansible-test RO"], "updates": ["snmp-server community ansible-test RO"]}
changed: [rtr1] => {"banners": {}, "changed": true, "commands": ["snmp-server community ansible-test RO"], "updates": ["snmp-server community ansible-test RO"]}
changed: [rtr2] => {"banners": {}, "changed": true, "commands": ["snmp-server community ansible-test RO"], "updates": ["snmp-server community ansible-test RO"]}
changed: [rtr4] => {"banners": {}, "changed": true, "commands": ["snmp-server community ansible-test RO"], "updates": ["snmp-server community ansible-test RO"]}

PLAY RECAP **********************************************************************************************************************************************************************************
rtr1                       : ok=1    changed=1    unreachable=0    failed=0
rtr2                       : ok=1    changed=1    unreachable=0    failed=0
rtr3                       : ok=1    changed=1    unreachable=0    failed=0
rtr4                       : ok=1    changed=1    unreachable=0    failed=0

La combinaison des options --check et de verbosité -v indique les changements probables.

Vous pouvez vérifier que ces changements n’ont pas été appliqués.

Remarquez que cette trois commandes font partie d’un seule tâche, mais seule la commande manquante sera poussée sur le périphérique.

Étape 7

Finalement, on peut relancer ce livre de jeu sans les options -v ou --check pour appliquer les changements.

ansible-playbook router_configs.yml
PLAY [UPDATE THE SNMP RO/RW STRINGS] ********************************************************************************************************************************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] *************************************************************************************************************************************
changed: [rtr1]
changed: [rtr2]
changed: [rtr4]
changed: [rtr3]

PLAY RECAP **********************************************************************************************************************************************************************************
rtr1                       : ok=1    changed=1    unreachable=0    failed=0
rtr2                       : ok=1    changed=1    unreachable=0    failed=0
rtr3                       : ok=1    changed=1    unreachable=0    failed=0
rtr4                       : ok=1    changed=1    unreachable=0    failed=0

Étape 8

Plutôt que de pousser chaque ligne de configuration de manière individuelle, un bloc entier de commande pourrait être appliqué sur les périphériques.

Veuillez créer un fichier appelé secure_router.cfg dans le même dossier que le livre de jeu. Le fichier secure_router.cfg devrait contenir les lignes Cisco IOS suivantes :

line con 0
 exec-timeout 5 0
line vty 0 4
 exec-timeout 5 0
 transport input ssh
ip ssh time-out 60
ip ssh authentication-retries 5
service password-encryption
service tcp-keepalives-in
service tcp-keepalives-out

Étape 9

Pour rappel un livre de jeu est une liste de jeux.

Veuillez ajouter au livre de jeu router_configs.yml un nouveau jeu appelé HARDEN IOS ROUTERS

---
- name: UPDATE THE SNMP RO/RW STRINGS
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW
          - snmp-server community ansible-test RO


- name: HARDEN IOS ROUTERS
  hosts: cisco
  gather_facts: no
  connection: network_cli

Étape 10

Veuillez ajouter à ce nouveau jeu une tâche qui pousse la configuration contenue dans le fichier secure_router.cfg que vous avez créé au moment de l’Étape 8.

---
- name: UPDATE THE SNMP RO/RW STRINGS
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW
          - snmp-server community ansible-test RO


- name: HARDEN IOS ROUTERS
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT ROUTERS ARE SECURE
      ios_config:
        src: secure_router.cfg

Étape 11

Veuillez enfin exécuter ce livre de jeu.

ansible-playbook router_configs.yml
PLAY [UPDATE THE SNMP RO/RW STRINGS] ********************************************************************************************************************************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] *************************************************************************************************************************************
ok: [rtr3]
ok: [rtr2]
ok: [rtr1]
ok: [rtr4]

PLAY [HARDEN IOS ROUTERS] *******************************************************************************************************************************************************************

TASK [ENSURE THAT ROUTERS ARE SECURE] *******************************************************************************************************************************************************
changed: [rtr4]
changed: [rtr3]
changed: [rtr2]
changed: [rtr1]

PLAY RECAP **********************************************************************************************************************************************************************************
rtr1                       : ok=2    changed=1    unreachable=0    failed=0
rtr2                       : ok=2    changed=1    unreachable=0    failed=0
rtr3                       : ok=2    changed=1    unreachable=0    failed=0
rtr4                       : ok=2    changed=1    unreachable=0    failed=0

Licence

License MIT github.com/network-automation/linklight