Ansible: Globale Variablen

Normalerweise kann man in ansible nur auf die Variablen des gerade ausführenden hosts zugreifen. Ein Konzept von „Globalen Variablen“, welche im ganzen Playbook gültig sind gibt es nicht.
Man kann sich jedoch behelfen, in dem man einfach die Variablen eines bestimmten Hosts zugreift.

Wenn man beispielsweise gewisse Taks auf dem Localhost macht, dann etwas auf einem entfernten Rechner und dann wieder in Localhost auf eine Variable eines Tasks auf dem entfernten Rechner zugreifen will ist die normalerweise leer, weil lokal.

Nachfolgend deshalb ein Beispiel:

- hosts:           server.example.net
  tasks:
    - name:        Get memory usage
      command:     /usr/bin/free -m
      register:    memory_usage
      changed_when: false
 

- hosts:           localhost
  tasks:
    - name:        Output free memory of server.example.net
      debug:
        msg:       "Free memory on Server {{ memory_usage.stdout }}"
#   [...]
    - name:        Write logfile
      template:
        src:       ansible-tasks.log.j2
        dest:      tmp/ansible-tasks.log

Dies würde beim Task: „Output free memory of server.example.net“ jetzt einen Fehler werfen, weil die Variable auf localhost gar nicht gesetzt ist, sondern nur auf server.example.net.

Will man trotzdem auf die Variable zugreifen, geht man einfach über die hostvars Variable:

{{ hostvars['server.example.net']['memory_usage'].stdout }}

Bzw. .dann als volles Beispiel:

- hosts:           server.example.net
  tasks:
    - name:        Get memory usage
      command:     /usr/bin/free -m
      register:    memory_usage
      changed_when: false
 

- hosts:           localhost
  tasks:
    - name:        Output free memory of server.example.net
      debug:
        msg:       "Free memory on Server {{ hostvars['server.example.net']['memory_usage'].stdout }}"
#   [...]
    - name:        Write logfile
      template:
        src:       ansible-tasks.log.j2
        dest:      tmp/ansible-tasks.log

Das ganze funktioniert natürlich auch in einem jinja template wie im zweiten Task des Beispiels („Write logfile„):

templates/ansible-tasks.log.j2

Speicherverbrauch auf dem Server:
{{ hostvars['server.example.net']['memory_usage'].stdout | default('UNDEFINED') }}

Referenzen

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert