Ansible Variablen

Ich mache nicht sehr viel mit Ansible und es passiert recht schnell, dass ich etwas neues lerne. Das neuste Projekt ist fuer das Heimnetzwerk Domain Namen zu vergeben.

Der erste Ansatz war eine Liste aus Variablen zu erstellen und an eine Rolle zu uebergeben. Ein Template hat dann alle Paerchen in der Liste in die Konfigurationsdatei eingetragen. Das sah dann wie folgt aus:

  vars:
    dnsmasq_domains_vars:
      - domain: "pi.hole"
        ip: "192.168.0.2"
      - domain: "pihole.home"
        ip: "192.168.0.2"

  roles:
    - role: pihole
      vars:
        - dnsmasq_domains: "{{ dnsmasq_domains_vars }}"

Und das Template:

{% for item in dnsmasq_domains %}
{{ item.ip }} {{ item.domain }}
{% endfor %}

So werden alle Paare saeuberlich aufgerollt.

Natuerlich bedeutet das viel Schreibarbeit, wenn man jede IP und Domain ausformulieren muss. Es wuerde viel mehr Sinn machen einer IP mehrere Domains zuordnen zu koennen. Und wenn es nicht direkt im Playbook stehen wuerde, waere es vielleicht sauber.

Der erste Schritt ist eine neue Datei vars.yml anzulegen. Die neuen Bloecke sind etwas einfacher gestaltet:

dns:
    '192.168.178.10':
        - 'pihole.home'
        - 'pi.hole'
        - 'dns.home'

Im Playbook muss die Datei zuerst geladen werden und dann muessen die selben Paare wie in der oberen Variante erstellt werden. Das muss noch vor dem Ausfuehren der Rollen passieren, deswegen muss das Tag pre_task verwendet werden.

  user: ansible
  pre_tasks:
  - name: Include vm variables
    include_vars:
      file: vars/vms.yml
      name: vms

  - set_fact:
      domain_names: |
        {% set res = [] -%}
        {% for key in vms.dns.keys() -%}
          {% for value in vms.dns[key] -%}
            {% set ignored = res.extend([{'ip': key, 'domain':value}]) -%}
          {%- endfor %}
        {%- endfor %}
        {{ res }}

Im Schritt set_fact wird per Jinja Template eine Liste aller IP-Domain Paare erstellt und in der Variablen domain_names gespeichert.

Erst danach kann der Rolle diese Liste uebergeben werden:

  roles:
    - role: pihole
      vars:
        - dnsmasq_domains: "{{ domain_names }}"