ATIX weekly Snippet – Teil 1: Dynamisches Hinzufügen von Webservern zu einem Loadbalancer mit Ansible

Letzte Woche hatten wir in einem Ansible-Kundenprojekt Webserver die wir dynamisch zu einem Loadbalancer hinzufügen wollten. Dafür gab es zwei Host-Groups im Inventory:

inventory.ini

[webserver]
server1
server2
server3

[loadbalancer]
server4
playbook.yaml
- name: Configure Loadbalancer
  hosts: loadbalancer
  role: configure_loadbalancer

In der zugehörigen Ansible Role benutzen wir dann ein Jinja-Template, dass die IP-Adressen der Webserver abfragt und einträgt. Dazu benutzen wir Ansible-facts, im speziellen Fall „ansible_default_ipv4.address“:

{% for host in groups['webserver'] %}
{{ hostvars[host]['ansible_default_ipv4']['address'] }}:443
{% if not loop.last %},{% endif %}{% endfor %}

Dabei stießen wir jedoch immer wieder auf folgende Fehlermeldung:

"AnsibleUndefinedVariable: 'dict object' has no attribute
'ansible_default_ipv4'"

Nach einigem Debuggen stellte sich heraus, dass Ansible facts nur für Hosts einsammelt, die auch im Playbook adressiert werden. Dass macht gerade bei größeren Setups durchaus Sinn: Wer will auf 2000 Server warten, wenn er nur auf einem eine Änderung durchführen möchte.

Nachdem das obige Playbook nur auf der Hostgruppe „loadbalancer“ läuft, sind für „webserver“ keine facts bekannt. Nach diesem Erkentnissgewinn war die Lösung dann relativ simpel:
Ein zweites Play im Playbook, dass keine expliziten tasks enthält, aber
für die Hostgruppe die notwendigen facts einsammelt.

playbook_corrected.yaml
- name: Dummy Play to collect facts
  hosts: webserver
  tasks: []

- name: Configure Loadbalancer
  hosts: loadbalancer
  role: configure_loadbalancer
The following two tabs change content below.

Bernhard Hopfenmüller

Neueste Artikel von Bernhard Hopfenmüller (alle ansehen)