Ansible

13 Exemple réseau

Pour cet exemple réseau, nous allons mettre en place cette architecture composée de deux routeurs Cisco, d’un switch Cisco, d’un serveur Ansible, et avec comme objectif de mettre en place l’automatisation du déploiement des Vlans et des adresses HSRP pour les routeurs.

Le Switch Cisco s’appelle SW-1 et les routeurs se nomment R1 et R2. Le commutateur Ethernetswitch et la fonction NAT ne font pas partie des objectifs de cet exemple et ne seront donc pas détaillés.

Une fois la configuration de base des commutateurs et des routeurs effectuée et les adaptations et activations SSH nécessaires, Ansible peut être utilisé.

Pour cet exemple nous créons un « Role » confCisco et un « Playbook » cisco.yml pour le lancer.

Cisco.yml

---
- hosts: ios
  gather_facts: false
  connection: local
  roles:
    - confCisco

Comme vu dans les autres chapitres, ce « Playbook » va permettre d’exécuter le « Role » sur l’ensemble des hosts contenus dans le groupe [ios]. Ce groupe comprend à la fois les commutateurs et les routeurs Cisco.

Fichier hosts utilisé par Ansible

[ios_switch]
SW-1
[ios_router]
R1
R2
[ios:children]
ios_switch
ios_router

Nous introduisons ici la notion de « Children », dans le fichier hosts, permettant de créer un groupe comprenant plusieurs groupes, plutôt que de dupliquer des entrées dans le fichier Ansible hosts.

Nous allons détailler les fichiers de variables nécessaires au fonctionnement du « Playbook ». Le fichier group_vars/all/vars.yml contient toutes les variables chargées pour l’ensemble des « Playbooks ».

Fichier group_vars/all/vars.yml

---
provider:
  host: "{{ ansible_host }}"
  username: myuser
  password: mypassword
  transport: cli

Dans le fichier de variable all/vars.yml nous chargeons l’ensemble des variables nécessaires pour la connexion aux équipements Cisco.

Depuis la version Ansible 2.4, vous n’êtes plus obligé de renseigner ces paramètres, mais utiliser les options « -u < username > -k » qui permettront de se connecter avec le login et le mot de passe.

Fichier group_vars/ios_switch/vlans.yml

---
vlans :
  - { id: 100 , name: "test", address: "192.168.100.1", mask: "255.255.255.0" }
  - { id: 200 , name: "test", address: "192.168.200.1", mask: "255.255.255.0" }

Dans ce fichier, on liste l’ensemble des vlans que l’on souhaite créer, incluant dans notre exemple une adresse IP et le masque associé.

Fichier group_vars/ios_router/hsrp.yml

hsrp:
  - { interface: 1, group: 100, network: 192.168.100, address: 3, priority : 100 }

Dans ce fichier nous renseignons les paramètres nécessaires à la mise en place du protocole HSRP (protocole propriétaire Cisco ayant pour équivalent le protocole standard VRRP). Nous renseignons l’interface sur laquelle nous souhaitons mettre en place HSRP, le groupe correspondant au numéro du vlan, le réseau et l’adresse IP virtuelle HRSP, ainsi que la priorité.

Fichier « Task » roles/confCisco/tasks/main.yml

---
# tasks file for confCisco

- name: Generate vlans from template vlans.yml
  template:
    src=vlans.j2
    dest=./configCisco/vlans.cfg
  delegate_to: localhost
  when: inventory_hostname in groups['ios_switch']

- name: Generate HSRP configuration from template hsrp.yml
  template:
    src=hsrp.j2
    dest=./configCisco/hsrp.cfg
  delegate_to: localhost
  when: inventory_hostname in groups['ios_router']

- name: Deploy vlans on switchs
  ios_config:
    src=./configCisco/vlans.cfg
  when: inventory_hostname in groups['ios_switch']

- name: Deploy HSRP configuration on routers
  ios_config:
    src=./configCisco/hsrp.cfg
  when: inventory_hostname in groups['ios_router']

Dans ce fichier nous demandons à Ansible de générer les fichiers de configuration vlans.cfg et hsrp.cfg puis de les déployer respectivement sur les switchs et les routeurs.

« Template » roles/confCisco/templates/vlans.j2

{% for vlan in vlans %}

vlan {{ vlan.id }}
name {{ vlan.name }}
interface vlan {{ vlan.id }}
ip address {{ vlan.address }} {{ vlan.mask }}
no shutdown
exit

{% endfor %}

« Template » roles/confCisco/templates/hsrp.j2

{% for hsrp in hsrp %}

int fa0/{{ hsrp.interface }}
standby {{ hsrp.group }} ip {{ hsrp.network }}.{{ hsrp.address }}
standby {{ hsrp.group }} preempt
standby priority {{ hsrp.priority }}
no shutdown

{% endfor %}

Une fois le « Playbook » écrit, nous pouvons l’exécuter avec la commande suivante :

ansible-playbook cisco.yml -u < username > -k

Outre l’exécution du playbook, cette commande va générer les configurations précédentes et les déployer sur les équipements.

Il est important de noter que certains modules Cisco comme ios_command peuvent être utilisés pour d’autres constructeurs. Cependant, certains concurrents, comme Juniper, se sont lancés aussi dans le domaine de l’automatisation et ont développé leurs propres modules.