Konfiguration mehrere Instanzen mit ansible

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

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