Ansible er et af de mest udbredte værktøjer til netværksautomation, og i CCNA 200-301 v2.0 har det fået sit eget emne: 5.5 Use configuration management mechanisms such as Ansible to execute commands. I denne artikel gennemgår vi, hvad Ansible er, hvordan det taler med Cisco-udstyr, og hvordan du skriver dit første playbook, der kører show-kommandoer og ændrer konfiguration.

Hvad er Ansible?

Ansible er et open source-værktøj til konfigurationsstyring og automation, som i dag udvikles af Red Hat. Tre egenskaber gør det særligt velegnet til netværk:

  • Agentless: Du skal ikke installere noget på routere og switche. Ansible forbinder sig typisk med SSH, ligesom du selv ville gøre.
  • Deklarativt og læsbart: Opgaverne skrives i YAML-filer, der hedder playbooks. Selv kolleger, der ikke programmerer, kan læse dem.
  • Idempotent (når modulerne understøtter det): Kører du det samme playbook to gange, laver det kun ændringer, hvis enhedens tilstand afviger fra det ønskede.

Ansible kører fra en control node, fx en Linux-maskine eller WSL på Windows. Netværksenhederne kaldes managed nodes.

Byggestenene

Begreb Forklaring
Inventory En liste over de enheder, Ansible skal arbejde med, ofte opdelt i grupper (fx routers, switches).
Playbook En YAML-fil med én eller flere plays, som hver kører en række tasks mod en gruppe enheder.
Task Ét trin, der kalder et modul, fx “kør show version”.
Modul Koden, der udfører opgaven. Til Cisco IOS/IOS XE ligger modulerne i samlingen cisco.ios.
Variabler Værdier som brugernavn, VLAN-numre og IP-adresser, der holdes adskilt fra selve logikken.

Forbered Cisco-enheden

Ansible bruger SSH, så enheden skal have SSH slået til, have en lokal bruger og kunne nås over IP. En minimal opsætning kan se sådan ud:

R1(config)# hostname R1
R1(config)# ip domain name lab.local
R1(config)# crypto key generate rsa modulus 2048
R1(config)# ip ssh version 2
R1(config)# username ansible privilege 15 secret StaerktKodeord!
R1(config)# line vty 0 4
R1(config-line)# login local
R1(config-line)# transport input ssh
R1(config-line)# exit
R1(config)# interface GigabitEthernet0/0
R1(config-if)# ip address 192.168.10.1 255.255.255.0
R1(config-if)# no shutdown

Bekræft, at du kan logge ind med ssh ansible@192.168.10.1 fra din control node, før du går videre.

Installér Ansible og Cisco-samlingen

På en Linux-maskine med Python:

python3 -m pip install ansible
ansible-galaxy collection install cisco.ios

Inventory

Lav en fil, der hedder inventory.yml:

all:
  children:
    routers:
      hosts:
        R1:
          ansible_host: 192.168.10.1
        R2:
          ansible_host: 192.168.10.2
  vars:
    ansible_connection: ansible.netcommon.network_cli
    ansible_network_os: cisco.ios.ios
    ansible_user: ansible
    ansible_password: "{{ vault_ansible_password }}"

network_cli betyder, at Ansible åbner en SSH-session og taler med CLI’en ligesom en person, og ansible_network_os fortæller, at det er IOS/IOS XE. Gem aldrig adgangskoder i klartekst. Brug Ansible Vault (ansible-vault create secrets.yml) eller SSH-nøgler.

Dit første playbook: kør show-kommandoer

Emne 5.5 handler om at køre kommandoer med Ansible. Det klassiske eksempel er modulet cisco.ios.ios_command:

---
- name: Hent information fra routerne
  hosts: routers
  gather_facts: false
  tasks:
    - name: Kør show-kommandoer
      cisco.ios.ios_command:
        commands:
          - show version
          - show ip interface brief
      register: output

    - name: Vis resultatet
      ansible.builtin.debug:
        var: output.stdout_lines

Kør det med:

ansible-playbook -i inventory.yml show.yml

Ansible forbinder sig til R1 og R2 samtidig, kører kommandoerne og viser outputtet. På to routere sparer du ikke meget tid, men på 200 switche er forskellen enorm.

Ændr konfiguration: ios_config

Med cisco.ios.ios_config kan du sende konfigurationslinjer. Modulet sammenligner med den kørende konfiguration og sender kun de linjer, der mangler:

---
- name: Standardkonfiguration
  hosts: routers
  gather_facts: false
  tasks:
    - name: Sæt banner og NTP
      cisco.ios.ios_config:
        lines:
          - ntp server 192.168.10.254
          - logging host 192.168.10.50
          - service timestamps log datetime msec

    - name: Beskriv interface
      cisco.ios.ios_config:
        parents: interface GigabitEthernet0/0
        lines:
          - description Uplink til core
        save_when: modified

parents angiver, hvilken undertilstand linjerne hører til. save_when: modified gemmer konfigurationen (svarende til copy running-config startup-config), hvis noget er ændret.

Kør altid først med --check --diff, så du kan se, hvad Ansible ville ændre, uden at noget bliver ændret:

ansible-playbook -i inventory.yml config.yml --check --diff

Ressourcemoduler: den moderne måde

Ud over ios_command og ios_config har samlingen ressourcemoduler som cisco.ios.ios_vlans, cisco.ios.ios_interfaces og cisco.ios.ios_l3_interfaces. Her beskriver du den ønskede tilstand som data i stedet for CLI-linjer:

- name: Sørg for at VLAN 10 og 20 findes
  cisco.ios.ios_vlans:
    config:
      - vlan_id: 10
        name: Klienter
      - vlan_id: 20
        name: Servere
    state: merged

Det er tæt på tankegangen i Infrastructure as Code, hvor konfigurationen beskrives som data, gemmes i Git og rulles ud automatisk.

Ansible i forhold til andre metoder

CCNA v2.0 beder dig også beskrive forskellige management-tilgange (emne 5.3):

  • Enhedsbaseret: Du logger ind på hver enhed via CLI eller GUI.
  • Controller-baseret: En controller, fx Catalyst Center, styrer mange enheder centralt.
  • Cloud-baseret: Enhederne styres fra en cloud-portal, fx Meraki.
  • Automationsbaseret: Værktøjer som Ansible eller Python-scripts udfører opgaverne.
  • Infrastructure as Code: Hele den ønskede tilstand ligger som kode i versionsstyring.

Ansible kan bruges både som et enkelt automationsværktøj og som motoren i en IaC-arbejdsgang.

Typiske fejl

  • Forbindelsen fejler: Tjek, at SSH virker manuelt, og at ansible_network_os er sat korrekt.
  • Privilege-niveau: Hvis brugeren ikke har privilege 15, skal du bruge ansible_become: true og ansible_become_method: enable med en enable-adgangskode.
  • Timeouts på langsomme kommandoer: Hæv ansible_command_timeout.
  • YAML-indrykning: Brug mellemrum, aldrig tabulatorer.

Det skal du kunne til eksamen

  • Forklare, at Ansible er agentless og bruger SSH til netværksenheder.
  • Kende begreberne inventory, playbook, task og modul.
  • Læse et simpelt playbook og forstå, hvilke kommandoer det kører, og mod hvilke enheder.
  • Placere Ansible blandt de øvrige management-tilgange.

Øv dig selv

Lav et lab i Cisco Modeling Labs, GNS3 eller på rigtigt udstyr med to routere (Packet Tracer kan ikke styres af Ansible udefra), slå SSH til, og kør playbooket ovenfor fra en Linux-VM. Udvid det bagefter, så det gemmer show running-config i en fil for hver enhed. Så har du lavet din første automatiske backup.

Relateret: Opsætning af SSH, Show kommandoer og vores artikel om Infrastructure as Code og AI i netværksdrift.