Ansible: with_loops konfigurierbar machen

Erstellt am 25. Aug. 2015  ·  90Kommentare  ·  Quelle: ansible/ansible

PROBLEMTYP

Feature-Idee

KOMPONENTENNAME

Ader

ANSIBLE-VERSION

2.1

AUFBAU
Betriebssystem / Umgebung
ZUSAMMENFASSUNG
how: 
    forks: 1
    pause: 0
    squash: name
    label: "{{item.name}}"
    end: on_fail
with_items: ...
  • forks: Gabeln innerhalb der Schleife, um Dinge parallel auszuführen, Standardwert 1, dies erfordert Warnungen
  • Pause: zwischen Schleifenausführungen, nützlich in gedrosseltem API-Szenario _Fertig in 2.2_
  • squash: Alle Elemente in die Liste eintragen und zur bereitgestellten Option übergehen, funktioniert wie aktuelle hartcodierte Optionen für apt, yum usw., standardmäßig sollte es None sein _abandon_: umgekehrte Meinung, wir sollten diese Funktion entfernen
  • Ende: Wann soll die Schleife unterbrochen werden, Standard ist 'letztes Element', Optionen? on_fail, on_success (erste)?
  • label: (#13710) was bei der Ausgabe der Item-Schleife angezeigt werden soll _Done in 2.2_

Dokumente zum aktuellen Stand unter:

http://docs.ansible.com/ansible/playbooks_loops.html#loop -control

SCHRITTE ZUM REPRODUZIEREN
ERWARTETE ERGEBNISSE
TATSÄCHLICHE ERGEBNISSE
affects_2.1 affects_2.3 feature core

Hilfreichster Kommentar

+1 Gabeln

Ich warte darauf, dass Openstack-Module with_ -Schleifen für mehr als 100 Elemente durchlaufen ...
image

Alle 90 Kommentare

Nennen wir es bitte nicht how . Das ist noch schlimmer zu lesen als become: true . Aber die Funktionalität darunter sieht toll aus.

enthält Fix für #10695

Exzellent. Nennen Sie es im Interesse des Bikesheddings vielleicht looping: .

:+1:

+1

+1 speziell für die Parallelisierung innerhalb des Hosts!

:+1:

:+1:
aber nennen wir es nicht "wie"

Hier ist also eine Problemumgehung, um eine Schleifenaufgabe nach dem ersten Fehler zu unterbrechen

- hosts: localhost
  vars:
    myvar:
        - 1
        - 2
        - 3
        - 4
        - 5
  tasks:
    - name: break loop after 3
      debug: msg={{item}}
      failed_when: item == 3
      register: myresults
      when: not (myresults|default({}))|failed
      with_items: "{{myvar}}"

@bcoca funktioniert nicht vom Ende (ansible 1.9.3 ubuntu )

AUFGABE: [Schleife nach 3 unterbrechen] * * * * * * * * * * * * * * * ** *
ok: [localhost] => (item=1) => {
"fehlgeschlagen": falsch,
"failed_when_result": falsch,
"Gegenstand 1,
"Nachricht": "1"
}
ok: [localhost] => (item=2) => {
"fehlgeschlagen": falsch,
"failed_when_result": falsch,
"Artikel": 2,
"Nachricht": "2"
}
fehlgeschlagen: [localhost] => (item=3) => {"failed": true, "failed_when_result": true, "item": 3, "verbose_always": true}
Nachricht: 3
ok: [localhost] => (item=4) => {
"fehlgeschlagen": falsch,
"failed_when_result": falsch,
"Artikel": 4,
"Nachricht": "4"
}
ok: [localhost] => (item=5) => {
"fehlgeschlagen": falsch,
"failed_when_result": falsch,
"Artikel": 5,
"Nachricht": "5"
}

ah, ja, es wird wie in 2.0 funktionieren, da in 1.9 die Registrierung nicht erfolgt, bis die Schleife abgeschlossen ist.

+1 auf Gabeln

+1
vielleicht statt "how", loop_details oder options?

+1

+1, wait_for von localhost zu verwenden, um auf 100 EC2-Hosts zu warten, bringt mich um ...

+1 aus ähnlichem Grund wie Senderista

+1

:+1:

Sowohl squash als auch forks wären großartige Funktionen, die die Ausführung von Ansible enorm beschleunigen würden.

Ich würde auch how durch etwas wie loop_details , loop_settings , loop_options oder ähnliches ersetzen.

loop_control , bereits in 2.1 mit implementiertem label Teil.

squash könnte einfach verschwinden, da es einfach ist, einfach eine Liste an die Module zu übergeben, die es unterstützen:

apt: name={{listofpackages}}

und vermeiden Sie die Schleife vollständig

+1 Gabeln

+1 Gabeln

Ich hatte einen Anwendungsfall für eine neue Konfiguration für eine bedingte Unterbrechung break_when

+1 Gabeln und ich hoffe, es funktioniert auch für die Parallelisierung von Aufgabenfolgen, die wie folgt ausgeführt werden:
- include: service.yml
with_items: "{{services|default([])}}"

Ansonsten gibt es die async/async_status schon.

+1 Gabeln

Ich warte darauf, dass Openstack-Module with_ -Schleifen für mehr als 100 Elemente durchlaufen ...
image

+1 auf Gabeln. Könnte dies zum Kopieren von AMIs in alle AWS-Regionen verwenden.

+1 auf Gabeln. Bitte! machen Sie es zu einem Teil von loop_control

+1 auf Gabeln

+1 auf Gabeln

+1, brauche auch Gabeln :-)

+1 auf Gabeln

+1 auf Gabeln

Gabeln wären großartig, +1

Ich sitze immer schweigend da und möchte nicht zum Spam beitragen, weil es schwierig ist, zwischen Projekten einzuschätzen, ob es willkommen ist oder nicht, aber es sieht so aus, als hätte der Gabelzug +1 den Bahnhof verlassen!

+1 auf Gabeln

+1 auf Gabeln

+1 auf Gabeln

:+1: auf Gabeln

@bcoca Grüße! Vielen Dank, dass Sie sich die Zeit genommen haben, dieses Problem zu eröffnen. Damit die Community Ihr Problem effektiv bearbeiten kann, benötigen wir etwas mehr Informationen.

Hier sind die Artikel, die wir in Ihrer Beschreibung nicht finden konnten:

  • Problemtyp
  • ansible Version
  • Komponentenname

Bitte legen Sie die Beschreibung dieses Problems mit dieser Vorlage fest:
https://raw.githubusercontent.com/ansible/ansible/devel/.github/ISSUE_TEMPLATE.md

Klicken Sie hier, um Bot-Hilfe zu erhalten

+1 auf Gabeln

+1 auf Gabeln!

+1 auf Gabeln!

+1 auf Gabeln!

+1 auf Gabeln!

Gibt es ein Update zur Fork? Wann soll es fertig sein?
Mein Anwendungsfall ist die Instanziierung von etwa 20 Containern auf einem Server mit with_sequence . Jetzt dauert es zu lange :(
Ich würde gerne helfen, aber ich bräuchte ein paar Tipps, wo ich die Hände hinlegen kann

@bitliner niemand hat eine PR dafür erstellt, wenn Sie danach fragen, ist es eigentlich sehr schwer, es richtig zu machen.

Was Ihr Problem betrifft, deklarieren Sie einfach X-Hosts im Inventar und durchlaufen Sie hosts: anstelle von with_ , um sie parallel zu erstellen.

Inventar:

[containers]
container[000:020]
hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

dh container ist ein 'erfundenes' Modul.

@bcoca deine Lösung ist mir nicht klar. Um sicher zu sein, meinst du das?

hosts -Datei

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100
... and so on based on the degree of parallelism I want to get ...

main.yml -Datei

hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

basierend auf einem Containermodul , das ich implementieren sollte, richtig? In diesem Fall hätte ich alle Container mit demselben Namen, und das ist nicht akzeptabel, richtig?

Was sind außerdem die Herausforderungen, um Loops korrekt parallel zu implementieren?

Mein Anwendungsfall muss diese Aufgabe beschleunigen:

- name: "Start clients"
  docker_container:
    name: "mycontainer-{{ item }}"
    image: myimage
    links: 
      - server-{{item}}:server-{{item}}
  with_sequence: count={{ scale }}

Ich kann docker-compose scale nicht verwenden, da ich den Datenverkehr zwischen Containern auf eine bestimmte Weise weiterleiten muss (deshalb verwende ich with_sequence , um verschiedene Docker-Containernamen zu generieren).

Ich könnte ein Modul bauen, das die Deklaration eines Containers übernimmt und basierend auf einem Skalierungsparameter remote mehrere Container parallel instanziiert. Macht das Sinn? Haben Sie Hilfe, um zu verstehen, wie Sie das docker_container-Modul in myModule aufrufen/wiederverwenden und welche APIs Ansible anbietet, um etwas parallel auszuführen?

@bitliner Sie haben meine Anweisungen nicht befolgt, ich hatte eindeutige Namen im Inventar (mit Bereich, um wie eine Sequenz zu funktionieren). Da Namen im Inventar eindeutig sind, haben Sie gerade denselben Namen N-mal deklariert, haben aber immer noch einen Host, was Ihr zweites Problem bei doppelten Namen von Containern nicht verursacht, da Sie nur einen Host durchlaufen.

Wenn Sie Ihr Problem weiterverfolgen möchten, verwenden Sie auf jeden Fall ML oder IRC, da dies für dieses Ticket etwas vom Thema abweicht.

@bcoca Wie kann ich einen Host haben, wenn Sie 20 Hosts deklariert haben?

[containers]
container[000:020]

wird eine Verbindung zu container001 , container002 usw. herstellen.

Es funktioniert für eindeutige Namen, aber mir ist nicht klar, warum Sie sagen, ich habe immer noch einen Host (statt 20).
hosts:containers bedeutet für mich 20 Hosts, nicht nur einen. Was übersehe ich bei dieser Lösung?

@bitliner verursacht dies:

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100

sind nicht 4 Hosts, sondern 1

Auch an dieser Stelle ist dies ziemlich vom Thema abgekommen. Wenn Sie weiterhin Hilfe dazu erhalten möchten, gehen Sie zu IRC oder ML

Ich habe mit gelöst

[containers]
ip[000:020] ansible_host=192.168.1.100

und

- name: "Start containers"
  docker_container:
    name: "my-container-{{ inventory_hostname }}"

Eine Frage: Um eine fork -Anweisung hinzuzufügen, würden die Änderungen darin bestehen, die Methode run_loop neu zu schreiben, damit sie den Grad der Parallelität und die Asynchronität verwaltet?

und dann fängt es an 'lustig' zu werden ...:

  • Zählt der Loop-Fork gegen das globale --forks , machen Sie das per Remote?
  • Was tun mit Schleifen, wenn Elemente von vorherigen Elementen abhängen (nicht nur Aufgabenausführung, sondern Bedingungen usw.)?
  • Wie werden Parallelitätsprobleme behandelt, wenn mehrere Forks auf demselben Host ausgeführt werden? dh sie aktualisieren dieselbe Datei
  • Wie gehen wir mit der Reinigung um? Im Moment können sie tmp-Verzeichnisse wiederverwenden. Aber jede Ausführung bereinigt nach sich selbst, jetzt kann dies Probleme verursachen.

Und es gibt ein paar andere Probleme, die ich kenne ... sicher gibt es viele, die mir nicht bewusst sind, bis jemand versucht, sie zu implementieren. Ich habe Lösungen für ein paar, aber es fängt ziemlich schnell an, außer Kontrolle zu geraten.

@bcoca Loop Forking sollte standardmäßig nicht aktiviert sein. Ich würde es vorziehen, den Standardwert auf 1 zu sehen und ihn als Parameter forks oder serial einzuführen, aber eine Warnung einzuschließen. Es wird wahrscheinlich einen vorhandenen Code brechen. Davon abgesehen freue ich mich sehr auf diese Funktion (insbesondere für Aufgaben, die delegate_to erfordern).

+1 für Gabeln (standardmäßig falsch)

+1 Gabeln

+1 Gabeln

+1 Gabeln

+1 Gabeln

+1 Gabeln

+1 auch für Forks, aber inzwischen gibt es auch ein neues Ansible-Strategie-Plugin, das allgemein eine große Leistungssteigerung bringt, und auch für with_items -Loops. Vielleicht ist es für diejenigen, die aus Leistungsgründen Gabeln wollen, einen Blick wert:

https://github.com/dw/mitogen
https://mitogen.readthedocs.io/en/latest/ansible.html

Ich kann nicht sehen, wie dies die with_items-Schleifen genau verbessern wird. Dieses Plugin
Verbessert Leistungsprobleme, die durch die Verwendung von ssh als Verbindungsmethode verursacht werden.
Vor allem über große Distanzen und latente Netze und bei großen Zahlen
von Servern.

Dies hilft nicht bei AWS- oder Azure-Cloud-Funktionen, bei denen die Ausführung
geschieht auf dem Ansible-Controller und wird nur auf einer Reihe von Elementen ausgeführt
dieses Cloud-System und stellt überhaupt keine Verbindung zu Hosts her, was der ist
Hauptproblem mit langsamen with_items. Es hat nichts mit großem Set zu tun
von Maschinen oder Latenz oder irgendetwas im Zusammenhang mit ssh. Es ist einfach die Tatsache
dass es Cloud-Funktionen in einer with_items-Schleife seriell und nichts ausführt
kann das beschleunigen, außer der Cloud-Anbieter verbessert seine Geschwindigkeit oder a
Parallele Ausführung dieser Cloud-Funktionen durch Ansible.

Es erwähnt auch überhaupt keine with_items im Artikel, also kann ich nicht sehen, wie
das hilft sogar im kleinsten bisschen. Können Sie ein bisschen mehr erklären
wie könnte das helfen? Ich würde gerne wissen, was ich vermisse, wenn ich vermisse
etwas hier.

Am Samstag, den 10. März 2018 um 21:58 Uhr schrieb NielsH [email protected] :

+1 auch für Forks, aber inzwischen gibt es auch ein neues Ansible
Strategie-Plugin, das im Allgemeinen eine große Leistungssteigerung bringt, und auch
für with_items-Schleifen. Vielleicht für diejenigen, die Gabeln für Leistung wollen
Gründe, warum es sich lohnt, nachzuschauen:

https://github.com/dw/mitogen
https://mitogen.readthedocs.io/en/latest/ansible.html


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ansible/ansible/issues/12086#issuecomment-372070418 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AJd59qWI9n_DNmUqpmZYiIOMZAyjJy3uks5tdEyQgaJpZM4Fx8zF
.

Tatsächlich wird es nicht in allen Fällen helfen. Der Grund, warum ich in with_items nach Gabeln suche, liegt jedoch in der Langsamkeit bei der Verarbeitung jedes Elements einzeln (sogar beim Pipelining). Manchmal muss ich eine große Anzahl (mehrere hundert) Verzeichnisse basierend auf host_vars erstellen oder einige hundert Dateien als Vorlage erstellen. Also schleife ich meistens über die Module file und template .

Ich habe einmal das Templating von 100 Dateien in 100 separaten Dateien durch with_items vs. Looping über die Elemente in der Jinja-Vorlage selbst und das Zusammenführen der Vorlage in einer einzigen großen Datei getestet. Alles in einer einzigen Datei dauert 5 Sekunden, aber das Erstellen von 100 separaten Konfigurationsdateien dauert 30 Minuten.

Das Plugin, das ich erwähnt habe, hat eine so große Verbesserung für mich gebracht, dass ich dachte, es wäre es wert, es hier zu erwähnen.

Da Schleifen nur dieselbe Aufgabe einmal pro Element ausführen, sollte jede Verbesserung der Aufgabenausführungsgeschwindigkeit zu schnelleren Schleifen führen. Dies betrifft nur „Remote-Aufgaben“, sodass lokale Aufgaben die Gewinne nicht sehen.

Einverstanden. Ich verwende Ansible, um nur lokale Aufgaben auszuführen. Insbesondere, um etwa ein Dutzend Docker-Images zu erstellen. Im Moment baut Ansible sie seriell, was viel Zeit in Anspruch nimmt und die Mehrkern-CPU nicht auslastet. Ich möchte mehrere Docker-Images parallel erstellen.

@gjcarneiro definiere sie dann nicht als Daten, definiere sie als Hosts und ziele auf sie ab, dann delegate_to: localhost , um die Aktionen parallel auszuführen

Hah, danke für den netten Trick :) Aber selbst wenn es funktioniert (ich habe es nicht getestet), ist es eine ziemlich komplizierte Art, Aufgaben parallel auszuführen.

Andererseits verwende ich Ansible möglicherweise für einen völlig anderen Zweck als beabsichtigt, also bin ich in gewisser Weise selbst schuld :(

nicht wirklich kompliziert, so soll Ansible die Parallelisierung nach Host und nicht nach Variable verwenden.

Ja, ich verstehe, es ist nicht die Schuld von Ansible, es macht Sinn. Aber ich verwende Ansible als Build-System (anstatt zB make), weil Ansible als Build-System in vielerlei Hinsicht nett ist. Aber in meiner Denkweise, wenn ich als Build-System denke, machen "Hosts" keinen Sinn. Ein Build-System wie "make" kümmert sich nicht um "Hosts", es kümmert sich nur um Dateien und Aufgaben. Ich erzwinge, dass Ansible als Build-System verwendet wird, und das verursacht ein bisschen kognitive Dissonanz, das ist alles.

Ansible kümmert sich nur um Hosts und Tasks, betrachten Sie die Images, die Sie als „Hosts“ erstellen, und plötzlich passt es zu beiden Paradigmen.

Ansible ist ein Konfigurationsmanagement-Tool für viele andere Dinge, Netzwerke
Geräte, sowohl real als auch virtuell, für eine riesige Menge an Cloud-Diensten wie z
Datenbanken, Webservices wie eleastic beanstalk, Lambda und all die
Komponenten, die darauf zutreffen, wie IAM-Sicherheitskomponenten, während Ansible dies ist
gut bei Hosts, wenn Sie immer noch hauptsächlich VMs / Hosts ausführen, in denen Sie sich befinden
IT der frühen 2000er Jahre. Niemanden hier zu beleidigen gibt es manchmal Wichtiges
Gründe für den Betrieb von VMs oder sogar Docker-Containern, aber sie gehen alle darauf zurück
erbliche Gründe. Tatsächlich werden immer mehr Hosts weniger
was es automatisiert. IMO Wenn wir nicht parallel zu_items kommen, könnten wir das tun
gut schrott ansible alle zusammen.

Trotzdem werde ich hier positiv denken und versuchen, es zu verwenden
Delegate_to für einige Cloud-Dienste Ich meine, ich habe nie versucht, auf 200+ auszuführen
Cloud-Komponenten, die ich auf diese Weise benötige, frage ich wohl einfach die Liste ab
und speichern Sie es mit Ansible in einer Hosts-Datei im Hosts-Format, und versuchen Sie es dann
Delegate_to: localhost Ich werde meine Ergebnisse hier zurückmelden. Wenn es funktioniert
zumindest können wir eine Dokumentations-Pull-Anfrage machen, wie man das umgehen kann
with_item Schleife serielle Ausgaben auf diese Weise. Wir können sicherstellen, dass wir einen Link haben
sie auf den Abschnitten der Cloud-Module und Abschnitten für Docker.

Am Montag, den 12. März 2018 um 18:49 Uhr schrieb Brian Coca [email protected] :

Ansible kümmert sich nur um Hosts und Tasks, betrachten Sie die Bilder, die Sie sind
'Hosts' bauen und plötzlich passt es zu beiden Paradigmen.


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

@gjcarneiro definiere sie dann nicht als Daten, definiere sie als Hosts und richte sie als Ziel aus, und delegiere_to: localhost, um die Aktionen parallel auszuführen

Dies ist ein sehr netter Ansatz, aber es scheint nicht innerhalb der Problemumgehung für fortlaufende Neustarts mit der serial=1 -Simulation (#12170) zu funktionieren. Eine Option zur Parallelisierung würde also viel mehr Flexibilität bringen.

zweifellos, aber es fügt auch eine enorme Komplexität hinzu und die Notwendigkeit, mit gleichzeitigen Aktionen auf einem einzelnen Host umzugehen, ala hosts:all + lineinfile + delegate_to: localhost

Hrrm, bisher habe ich einen kleinen Test zu Delegate_to:127.0.0.1 erstellt
Löschaufgaben, da dies ebenfalls eine Qual im Massenmaßstab ist.

Mein Playbook sieht so aus:

  • Hosts: "{{ Bereitstellungsgruppe }}"

    Aufgaben:

    • Name: vm und alle zugehörigen Ressourcen entfernen
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      Name: "{{ Inventory_Hostname }}"
      Zustand: abwesend

    delegieren_an: 127.0.0.1


Leider versucht es immer noch, eine Verbindung zu den in hosts to aufgeführten Maschinen herzustellen
Führen Sie die Azure-Aufgabe azure_rm_virtualmachine aus.
Mache ich das richtig? Anscheinend fehlt mir etwas, aber ich habe es versucht
zuvor auf viele verschiedene Arten, also wollen Sie einfach wissen, was Sie können
Das.

Funktioniert das überhaupt? Hoffentlich ist dies nur ein Syntaxproblem.

Am Montag, 12. März 2018 um 19:55 Uhr, Isaac Egglestone < [email protected]

schrieb:

Ansible ist ein Konfigurationsmanagement-Tool für viele andere Dinge,
vernetzt Geräte, sowohl reale als auch virtuelle, für eine riesige Menge an Cloud
Dienste wie Datenbanken, Webdienste wie Eleastic Beanstalk, Lambda
und alle Komponenten, die darauf zutreffen, wie IAM-Sicherheitskomponenten, während
Ansible ist gut bei Hosts, wenn Sie immer noch hauptsächlich VMs/Hosts ausführen
im Grunde in der IT der frühen 2000er Jahre. Niemanden hier zu beleidigen gibt es manchmal
wichtige Gründe für den Betrieb von VMs oder sogar Docker-Containern, aber sie alle
auf althergebrachte Gründe zurückgehen. Tatsächlich werden es immer mehr Gastgeber tun
werden weniger von dem, was es automatisiert. IMO, wenn wir nicht parallel werden
with_items könnten wir genauso gut Ansible alle zusammen verschrotten.

Trotzdem werde ich hier positiv denken und versuchen, es zu verwenden
Delegate_to für einige Cloud-Dienste Ich meine, ich habe nie versucht, auf 200+ auszuführen
Cloud-Komponenten, die ich auf diese Weise benötige, frage ich wohl einfach die Liste ab
und speichern Sie es mit Ansible in einer Hosts-Datei im Hosts-Format, und versuchen Sie es dann
Delegate_to: localhost Ich werde meine Ergebnisse hier zurückmelden. Wenn es funktioniert
zumindest können wir eine Dokumentations-Pull-Anfrage machen, wie man das umgehen kann
with_item Schleife serielle Ausgaben auf diese Weise. Wir können sicherstellen, dass wir einen Link haben
sie auf den Abschnitten der Cloud-Module und Abschnitten für Docker.

Am Montag, den 12. März 2018 um 18:49 Uhr schrieb Brian Coca [email protected] :

Ansible kümmert sich nur um Hosts und Tasks, betrachten Sie die Bilder, die Sie sind
'Hosts' bauen und plötzlich passt es zu beiden Paradigmen.


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

Okay, das Deaktivieren der Faktensammlung behebt dieses Problem, wie auch immer es verursacht wird
Eine andere, host_vars, enthält nicht mehr das dynamische Azure-Inventar von
Standard ein.

Resource_group: "{{ host_vars[item]['resource_group'] }}" also nicht
Arbeit in den oben genannten und muss fest auf einen Ressourcengruppennamen codiert werden.

Am Sonntag, 18. März 2018 um 11:14 Uhr, Isaac Egglestone <
[email protected]> schrieb:

Hrrm, bisher habe ich einen kleinen Test zu Delegate_to:127.0.0.1 erstellt
Löschaufgaben, da dies ebenfalls eine Qual im Massenmaßstab ist.

Mein Playbook sieht so aus:

  • Hosts: "{{ Bereitstellungsgruppe }}"

    Aufgaben:

    • Name: vm und alle zugehörigen Ressourcen entfernen
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      Name: "{{ Inventory_Hostname }}"
      Zustand: abwesend

    delegieren_an: 127.0.0.1


Leider versucht es immer noch, eine Verbindung zu den in hosts to aufgeführten Maschinen herzustellen
Führen Sie die Azure-Aufgabe azure_rm_virtualmachine aus.
Mache ich das richtig? Anscheinend fehlt mir etwas, aber ich habe es versucht
zuvor auf viele verschiedene Arten, also wollen Sie einfach wissen, was Sie können
Das.

Funktioniert das überhaupt? Hoffentlich ist dies nur ein Syntaxproblem.

Am Montag, 12. März 2018 um 19:55 Uhr, Isaac Egglestone <
[email protected]> schrieb:

Ansible ist ein Konfigurationsmanagement-Tool für viele andere Dinge,
vernetzt Geräte, sowohl reale als auch virtuelle, für eine riesige Menge an Cloud
Dienste wie Datenbanken, Webdienste wie Eleastic Beanstalk, Lambda
und alle Komponenten, die darauf zutreffen, wie IAM-Sicherheitskomponenten, während
Ansible ist gut bei Hosts, wenn Sie immer noch hauptsächlich VMs/Hosts ausführen
im Grunde in der IT der frühen 2000er Jahre. Niemanden hier zu beleidigen gibt es manchmal
wichtige Gründe für den Betrieb von VMs oder sogar Docker-Containern, aber sie alle
auf althergebrachte Gründe zurückgehen. Tatsächlich werden es immer mehr Gastgeber tun
werden weniger von dem, was es automatisiert. IMO, wenn wir nicht parallel werden
with_items könnten wir genauso gut Ansible alle zusammen verschrotten.

Trotzdem werde ich hier positiv denken und versuchen, es zu verwenden
Delegate_to für einige Cloud-Dienste Ich meine, ich habe nie versucht, auf 200+ auszuführen
Cloud-Komponenten, die ich auf diese Weise benötige, frage ich wohl einfach die Liste ab
und speichern Sie es mit Ansible in einer Hosts-Datei im Hosts-Format, und versuchen Sie es dann
Delegate_to: localhost Ich werde meine Ergebnisse hier zurückmelden. Wenn es funktioniert
zumindest können wir eine Dokumentations-Pull-Anfrage machen, wie man das umgehen kann
with_item Schleife serielle Ausgaben auf diese Weise. Wir können sicherstellen, dass wir einen Link haben
sie auf den Abschnitten der Cloud-Module und Abschnitten für Docker.

Am Montag, den 12. März 2018 um 18:49 Uhr, Brian Coca [email protected]
schrieb:

Ansible kümmert sich nur um Hosts und Tasks, betrachten Sie die Bilder, die Sie sind
'Hosts' bauen und plötzlich passt es zu beiden Paradigmen.


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

Okay, ich habe das Playbook unten modifiziert, um eine Reihe von Dingen auszuprobieren.

1. Ich habe versucht, "delegate_facts: True" zu setzen, falls dies geholfen hat, aber natürlich
Selbst aufgrund der Dokumentation hatte ich nicht wirklich erwartet, dass das funktioniert.
2. Ich habe collect_facts: no gesetzt und versucht, setup auszuführen, um die Tatsache zu reduzieren
sich zu nichts versammeln, in der Hoffnung, dass es sich dafür entscheiden würde, sich überhaupt nicht zu verbinden, sondern von
Natürlich wie erwartet versucht es trotzdem, sich mit der Maschine zu verbinden.
3. Versuchte Einstellung Verbindung: localhost will aber komischerweise immer noch
sich aus der Ferne mit der Maschine verbinden, um die Fakten zu sammeln, obwohl sie es weiß
werde das spielen lokal ausführen, etwas nervig da aber ich verstehe die logik da
wie sonst soll es die Details des betreffenden Hosts kennen, ohne dies zu tun
Das..

Ich kann wahrscheinlich das Spielbuch verwenden, um die Maschinen zuerst einzuschalten und dann zu lassen
Melden Sie sich einfach bei ihnen an und sammeln Sie die nicht benötigten Fakten. Das wäre so
Ich kann host_vars zum Laufen bringen und dann die Maschinen löschen. Ich würde gerne wissen
wenn jemand hier eine bessere Lösung hat, da das auch ein enormer Zeitaufwand ist
Aufwand, wenn ich hundert oder mehr Maschinen habe und sie mit Strom versorgen muss
alles nur um sie dann zu löschen.

Bisher sehe ich dies als Lösung anstelle einer with_items-Parallele
Lösung als Potenzial, aber die betreffenden Maschinen müssen es noch sein
verfügbar und erreichbar, wenn Sie Informationen aus azure_rm.py benötigen, während Sie
Tun Sie dies, damit es dort mindestens eine Einschränkung gibt. Es sei denn, jemand weiß es
So erhalten Sie Zugriff auf host_vars von Azure, die über Standard in übergeben werden
when collect_facts: nein

Eigentlich habe ich natürlich das gleiche Problem, wenn ich das alles über a laufe
with_items list, aber ich hatte gehofft, diese Arbeit zu vermeiden, wenn ich es bin
Ich werde wieder Hosts verwenden. Die Problemumgehung besteht darin, azure_rm.py in a auszugeben
json-Datei auf der Befehlszeile und dann in eine Variable laden, um sie zu erhalten
wieder auf sie zugreifen.

Wenn ich mich auf mein Endziel freue, hier Hunderte oder sogar Tausende zu modifizieren
von serverlosen Komponenten parallel, vielleicht geht das so wie ich kann
Verwenden Sie Dinge wie azure_rm_functionapp_facts
http://docs.ansible.com/ansible/latest/azure_rm_functionapp_facts_module.html
zu
sammeln Sie Fakten über sie und verwenden Sie sie im Spiel in der Theorie, obwohl dies der Fall ist
muss noch getestet werden.

Ich habe immer noch keine großartige Logik, wie man dies richtig macht, um eine zu erstellen
Dokumentation Pull Request darüber, wie die Methode bisher weitgehend scheint
abhängig davon, was Sie tun, und ich bin mir nicht sicher, ob ich die Verwendung von vorschlagen möchte
json dump hack in der Dokumentation.

Ich werde auf ein Feedback von jemandem warten, der sich zufällig darum kümmert
diese Problemliste, um meinen nächsten Schritt zu entscheiden. In der Zwischenzeit werde ich meinen Hack benutzen, um zu bekommen
meine unmittelbare Arbeit getan.


  • Hosts: "{{ Bereitstellungsgruppe }}"
    collect_facts: nein
    Aufgaben:

    • Einrichten:

      collect_subset=!alle,!min

    • Name: vm und alle zugehörigen Ressourcen entfernen

      azure_rm_virtualmachine:

      resource_group: "{{ host_vars[inventar_hostname]['resource_group']

      }}"

      Name: "{{ Inventory_Hostname }}"

      Zustand: abwesend

      delegieren_an: lokaler Host

      Delegate_Facts: Stimmt


Am Sonntag, 18. März 2018 um 12:04 Uhr, Isaac Egglestone <
[email protected]> schrieb:

Okay, das Deaktivieren der Faktensammlung behebt dieses Problem, wie auch immer es verursacht wird
Eine andere, host_vars, enthält nicht mehr das dynamische Azure-Inventar von
Standard ein.

Also resource_group: "{{ host_vars[item]['resource_group'] }}"
funktioniert oben nicht und muss fest in eine Ressourcengruppe codiert werden
Name.

Am Sonntag, 18. März 2018 um 11:14 Uhr, Isaac Egglestone <
[email protected]> schrieb:

Hrrm, bisher habe ich einen kleinen Test zu Delegate_to:127.0.0.1 erstellt
Löschaufgaben, da dies ebenfalls eine Qual im Massenmaßstab ist.

Mein Playbook sieht so aus:

  • Hosts: "{{ Bereitstellungsgruppe }}"

    Aufgaben:

    • Name: vm und alle zugehörigen Ressourcen entfernen
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      Name: "{{ Inventory_Hostname }}"
      Zustand: abwesend

    delegieren_an: 127.0.0.1


Leider versucht es immer noch, eine Verbindung zu den in Hosts aufgeführten Maschinen herzustellen
zum Ausführen der Azure-Aufgabe azure_rm_virtualmachine.
Mache ich das richtig? Scheint mir etwas zu fehlen, aber ich habe es versucht
Dies zuvor auf viele verschiedene Arten, also möchten Sie nur wissen, ob Sie dazu in der Lage sind
mach das.

Funktioniert das überhaupt? Hoffentlich ist dies nur ein Syntaxproblem.

Am Montag, 12. März 2018 um 19:55 Uhr, Isaac Egglestone <
[email protected]> schrieb:

Ansible ist ein Konfigurationsmanagement-Tool für viele andere Dinge,
vernetzt Geräte, sowohl reale als auch virtuelle, für eine riesige Menge an Cloud
Dienste wie Datenbanken, Webdienste wie Eleastic Beanstalk, Lambda
und alle Komponenten, die darauf zutreffen, wie IAM-Sicherheitskomponenten, während
Ansible ist gut bei Hosts, wenn Sie immer noch hauptsächlich VMs/Hosts ausführen
im Grunde in der IT der frühen 2000er Jahre. Niemanden hier zu beleidigen gibt es manchmal
wichtige Gründe für den Betrieb von VMs oder sogar Docker-Containern, aber sie alle
auf althergebrachte Gründe zurückgehen. Tatsächlich werden es immer mehr Gastgeber tun
werden weniger von dem, was es automatisiert. IMO, wenn wir nicht parallel werden
with_items könnten wir genauso gut Ansible alle zusammen verschrotten.

Trotzdem werde ich hier positiv denken und versuchen, es zu verwenden
Delegate_to für einige Cloud-Dienste Ich meine, ich habe nie versucht, auf 200+ auszuführen
Cloud-Komponenten, die ich auf diese Weise benötige, frage ich wohl einfach die Liste ab
und speichern Sie es mit Ansible in einer Hosts-Datei im Hosts-Format, und versuchen Sie es dann
Delegate_to: localhost Ich werde meine Ergebnisse hier zurückmelden. Wenn es funktioniert
zumindest können wir eine Dokumentations-Pull-Anfrage machen, wie man das umgehen kann
with_item Schleife serielle Ausgaben auf diese Weise. Wir können sicherstellen, dass wir einen Link haben
sie auf den Abschnitten der Cloud-Module und Abschnitten für Docker.

Am Montag, den 12. März 2018 um 18:49 Uhr, Brian Coca [email protected]
schrieb:

Ansible kümmert sich nur um Hosts und Tasks, betrachten Sie die Bilder, die Sie sind
'Hosts' bauen und plötzlich passt es zu beiden Paradigmen.


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

Ich habe auch einen Anwendungsfall für Gabeln, was dies viel einfacher machen würde. Das Playbook stellt eine Reihe von Openstack-Instanzen über Terraform mit zufällig ausgewählten Floating-IPs bereit. Dann iteriere ich über die ips, um zu überprüfen, ob Port 22 auf jedem erstellten Host geöffnet ist. Die aktuelle Methode dafür ist ein Multiplay-Playbook:

- hosts: localhost
  connection: local
  gather_facts: no
  tasks:
...
  - name: Run terraform
    terraform:
      plan_file: '{{tf_plan | default(omit)}}'
      project_path: '{{terraform_path}}/{{infra}}'
      state: '{{state}}'
      state_file: '{{stat_tfstate.stat.exists | ternary(stat_tfstate.stat.path, omit)}}'
      variables: '{{terraform_vars | default(omit)}}'
    register: tf_output

  - name: Add new hosts
    with_items: '{{tf_output.outputs.ip.value}}' # configued this in terraform to output a list of assigned ips.
    add_host:
      name: '{{item}}'
      groups: new_hosts

- hosts: new_hosts
  gather_facts: no
  connection: local
  tasks:
   - name: Wait for port 22 to become available
     wait_for:
       host: '{{ansible_host}}'
       port: 22
       state: started
       timeout: 60

Dies wird ausgeführt mit: ansible-playbook -i localhost, deploy-test-clients.yml --extra-vars="infra=terraform_os_instances state=present"
Dies ist natürlich eine begrenzte Problemumgehung, da Sie nicht immer eine ordentlich inventarisierte Liste von IPs haben, mit der Sie arbeiten können.

Da viele Leute mit der Leistung der lokalen Templating-Dateien zu kämpfen scheinen, könnte stattdessen vielleicht ein spezielles template_local-Modul erstellt werden, um dieses spezielle Problem zu lösen. Das wäre zumindest ein Anfang... Ich würde es selbst versuchen, werde aber auf absehbare Zeit keine Zeit haben.

Mehr als 30 Minuten zum Erstellen von Vorlagen für 100 Dateien, die mit Jinja in 5 Sekunden erstellt werden können, sind lächerlich.

@saplla- Templating findet immer lokal statt, das einzige, was aus der Ferne passiert, ist das Kopieren der Vorlage und das Festlegen von Berechtigungen.

Nur zur Verdeutlichung, ich spreche von Benutzern, die Vorlagendateien als lokale Aufgaben erstellen möchten, z. B. um sie in andere Build-Systeme einzuspeisen, oder in meinem Fall, um k8s-Ressourcen mithilfe von kubectl bereitzustellen.

Was ich meine, ist, das Looping und Templating über ein Modul, das ein einfacher Wrapper ist, auf Jinja auszulagern. Das Modul könnte etwas Kontext und die Schleifendefinition nehmen (was normalerweise in with_nested und Freunde geschrieben würde) und für diese Aufgabe einfach Ansible komplett ausschneiden (vielleicht könnte der Wrapper Jinja parallel ausführen, wenn es die Dinge beschleunigt) .

Es könnte so aufgerufen werden:

    template_parallel:
      src: "{{ item[0] }}"
      dest: "{{ tempdir }}/{{ item[1] }}-{{ item[0] | basename }}"
      context: "{{ hostvars[inventory_hostname] }}"
      nested:
      - "{{ templates.stdout_lines }}"
      - "{{ namespaces.stdout_lines }}"

Das obige Beispiel verwendet alle von ansible definierten Variablen als Kontext, aber jedes Diktat könnte übergeben werden.

Wie gesagt, ich habe gerade keine Zeit, daran zu arbeiten, aber klingt der Ansatz machbar @bcoca ?

Dies setzt voraus, dass jedes Element unabhängig ist, was nicht immer der Fall ist. Sie können die aktuellen Elementwerte von den vorherigen und / oder Ergebnissen früherer Iterationen abhängig machen oder sie können einfach kumulativ sein.

Die meiste Zeit, die mit Templating verbracht wird, hat mit den Vars zu tun, nicht mit den Templates selbst, da sie konsistent sein müssen, würden Sie bei der Parallelisierung nicht viel gewinnen, es sei denn, Sie wären bereit, Verhaltensweisen zu ändern, die aktuelle Annahmen brechen würden.

Außerdem sind Vorlagen bereits parallel, nach Host, nur nicht nach Artikel.

Ok danke für die Gedanken. Es wäre eigentlich gut genug für meinen Anwendungsfall und es klingt so, als wäre es auch für einige andere Leute in diesem Thread. Ich verwende Ansible nur, um hierarchische Konfigurationen und Vorlagendateien lokal zu laden, bevor ich eine Binärdatei aufrufe, die sie bereitstellt (kubectl, helm usw.). Ich wäre mit einem kinderleichten, leichtgewichtigen Templating-Modul zufrieden, wenn es so leistungsfähig wäre, dass es die Templating-Zeiten von Minuten auf Sekunden verkürzt.

Ich werde versuchen, mir das anzusehen, wenn es ein Problem für uns wird, es sei denn, jemand kommt mir zuvor.

Ich habe ursprünglich #10695 eingereicht, aber da es eine Weile dauern wird, bis dies zusammenkommt, habe ich diese Anwendungsfälle mit Shell-Skripten angegangen (z um ein einzelnes Skript einmal auszuführen, das die Sache 50 Mal macht). Leider bedeutet dies, dass Sie auf einige der Dinge verzichten müssen, die Sie mit Ansible kostenlos erhalten, wie z ist wahrscheinlich zwei Größenordnungen schneller. Selbst wenn wir in Zukunft eine "parallele" Option bekommen, ist es daher möglicherweise nicht so schnell wie meine benutzerdefinierten Skripte, und ich werde wahrscheinlich nicht die Mühe machen, darauf umzusteigen.

@wincent Eine parallele Schleife wird wahrscheinlich immer noch langsamer sein als ein Shell-Skript / dediziertes Programm, da Ansible viel mehr tut, als nur „die Aktion anzuwenden“.

@bcoca : ja, das bestätigt mein Verständnis.

@saplla k8s_raw ist besser als die Verwendung einer Vorlage dafür, Sie können die Yaml-Datei bei Bedarf in Ihr Inventar einfügen :) (es ist nicht Gegenstand dieser PR)
wie ist der aktuelle Stand dazu? Können wir etwas in 2.6 @bcoca erwarten?
Ich verwalte Tausende von Postgresql-Berechtigungen auf meinen DB-Clustern und 25 Minuten sind quälend langsam

@nerzhul Danke, aber es ist nicht besser für uns. Zu viel Magie. Wir brauchen Vorlagen.

@sapila Sie können immer ein Host-Ziel pro Vorlage erstellen, um das Templating so weit wie möglich zu parallelisieren, und dann nachfolgende Wiedergaben oder Delegierungen verwenden, um es an die richtigen tatsächlichen Hosts zu liefern.

@bcoca ein bisschen hacky :)

Überhaupt nicht, es ist VIEL hacky, funktioniert aber heute

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen