it-swarm.com.de

Laden Sie das dynamische Inventar von Ansible neu

Ich verwende Ansible, um EC2-Instanzen einzurichten und eine App bereitzustellen. Es gibt ein Hostskript, das Tags für verwandte Server und Gruppeninformationen sammelt. Ich möchte diese Aktionen als ein einzelnes Wiedergabebuch ausführen

  1. Bei Bedarf werden neue Instanzen erstellt
  2. Hosts-Skript lädt Inventar (einschließlich der Fakten der Server)
  3. Bereitstellungs-Playbook funktioniert

Das Inventar wird jedoch im Voraus geladen, sodass keine Server-/Gruppendaten vorhanden sind, wenn Server während des Spiels erstellt/aktualisiert werden. Ich kann 1) Bereitstellungs- und Bereitstellungs-Playbooks trennen 2) add_Host-Trick verwenden, um dynamisches Inventar zu emulieren, wenn Server aktualisiert werden. Diese Ansätze weisen jedoch Nachteile auf.

Kann ich Ansible zwingen, Inventar neu zu laden? Meine Testdateien sind: hosts script:

#!/bin/sh
echo `date` >> log.log
echo "{\"standalone\":[\"localhost\"]}"

Stichprobe playbook.yml:

---
- hosts: all
  tasks:
    - name: show inventory_hostname
      command: echo {{ inventory_hostname }}

Ich führe es aus ansible-playbook -i hosts playbook.yml -v und siehe zwei läuft:

$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015

aber ich habe keinen Befehl gefunden, um es zu verdoppeln.

45

Mit Ansible 2.0+ können Sie Ihr Inventar mitten im Spiel aktualisieren, indem Sie task ausführen:

- meta: refresh_inventory
44
James Orenthal

Ich fand den meta: refresh_inventory Unzureichend.
Ich musste zuerst einen expliziten Aufruf zu ec2.py --refresh-cache Hinzufügen.

 - Name: Inventar aktualisieren 
 Hosts: Localhost 
 Verbindung: Local 
 Gather_Facts: Falsche 
 Aufgaben: 
 - Name: Aktualisieren EC2-Cache 
 Befehl: /etc/ansible/ec2.py --refresh-cache 
 - Name: EC2-Cache im Speicher aktualisieren 
 Meta: refresh_inventory 
18
dsz

Ansible unterstützt dies derzeit nicht. Wenn Sie sich den Quellcode der Befehle ansible oder ansible-playbook Ansehen, werden Sie feststellen, dass zuerst das Inventar geladen und dann das Inventarobjekt an den ansible-Befehl übergeben wird, der die angegebene Aufgabe oder ausführt Spielbuch. Die Inventarverarbeitung so zu verschieben, dass sie innerhalb der Task-/Playbook-Handler abläuft, wäre wahrscheinlich aus mehreren Gründen ein ziemlich großes Unterfangen.

Wenn Sie so etwas tun, ist es am besten, Ihr Playbook in zwei Teile aufzuteilen und ihre Aufrufe in ein Shell-Skript zu packen, das Sie nur einmal aufrufen müssen.

7
Bruce P

Sie können auch die Datei ec2.ini bearbeiten und die Option festlegen:

cache_max_age = 0

um die Notwendigkeit eines erneuten Ladens zu vermeiden, stellen Sie sicher, dass überhaupt nichts zwischengespeichert ist.

1
fuzzygroup