Ansible kann auf Mehrere Arten mit Cisco-Devices zusammen arbeiten. Dieser Artikel beschreibt eine einfache und direkte Interaktion.
Natürlich muss Ansible sich auf dem Router oder Switch anmelden können.. Dazu wird der User auf dem Gerät (hier ist es ein Cisco 1921 Router) als privilegiertes Login angelegt.
username ansible privilege 15 password ansiblepwd
Der User ansible kann natürlich auch als ‘normaler’, also nicht-privilegierter User angelegt werden, jedoch müssen dann zusätzlich die Variablen
ansible_become=yes ansible_become_method=enable ansible_become_password=ena-PW_des_Routers
in der Variable-Sektion des Hosts-Files angelegt werden, damit Ansible in den enable-Modus wechseln kann.
Ausserdem wird in der entsprechenden Sektion angegeben welches Betriebssystem die Router verwenden, in diesem Fall ios.
Es bietet sich an, hier zwischen Router(n), Core-, Distributions und Access-Switches zu unterteilen, da diese Gruppen zwar untereinander ähnlich bis gleich konfiguriert werden, zwischen den Gruppen aber große Unterschiede vorhanden sind… Speziell Router und Firewalls sollte man sehr genau betracheten, da diese (neben Core-Switches) IP-Netze halten und entstrechend individuell konfiguriert werden müssen.
In diesem Beispiel hat die Gruppe Routers nur ein Mitglied,
[Router] 172.16.199.2 [Router:vars] ansible_user=ansible ansible_password=ansiblepwd ansible_network_os=ios
Damit kann schon grundsätzlich auf den Router zugegriffen werden. Dazu folgt nun ein einfaches Playbook:
--- - name: CiscoTest hosts: 172.16.199.2 gather_facts: false connection: network_cli tasks: - name: Set Interfaces ios_command: commands: - conf t - interface GigabitEthernet0/1.254 - description ClientB VLAN254 Ansible Test - encapsulation dot1Q 254 - ip address 172.16.254.1 255.255.255.0 - ip helper-address 172.16.199.11 - ip helper-address 172.16.199.12 - end - wr - name: Show Interfaces ios_command: commands: - sh ip int br register: output - name: Print Output debug: var: output.stdout_lines
Das Playbook heißt CiscoTest und wird direkt auf den Host 172.16.199.2 angewandt. Ein Sammeln von Informationen wird nicht gestartet (gather_facts ist false) und die Verbindung soll direkt auf das CLI des Routers gehen (connection=network_cli). Das Playbook enthält drei aufeinander folgende Aufgaben/Tasks. Der erste (Set Interfaces) baut auf dem Router das VLAN-Interface GigabitEthernet 0/1.254 auf und trunkt es per 802.1Q, IP-Adresse und IP-Helper weden zugewiesen, damit im Subnetz Clients auf die verfügbaren DHCP-Server geleitet werden können. Nun wird noch die Konfiguration auf dem Router gespeichert und der Task ist beendet.
Die Ausgaben auf dem CLI sind in diesem Fall irrelevant, da der Router nach den einzelnen Kommandeos nichts ausgibt.
Der zweite Task, Show Interfaces fasst alle Interfaces zusammen und es ist gleich zu sehen, ob die Konfiguration erfolgreich durchgeführt werden konnte. In diesem Fall ist die Ausgabe wichtig, daher wird sie über register in die Variable output gespeichert und im dritten Task, Print Output, angezeigt.
Die Ausführung des Playbooks zeigt dann Folgendes:
[user1@ansible playbooks]$ ansible-playbook ciscotest.yml  
PLAY [CiscoTest] ************************************************************************************************************************************************ 
TASK [Set Interfaces] ******************************************************************************************************************************************* 
ok: [172.16.199.2] 
TASK [Show Interfaces] ****************************************************************************************************************************************** 
ok: [172.16.199.2] 
TASK [Print Output] ********************************************************************************************************************************************* 
ok: [172.16.199.2] => { 
   "output.stdout_lines": [ 
       [ 
           "Interface                  IP-Address      OK? Method Status                Protocol", 
           "Embedded-Service-Engine0/0 unassigned      YES NVRAM  administratively down down    ", 
           "GigabitEthernet0/0         172.16.199.2    YES NVRAM  up                    up      ", 
           "GigabitEthernet0/1         172.16.200.1    YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.1       10.10.1.1       YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.10      172.16.210.1    YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.11      172.16.211.1    YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.20      172.16.220.1    YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.21      172.16.21.1     YES manual down                  down    ", 
           "GigabitEthernet0/1.100     10.10.100.1     YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.200     10.10.200.1     YES NVRAM  down                  down    ", 
           "GigabitEthernet0/1.254     172.16.254.1    YES manual down                  down    ", 
           "GigabitEthernet0/1.300     10.10.30.1      YES NVRAM  down                  down" 
       ] 
   ] 
} 
PLAY RECAP ****************************************************************************************************************************************************** 
172.16.199.2               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    
[user1@ansible playbooks]$
Das Recap zeigt, dass 3 Tasks erfolgreich auf dem Router durchgeführt wurden, was der router in seiner Konfigurationsdatei auch bestätigt.
r-test#sh run int gi0/1.254 Building configuration... Current configuration : 212 bytes ! interface GigabitEthernet0/1.254 description ClientB VLAN254 Ansible Test encapsulation dot1Q 254 ip address 172.16.254.1 255.255.255.0 ip helper-address 172.16.199.11 ip helper-address 172.16.199.12 end