Auffächern auf andere Hosts, wenn Serial bereits in Ansible verwendet wird

Auffächern auf andere Hosts, wenn Serial bereits in Ansible verwendet wird

Ich habe über 80 Hosts, auf denen meine Anwendung läuft, und aktualisiere ein seit langem bestehendes Ansible-Playbook, um unseren Load Balancer zu ändern. In unserem aktuellen Load Balancer-Setup können Hosts in einem Ansible-Spiel zum Load Balancer hinzugefügt/entfernt werden, indem man die AWS-CLI ausschaltet. Wir wechseln jedoch zu einem Load Balancer, der auf einer Handvoll unserer eigenen Hosts konfiguriert ist, und wir werden Hosts hinzufügen und entfernen, indem wir Textdateien auf diesen Hosts mit Ansible bearbeiten. Im Wesentlichen brauche ich eine innere Schleife über verschiedene Hosts innerhalb eines Playbooks, während ich Serial verwende.

blockinfileIch habe Probleme, das Playbook so zu strukturieren, dass ich Befehle an Hosts in Gruppen auffächern kann tag_Type_edge, während ich sie mit „Seriell: 25 %“ an die 80 tag_Type_appHosts bereitstelle.

Folgendes möchte ich tun können:

---
- hosts: tag_Type_app
  serial: "25%"
  pre_tasks:

    - name: Gathering ec2 facts
      action: ec2_metadata_facts

    - name: Remove from load balancers
      debug:
        msg: "This is where I'd fan out to multiple different hosts from group tag_Type_edge to manipulate
              text files to remove the 25% of hosts from tag_Type_app from the load balancer"

  tasks:
    - name: Do a bunch of work to upgrade the app on the tag_Type_app machines while out of the load balancer
      debug:
        msg: "deploy new code, restart service"


  post_tasks:
    - name: Put back in load balancer
        debug:
          msg: "This is where I'd fan out to multiple different hosts from group tag_Type_edge to manipulate
                 text files to *add* the 25% of hosts from tag_Type_app back into the load balancer"

Wie kann ich dies strukturieren, um die innere Schleife zu ermöglichen, tag_Type_edgewährend ich „serial: 25 %“ auf allen tag_Type_appBoxen verwende?

Antwort1

In Ansible könnte das Ausführen einer Aufgabe auf einem Host, aber im Auftrag eines anderen, die Verwendung einer cleveren Sache namensDelegation. Ein Beispiel in den Dokumenten ist tatsächlich das Herausnehmen von Hosts aus einem Load Balancer.

Wie bei jeder Aufgabe kann es auf einigen Hostnamen mehrfach in einer Schleife ausgeführt werden. Nicht die Play-Schleife, sondern eine Task-Schleife. Ein Beispiel hilft, indem man Ihr Skelett übernimmt:

---
- name: Example loop over load balancers for each app server
  hosts: tag_Type_app
  serial: "25%"

  pre_tasks:
    - name: Gathering ec2 facts
      action: ec2_metadata_facts

    - name: Remove from load balancers
      debug:
        msg: "Remove app instance {{ inventory_hostname }} from edge node {{ item }}"
      delegate_to: "{{ item }}"
      loop: "{{ query('inventory_hostnames', 'tag_Type_edge') }}"

  tasks:
    - name: Do a bunch of work to upgrade the app on the tag_Type_app machines while out of the load balancer
      debug:
        msg: "deploy new code, restart service"

  post_tasks:
    - name: Put back in load balancer
      debug:
        msg: "Add app instance {{ inventory_hostname }} to edge node {{ item }}"
      delegate_to: "{{ item }}"
      loop: "{{ query('inventory_hostnames', 'tag_Type_edge') }}"

inventory_hostnames ist ein Nachschlage-Plugin, das Inventarmuster erstellt; jedes beliebige Muster kann dort eingefügt werden.

Es gibt ein paar heikle Dinge dazu. Jeder Fehler in der „Edge“-Schleife führt dazu, dass der „App“-Host ausfällt. Dadurch bleiben einige Edge-Hosts teilweise aktiviert und andere nicht. Es sei denn, Sie haben einen Rückziehmechanismus, wie einen Block mit einer Rettung, die dies rückgängig macht.

Da es sich um eine Taskschleife handelt, werden einige Inventar- und Spielfunktionen nicht angewendet. Sie können die Edge-Hosts nicht weiter über --limitdie Befehlszeile einschränken. Sie können serialsie auch nicht stapelweise zusammenfassen, da dies bereits in einem Spiel geschieht.

Außerdem wird eine relativ große Anzahl von Aufgaben ausgeführt, mindestens App ✕ Edge ✕ 2. Dies kann etwas langsam sein. Könnte durch die Erhöhung der Forks etwas abgemildert werden.

Wenn Ihr Load Balancer für mehrere Hosts eine einzige Kontrollebene hätte, müssten nicht so viele Hosts angesprochen werden. Es wird eine Aufgabe pro App-Server ausgeführt. Möglicherweise sind Sie im Moment nicht dafür eingerichtet, aber es ist etwas, das Sie in Betracht ziehen sollten.

verwandte Informationen