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') }} |