ansible run globale Variable

8

Ich möchte mit ansible einen Servercluster erstellen.

In einem Hauptspielbuch füge ich einige Unterspielbücher hinzu.

- include: playbook_commandserver.yml
- include: playbook_agent.yml

In der Datei playbook_commandserver.yml erstelle ich den Befehlsserver (auf aws). Dann löse ich eine Rolle aus, die das set_factModul verwendet, um sich den DNS-Namen des Befehlsservers zu merken:

- name: Get hostname of command server
  shell: /usr/bin/host $(/usr/bin/curl -s http://ipecho.net/plain) | /usr/bin/awk '{print $5}' | /usr/bin/awk -F 'aws.com' '{print $1"aws.com"}'
  register: cs
- name: Set hostname of command server as fact
  set_fact: commandserver="{{ cs.stdout }}"

Die commandserverTatsache ist im selben Spiel verfügbar, aber nicht im selben Spielbuch. Ganz zu schweigen von dem playbook_agent.yml, das später aufgenommen wird. Und genau dort müsste ich auf diese Befehlsserver-Tatsache zugreifen.

Wie setzt / speichert man also Variablen, die für den gesamten Ansible-Run gültig sind?

Ich habe Folgendes gefunden: /programming/26732241/ansible-save-registered-variable-to-file Für mich sieht dies jedoch nach einem hässlichen Hack aus.

Gibt es keine bessere Lösung für dieses Problem? Gibt es keine Möglichkeit, eine Variable festzulegen, die für den gesamten Ansible-Lauf gültig ist?

doh-nutz
quelle

Antworten:

12

Ja, das ist möglich. Wenn Sie mit dem set_factModul einen Fakt festlegen , ist dieser Fakt über "Hostvars" zugänglich. Wenn Sie also Ihren variablen Befehlsserver wie folgt definieren:

  - name: Set hostname of command server as fact
    set_fact: commandserver="{{ cs.stdout }}"

Dann können Sie auf diese Weise in anderen enthaltenen Playbooks desselben Spiels auf diese Weise zugreifen (das Debug-Modul ist nur ein Beispiel):

  - debug: msg="{{ hostvars['put the hostname in here']['commandserver'] }}"
A.Hab
quelle