Siehe auch: /programming/29003420/reload-ansibles-dynamic-inventory .
Meine Frage: Gibt es eine bessere Möglichkeit, das zu tun, was unten steht?
Ich habe eine ansible Rolle, die AWS-Maschinen bereitstellt und korrekt ausgeführt wird (beachten Sie das provision
Tag):
- name: AWS provision
hosts: localhost
gather_facts: no
vars_files:
- vars/dev.yml
user: ec2-user
roles:
- provision
tags:
- provision
Ich habe dann eine base
Rolle, die ich unabhängig ausführen möchte (zum Beispiel während der Entwicklung, damit ich nicht auf die erneute Bereitstellung warten muss (beachten Sie das base
Tag). Ich führe ein Spiel aus find running instances
, in dem die Hosts gefiltert und gespeichert werden die Gruppe started
:
- name: find running instances
hosts: localhost
vars_files:
- vars/dev.yml
gather_facts: no
tags:
- base
tasks:
- name: gather remote facts
ec2_remote_facts:
region: "{{ target_aws_region }}"
filters:
instance-state-name: running
"tag:Name": "{{ instance_name }}"
register: ec2_facts
- debug: var=ec2_facts
- name: add hosts to groups
add_host:
name: "{{ item.id }}"
ansible_ssh_host: "{{ item.public_dns_name }}"
groups: started
changed_when: false
with_items: ec2_facts.instances
- name: base setup
hosts: started
gather_facts: no
vars_files:
- vars/dev.yml
user: ec2-user
roles:
- base
tags:
- base
Meine Frage: Die Stücke funktionieren, aber gibt es einen besseren Weg, dies zu tun? Zum Beispiel wurde ich gather_facts: no
verfolgt ec2_remote_facts
und das filters
- alles scheint ziemlich verworren.
Eine Klarstellung: Danke für den Kommentar zu ec2.py
- ich benutze ihn bereits in meinem ersten Spiel (wenn ich die provision
Rolle aufrufe).
Aber zu Testzwecken möchte ich in nachfolgende Spiele springen, ohne die (langsame) Bereitstellung erneut durchzuführen. Also wie kann ich meine Rechner Daten wieder bevölkern ? Wird ec2_remote_facts
gefolgt von add_host
dem richtigen Weg? Oder kann ich irgendwie verwenden gather_facts: yes
?
quelle
- meta: refresh_inventory
. Wenn Sie den ec2.py-Cache leeren möchten, möchten Sie möglicherweise seine Einstellungen anpassen, um so viel wie möglich zu filtern (dh alles außer den ec2-Instanzen, an denen Sie interessiert sind), um ihn schneller zu machen.meta: refresh_inventory
.Während dies die
meta: refresh_inventory
"bevorzugte Methode" ist, mag ich den Vorschlag von OP,ec2_remote_facts
in Verbindung mit zu verwendenadd_host
. Ich habe ein solches Playbook eingerichtet und es hat die Stärke, 100% dynamisch zu sein, ohne Störungen zwischenzuspeichern.Angenommen, Ihre ASG hat Instanzen mit dem
env: cool_asg_instance
Tag ausgelöst , fügen Sie einfach Folgendes unter demec2_asg
Playbook-Aufruf hinzu:Anschließend sammeln Sie ein vollständiges JSON- Dataset mit allen erforderlichen Informationen. Von dort aus können Sie mithilfe der
Jinja2
Funktionen im Playbook neu erstellte IP-Adressen extrahieren, z.Der Filter wurde mit freundlicher Genehmigung dieses wunderbaren Blogposts erstellt: https://bonovoxly.github.io/2016-02-11-ansible-stuffs-ec2_remote_facts_instead_of_ec2_py
Von nun an können Sie die
launched
Gruppe in Ihrer übergeordneten YAML- Bereitstellungsdatei wie folgt verwenden:Manche fragen sich vielleicht , warum die Kopfschmerzen, gut vorstellen , dass stattdessen ein abscheuliche zu haben ,
userdata
das wirdgit clone
sowohl ansible und ein Textbuch aus dem Internet, die Instanz - Setup von Ihrer eigenen Einsatzzentrale eines einfachen durch die Einrichtung auslösen kann SNS Thema , das zu einem veröffentlichen SQS Warteschlange, die von einem 10-zeiligen Python-Code ( https://github.com/alexandregama/python-sqs-consumer/blob/master/sqs-message-consumer-polling.py ) überwacht wird, der Ansible auslöst, wenn eine neue Instanz herauskommt .quelle
Ich fand das einfacher als ich erwartet hatte. Mit dem folgenden Code können Sie Playbooks für vorhandenes AWS-Inventar ausführen, was ich ursprünglich tun wollte. Basierend auf [1] und [2].
(Meine Lösung ist etwas flexibler, zB benutzerdefinierte
ansible.cfg
&ssh_config
)Richten Sie eine ansible-Konfigurationsdatei ein und verwenden Sie sie:
Richten Sie optional eine benutzerdefinierte SSH-Konfiguration ein, damit die Einstellungen Ihres Laptops nicht beeinträchtigt werden. ssh config könnte auch in durchgeführt werden
ansible.cfg.foo
, aber ich mag es, wenn es separat ist, damit ein vorhandenes~/.ssh/config
von Dritten verwendet werden kann.Führen Sie Ihr Spielbuch aus:
Wo das Playbook wie folgt aussehen könnte. aws-Tags (z. B.
tag_env_test
) werden zur Auswahl von Hosts verwendet.Ich
./ec2.py --list > ../ec2_output.txt
untersuche Hosts, die ich auswählen möchte.Ich habe Jukkas Antwort als Lösung markiert, um ihm für seine Hilfe zu danken :-)
[1] http://www.slideshare.net/bfschott/using-ansible-dynamic-inventory-with-amazon-ec2
[2] https://aws.amazon.com/blogs/apn/getting-started-with-ansible-and-dynamic-amazon-ec2-inventory-management/
quelle