Ansible - SW Cisco / Junip : Différence entre versions

De Wiki_DR13
Aller à : navigation, rechercher
(Page créée avec « = Administrer switch Cisco / Junip avec Ansible = Cette page traite de l'installation et la configuration d'Ansible pour gérer la conf des switch Cisco et Juniper. = Pr... »)
 
(Switchs Cisco)
Ligne 80 : Ligne 80 :
 
  community.network    5.0.0
 
  community.network    5.0.0
  
== Variables Ansible ==
+
== Inventaire d'hôtes ==
  
Utiliser les variables suivantes pour la connexion à un switch Cisco :
+
Le '''fichier ''hosts''''' contient l'inventaire de l'ensemble des switchs ainsi que la définition de groupes de switchs et de variables.
  
host_key_checking=false
+
<pre>
ansible_ssh_user='user.name'
+
[all:vars]
ansible_python_interpreter='/path/to/python/interpreter'
+
host_key_checking=false
ansible_ssh_private_key_file='/path/to/ssh/private/key'
+
ansible_ssh_user='user.name'
ansible_connection=ansible.netcommon.network_cli
+
ansible_python_interpreter='/path/to/python/interpreter'
ansible_network_os=cisco.ios.ios
+
ansible_ssh_private_key_file='/path/to/ssh/private/key'
 +
ansible_connection=ansible.netcommon.network_cli
 +
timeout=300
 +
ansible_command_timeout=300
 +
 
 +
[DR13_cisco:vars]
 +
ansible_network_os=cisco.ios.ios
 +
 
 +
[DR13_cisco]
 +
sw-DR-BatA-1 ansible_host=10.13.105.101
 +
sw-DR-BatA-2 ansible_host=10.13.105.102
 +
sw-DR-BatA-3 ansible_host=10.13.105.103
 +
sw-DR-BatA-4 ansible_host=10.13.105.104
 +
sw-DR-BatA-5 ansible_host=10.13.105.105
 +
sw-DR-BatA-6 ansible_host=10.13.105.106
 +
sw-DR-BatA-7 ansible_host=10.13.105.107
 +
 
 +
sw-DR-BatB-1 ansible_host=10.13.105.151
 +
 
 +
sw-DR-BatD-1 ansible_host=10.13.105.171
 +
sw-DR-BatD-2 ansible_host=10.13.105.172
 +
sw-DR-BatD-3 ansible_host=10.13.105.173
 +
sw-DR-BatD-4 ansible_host=10.13.105.174
 +
 
 +
[DR13_BAT_A]
 +
sw-DR-BatA-1
 +
sw-DR-BatA-2
 +
sw-DR-BatA-3
 +
sw-DR-BatA-4
 +
sw-DR-BatA-5
 +
sw-DR-BatA-6
 +
sw-DR-BatA-7
 +
 
 +
[DR13_BAT_B]
 +
sw-DR-BatB-1
 +
 
 +
[DR13_BAT_D]
 +
sw-DR-BatD-1
 +
sw-DR-BatD-2
 +
sw-DR-BatD-3
 +
sw-DR-BatD-4
 +
</pre>
 +
 
 +
== Modules Cisco.Ios ==
 +
 
 +
Il existe un total de [https://docs.ansible.com/ansible/latest/collections/cisco/ios/index.html#plugin-index 36 modules pour configurer des appareils Cisco utilisant IOS] qui se décomposent en '''3 catégories''' :
 +
# Modules exécutant des commandes IOS en dehors du mode configuration. Ces derniers utilisent la syntaxe IOS pour passer les commandes.
 +
# Modules exécutant des commandes IOS en mode configuration. Ces derniers utilisent la syntaxe IOS pour passer les commandes.
 +
# Modules configurant de manière ciblée des éléments spécifiques du switch (VLANs, interfaces, utilisateurs). Ces derniers n'utilisent pas la syntaxe IOS.
 +
 
 +
Exemples de modules pour chaque catégorie :
 +
# ''cisco.ios.ios_command''
 +
# ''cisco.ios.ios_config''
 +
# ''cisco.ios.ios_l2_interfaces''
 +
 
 +
== Exemples de playbook ==
 +
 
 +
=== Avec syntaxe IOS ===
 +
 
 +
Le playbook ci-dessous configure le NAC sur les ports d'un switch Cisco. Dans ce cas de figure, l'utilisation de commandes Cisco IOS est plus adaptée, car le module ''cisco.ios.ios_l2_interfaces'' spécifique à la configuration d'interfaces ne prend, par exemple, pas en charge les commandes ''"authentication"''.
 +
 
 +
<pre>
 +
- name: "Configuration NAC"
 +
  hosts: DR13_cisco
 +
  gather_facts: false
 +
 
 +
  tasks:
 +
    - name: Configure NAC interfaces
 +
      cisco.ios.ios_config:
 +
        lines:
 +
          - no shut
 +
          - description NAC DR13
 +
          - switchport mode access
 +
          - device-tracking attach-policy TRACKING-DR13
 +
          - authentication event server dead action authorize vlan 115
 +
          - authentication event no-response action authorize vlan 115
 +
          - authentication order dot1x
 +
          - authentication port-control auto
 +
          - authentication periodic
 +
          - authentication timer reauthenticate 1200
 +
          - dot1x pae authenticator
 +
          - dot1x timeout tx-period 10
 +
          - spanning-tree portfast
 +
        parents:
 +
          - interface range GigabitEthernet1/0/1-24
 +
 
 +
    - name: Save running to startup when modified
 +
      cisco.ios.ios_config:
 +
        save_when: modified
 +
</pre>
 +
 
 +
=== Sans syntaxe IOS ===
 +
 
 +
Le playbook ci-dessous ajoute les VLANs 10 et 11 sur tous les switch et les ajoute aux interfaces disposant d'un trunk. De plus, les switchs du bâtiment A ayant 2 vlans supplémentaires déclarés au niveau des ports trunk, la directive ''allowed_vlans'' sera donc appliquée différemment en fonction du bâtiment où se situe le switch.
 +
 
 +
Dans ce cas de figure, l'utilisation de modules pour configurer uniquement des VLANs et interfaces est possible mais le module ''cisco.ios.ios_config'' aurait tout à fait pu lui aussi être utilisé.
 +
 
 +
<pre>
 +
- name: "Configuration VLAN"
 +
  hosts: DR13_cisco
 +
  gather_facts: false
 +
 
 +
  tasks:
 +
    - name: Add VLANs 10 and 11
 +
      cisco.ios.ios_vlans:
 +
        config:
 +
          - name: DR-toto
 +
            vlan_id: 10
 +
            state: active
 +
            shutdown: disabled
 +
          - name: DR-tata
 +
            vlan_id: 11
 +
            state: active
 +
            shutdown: disabled
 +
 
 +
    - name: Add VLANs to BAT_A's 10G interfaces trunks
 +
      cisco.ios.ios_l2_interfaces:
 +
        config:
 +
          - name: TenGigabitEthernet1/1/3
 +
            mode: trunk
 +
            trunk:
 +
              allowed_vlans: X,10,11,X-X,X,Y,Z
 +
          - name: TenGigabitEthernet1/1/4
 +
            mode: trunk
 +
            trunk:
 +
              allowed_vlans: X,10,11,X-X,X,Y,Z
 +
    when:
 +
        - inventory_hostname in groups.DR13_BAT_A
 +
 
 +
    - name: Add VLANs to BAT_B and BAT_D's 10G interfaces trunks
 +
      cisco.ios.ios_l2_interfaces:
 +
        config:
 +
          - name: TenGigabitEthernet1/1/3
 +
            mode: trunk
 +
            trunk:
 +
              allowed_vlans: X,10,11,X-X,X
 +
          - name: TenGigabitEthernet1/1/4
 +
            mode: trunk
 +
            trunk:
 +
              allowed_vlans: X,10,11,X-X,X
 +
    when:
 +
        - inventory_hostname in lookup('inventory_hostnames','DR13_BAT_B:DR13_BAT_D')
 +
</pre>
 +
 
 +
== Exécution d'un playbook ==
 +
 
 +
Entrer la commande suivante afin d'exécuter un playbook (l'option -k permet d'avoir un prompt pour renseigner le mot de passe de notre clé SSH).
 +
 
 +
ansible-playbook -i /path/to/hosts/file /path/to/playbook_name.yaml -k
  
 
= Switchs Juniper =
 
= Switchs Juniper =

Version du 18 janvier 2023 à 15:27

Administrer switch Cisco / Junip avec Ansible

Cette page traite de l'installation et la configuration d'Ansible pour gérer la conf des switch Cisco et Juniper.

Prérequis

Afin de mieux gérer le versionning de chacun des paquets, nous utiliserons uniquement des paquets Python en lieu et place des paquets fournis par notre distribution.

Environnement Python

Installer un environnement Python sur sa machine :

Gestionnaire de paquets Python

Installer un package manager pour Python :

Paquets Python

Installation des paquets

Installer Ansible et la librairie paramiko permettant de gérer la connexion SSH avec Ansible :

$ pip install --user ansible
$ pip install --user paramiko==2.8.1

Bugs identifiés

Version des paquets Python

Les versions suivantes ont été testées et sont fonctionnelles :

  • ansible - 6.7.0
  • ansible-compat - 2.2.7
  • ansible-core - 2.13.7
  • paramiko - 2.8.1

Switchs Cisco

Ajouter sa clé SSH sur le switch

Affichage de la clé publique :

$ cat /path/to/ssh/public/key

La clé s'affiche sur une seule ligne. Or, Cisco IOS supporte seulement 254 caractères. Afin de rendre la clé lisible auprès de Cisco IOS, utiliser la commande ci-après pour découper l'affichage en lignes de 100 caractères et enlever le premier champ "ssh-rsa" et le commentaire de fin de fichier.

$ cat /path/to/ssh/public/key | cut -d " " -f 2 | fold -b -w 100
...
...
...
...

Ajouter la clé publique sur le switch (les ... correspondent au résultat de la commande effectuée précédemment) :

(config)#ip ssh pubkey-chain 
(conf-ssh-pubkey)#username user.name
(conf-ssh-pubkey-user)#key-string
(conf-ssh-pubkey-data)#...
(conf-ssh-pubkey-data)#...
(conf-ssh-pubkey-data)#...
(conf-ssh-pubkey-data)#...
(conf-ssh-pubkey-data)#exit

Collections Ansible

Installer la collection cisco.ios :

$ ansible-galaxy collection install cisco.ios

Vérifier que l'on dispose bien des collections suivantes :

$ ansible-galaxy collection list
Collection            Version
--------------------- -------
ansible.netcommon     4.1.0  
ansible.utils         2.6.1  
cisco.ios             3.2.0
community.network     5.0.0

Inventaire d'hôtes

Le fichier hosts contient l'inventaire de l'ensemble des switchs ainsi que la définition de groupes de switchs et de variables.

[all:vars]
host_key_checking=false
ansible_ssh_user='user.name'
ansible_python_interpreter='/path/to/python/interpreter'
ansible_ssh_private_key_file='/path/to/ssh/private/key'
ansible_connection=ansible.netcommon.network_cli
timeout=300
ansible_command_timeout=300

[DR13_cisco:vars]
ansible_network_os=cisco.ios.ios

[DR13_cisco]
sw-DR-BatA-1 ansible_host=10.13.105.101
sw-DR-BatA-2 ansible_host=10.13.105.102
sw-DR-BatA-3 ansible_host=10.13.105.103
sw-DR-BatA-4 ansible_host=10.13.105.104
sw-DR-BatA-5 ansible_host=10.13.105.105
sw-DR-BatA-6 ansible_host=10.13.105.106
sw-DR-BatA-7 ansible_host=10.13.105.107

sw-DR-BatB-1 ansible_host=10.13.105.151

sw-DR-BatD-1 ansible_host=10.13.105.171
sw-DR-BatD-2 ansible_host=10.13.105.172
sw-DR-BatD-3 ansible_host=10.13.105.173
sw-DR-BatD-4 ansible_host=10.13.105.174

[DR13_BAT_A]
sw-DR-BatA-1
sw-DR-BatA-2
sw-DR-BatA-3
sw-DR-BatA-4
sw-DR-BatA-5
sw-DR-BatA-6
sw-DR-BatA-7

[DR13_BAT_B]
sw-DR-BatB-1

[DR13_BAT_D]
sw-DR-BatD-1
sw-DR-BatD-2
sw-DR-BatD-3
sw-DR-BatD-4

Modules Cisco.Ios

Il existe un total de 36 modules pour configurer des appareils Cisco utilisant IOS qui se décomposent en 3 catégories :

  1. Modules exécutant des commandes IOS en dehors du mode configuration. Ces derniers utilisent la syntaxe IOS pour passer les commandes.
  2. Modules exécutant des commandes IOS en mode configuration. Ces derniers utilisent la syntaxe IOS pour passer les commandes.
  3. Modules configurant de manière ciblée des éléments spécifiques du switch (VLANs, interfaces, utilisateurs). Ces derniers n'utilisent pas la syntaxe IOS.

Exemples de modules pour chaque catégorie :

  1. cisco.ios.ios_command
  2. cisco.ios.ios_config
  3. cisco.ios.ios_l2_interfaces

Exemples de playbook

Avec syntaxe IOS

Le playbook ci-dessous configure le NAC sur les ports d'un switch Cisco. Dans ce cas de figure, l'utilisation de commandes Cisco IOS est plus adaptée, car le module cisco.ios.ios_l2_interfaces spécifique à la configuration d'interfaces ne prend, par exemple, pas en charge les commandes "authentication".

- name: "Configuration NAC"
  hosts: DR13_cisco
  gather_facts: false

  tasks:
    - name: Configure NAC interfaces
      cisco.ios.ios_config:
        lines:
          - no shut
          - description NAC DR13
          - switchport mode access
          - device-tracking attach-policy TRACKING-DR13
          - authentication event server dead action authorize vlan 115
          - authentication event no-response action authorize vlan 115
          - authentication order dot1x
          - authentication port-control auto
          - authentication periodic
          - authentication timer reauthenticate 1200
          - dot1x pae authenticator
          - dot1x timeout tx-period 10
          - spanning-tree portfast
        parents:
          - interface range GigabitEthernet1/0/1-24

    - name: Save running to startup when modified
      cisco.ios.ios_config:
        save_when: modified

Sans syntaxe IOS

Le playbook ci-dessous ajoute les VLANs 10 et 11 sur tous les switch et les ajoute aux interfaces disposant d'un trunk. De plus, les switchs du bâtiment A ayant 2 vlans supplémentaires déclarés au niveau des ports trunk, la directive allowed_vlans sera donc appliquée différemment en fonction du bâtiment où se situe le switch.

Dans ce cas de figure, l'utilisation de modules pour configurer uniquement des VLANs et interfaces est possible mais le module cisco.ios.ios_config aurait tout à fait pu lui aussi être utilisé.

- name: "Configuration VLAN"
  hosts: DR13_cisco
  gather_facts: false

  tasks:
    - name: Add VLANs 10 and 11
      cisco.ios.ios_vlans:
        config:
          - name: DR-toto
            vlan_id: 10
            state: active
            shutdown: disabled
          - name: DR-tata
            vlan_id: 11
            state: active
            shutdown: disabled

    - name: Add VLANs to BAT_A's 10G interfaces trunks
      cisco.ios.ios_l2_interfaces:
        config:
          - name: TenGigabitEthernet1/1/3
            mode: trunk
            trunk:
              allowed_vlans: X,10,11,X-X,X,Y,Z
          - name: TenGigabitEthernet1/1/4
            mode: trunk
            trunk:
              allowed_vlans: X,10,11,X-X,X,Y,Z
    when:
        - inventory_hostname in groups.DR13_BAT_A

    - name: Add VLANs to BAT_B and BAT_D's 10G interfaces trunks
      cisco.ios.ios_l2_interfaces:
        config:
          - name: TenGigabitEthernet1/1/3
            mode: trunk
            trunk:
              allowed_vlans: X,10,11,X-X,X
          - name: TenGigabitEthernet1/1/4
            mode: trunk
            trunk:
              allowed_vlans: X,10,11,X-X,X
    when:
        - inventory_hostname in lookup('inventory_hostnames','DR13_BAT_B:DR13_BAT_D')

Exécution d'un playbook

Entrer la commande suivante afin d'exécuter un playbook (l'option -k permet d'avoir un prompt pour renseigner le mot de passe de notre clé SSH).

ansible-playbook -i /path/to/hosts/file /path/to/playbook_name.yaml -k

Switchs Juniper

Paquets Python additionnels

Les switch Juniper nécessitent l'installation des paquets Python ci-après :

  • lxml - 4.9.2
  • ncclient - 0.6.13
$ pip install --user lxml ncclient

Ajouter sa clé SSH sur le switch

Afficher le contenu de sa clé publique :

$ cat /path/to/ssh/public/key
ssh-rsa ... user.name@myhost

Associer la clé à un utilisateur sur le switch :

[edit system login user user.name authentication]
user@host# set ssh-rsa "ssh-rsa ... user.name@myhost"
user@host# commit

Collections Ansible

Installer la collection junipernetworks.junos :

$ ansible-galaxy collection install junipernetworks.junos

Vérifier que l'on dispose bien des collections suivantes :

$ ansible-galaxy collection list
Collection            Version
--------------------- -------
ansible.netcommon     4.1.0  
ansible.utils         2.6.1
community.network     5.0.0
junipernetworks.junos 4.1.0

Variables Ansible

Utiliser les variables suivantes pour la connexion à un switch Cisco :

host_key_checking=false
ansible_ssh_user='user.name'
ansible_python_interpreter='/path/to/python/interpreter'
ansible_ssh_private_key_file='/path/to/ssh/private/key'
ansible_connection=ansible.netcommon.netconf
ansible_port=22
ansible_network_os=cisco.ios.ios

Activation de NETCONF

La configuration des switchs Juniper s'effectue via NETCONF pour tous les modules Ansible excepté junos_netconf. Il s'agit donc du mode à privilégier.

Activation de NETCONF sur le switch Juniper :

[edit system services]
user@host# set netconf ssh
user@host# set ssh
user@host# commit

Vérifier le bon fonctionnement de NETCONF en initiant une connexion SSH (OK si le mot de passe de la clé SSH est demandé) :

$ ssh user.name@host -p 22 -s netconf