In manchen Szenarien gibt es mehrere Instanzen einer Software und jede hat ein eigenes systemd unit file in der Form app-instance-X
.
Man kann nun natürlich durch die verschiedenen Instanzen loopen, möchte aber nur jeweils diese neu starten, wo sich die Konfiguration auch geändert hat.
Um dieses Ziel zu erreichen muss man zusätzlich mit register:
arbeiten, wodurch man später im handler wiederum durch diesen loopen kann.
Hier ein Beispiel:
host_vars/server.yaml
app_instances:
- name: app1
- name: dev
tasks/main.yaml
- name: Configure app instances
template:
src: "templates/instance.properties.j2"
dest: "{{ app_home }}/instances/{{ item.name }}/instance.properties"
with_items: "{{ app_instances }}"
loop_control:
label: "Configuring instance: {{ item.name }}"
notify: "restart app-instance"
register: __configure_instances
handlers/main.yaml
- name: restart app-instance
systemd:
name: "app-instance-{{ item.item.name }}"
state: restarted
with_items: "{{ __configure_instances.results }}"
when: item.changed
loop_control:
label: "Restarting instance: {{ item.item.name }}"
In tasks/main.yaml
Werden alle Instanzen mit einem template
konfiguriert und der Wert der Änderung in der Variable __configure_instances
gespeichert. In handlers/main.yaml
durchlaufen wir dann diese Variable und starten nur die Instanzen neu, welche das changed
Flag beinhalten.
Weitere Informationen
- https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html
- https://stackoverflow.com/questions/25694249/ansible-using-with-items-with-notify-handler
- https://stackoverflow.com/questions/53211680/loop-vars-with-loop-control-and-loop-var-ansible
- https://stackoverflow.com/questions/41233117/run-ansible-handlers-based-on-changed-results-in-multiple-loops
- https://stackoverflow.com/questions/46171127/ansible-notify-handler-with-items