Ansible - Variabler

Ansible - Variabler


Variabler kan ikke starte med et tall, ha mellomrom, bindestrek eller spesialtegn.
Variabler kan inneholde bokstaver, tall og understrek.
Eksempler på godkjente variabler:



For å bruke variabler i Ansible så bruker vi {{ variabelnavn }}

Ansible har også en rekke innebygde variabler som vi kan bruke.
Disse blir referert til som Magic Variables.
Eksempler på Magic Variables:


Du finner en liste over alle Magic Variables på Ansible sin nettside. https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#magic-variables

I dette eksmepelet legges variabler inn playbooken.
Playbooken kjører en task som bruker ios_ping modul som pinger gatewayen.
De 4 neste er debug tasks som skriver ut resultatet fra ios_ping.
Du kan bruke var: ping for å skrive ut resultatet fra ios_ping.
Du kan også bruke msg: "{{ ping }}" for å skrive ut resultatet fra ios_ping.
Husk at du må bruke " " rundt variabelen for å skrive ut resultatet.
Hvis du har teskt forann så kan du bruke tekst {{ variabel }} for å skrive ut resultatet.
Men dette er ikke beste praksis.

---
- name: Nettverk versjon switcher
  hosts: switcher, rutere
  connection: network_cli
  gather_facts: no

  vars:
    ip: 10.170.0.1

  tasks:
    - name: Ping switcher og rutere
      ios_ping:
        dest: "{{ ip }}"
        count: 1
      register: ping

    - name: Ping resultat fra var ping
      debug:
        var: ping

    - name: Melding skriver bare ut ping pong
      debug:
        msg: ping pong
  
    - name: Ping resultat fra registert variabel mot {{ ip }}
      debug:
        msg: "{{ ping }}"
    
    - name: Dette fungerer også, men er ikke anbefalt. Bruk " " rundt variabler.
      debug:
        msg: tekst {{ ping }}
        
                


Vi kan bruke magic variables til å lage en task hvor alle nettverks enheter pinger hverandre.
Det å bruke debug er en fin måte å få ut informasjon om hva Magic variables inneholder.
---
- name: Nettverk versjon switcher
  hosts: switcher, rutere
  connection: network_cli
  gather_facts: no
  
  tasks:

  - name: hostvars
    debug:
      var: hostvars
  - name: ansible_host
    debug:
      var: ansible_host

  - name: Ping switcher og rutere
    ios_ping:
      dest: "{{ hostvars[item]['ansible_host'] }}"
      count: 1
    register: ping
    loop: "{{ ansible_play_hosts }}"
                


Hvordan blir variabler prioritert i Ansible?
Variabler i Ansible har en rekke prioriteringer.
Dette er en liste over prioriteringene, hvor 1 har minst prioritering og 22 har den øverste.

Listen er hentet fra https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

Eksempel på extra vars
Extra vars er variabler som blir satt når du kjører playbooken.
Disse har den høyeste prioriteringen.
Du kan endre variabler som er satt i playbooken ved å bruke extra vars.
Her er et eksempel ved å bruke ios_ping playbooken fra tidligere.

playbook_nettverk_ios_ping_gw_extra_vars.yaml
---
- name: Nettverk versjon switcher
  hosts: switcher, rutere
  connection: network_cli
  gather_facts: no

  vars:
    ip: 10.170.0.1

  tasks:
    - name: "Ping fra {{ ansible_play_hosts }} mot {{ ip }}"
      ios_ping:
        dest: "{{ ip }}"
        count: 1
      register: ping
  
    - name: Ping resultat fra {{ ansible_play_hosts  }} mot {{ ip }}
      debug:
        msg: "{{ ping }}"

Du endrer variabelen ip ved å bruke --extra-vars "ip=10.170.0.231
Du bruker -l til å spesifisere hvilke hoster som skal kjøre playbooken.
ansible-playbook playbook_nettverk_ios_ping_gw_extra_vars.yaml -k -l IOS_switch_2 --extra-vars "ip=10.170.0.231"
PLAY [Nettverk versjon switcher] *******************************************************************************************************************************************************************************************************

TASK [Ping fra ['IOS_switch_2'] mot 10.170.0.231] **************************************************************************************************************************************************************************************
ok: [IOS_switch_2]

TASK [Ping resultat fra ['IOS_switch_2'] mot 10.170.0.231] *****************************************************************************************************************************************************************************
ok: [IOS_switch_2] => {
    "msg": {
        "changed": false,
        "commands": "ping ip 10.170.0.231 repeat 1",
        "failed": false,
        "packet_loss": "0%",
        "packets_rx": 1,
        "packets_tx": 1,
        "rtt": {
            "avg": 1,
            "max": 1,
            "min": 1
        }
    }
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
IOS_switch_2               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Selv om dette var et eksempel på hvordan du kan overstyre variabler, så kan oppgaven løses på en annen måte.
Du kunne utført det samme med en add hoc command.
Denne kommandoen hadde gitt samme resultat som playbooken.
ansible -m ios_ping -a "dest=10.170.0.231" IOS_switch_2 -k
IOS_switch_2 | SUCCESS => {
    "changed": false,
    "commands": "ping ip 10.170.0.231",
    "packet_loss": "0%",
    "packets_rx": 5,
    "packets_tx": 5,
    "rtt": {
        "avg": 2,
        "max": 2,
        "min": 2
    }
}