web-dev-qa-db-fra.com

Exécution d'un playbook sur plusieurs groupes d'hôtes un à la fois

Je veux exécuter un playbook contenant certains rôles sur plusieurs groupes d'hôtes que je crée dynamiquement avec le module group_by.

Je peux le faire comme dans l'exemple ci-dessous (ping remplaçant mon rôle actuel).

Je me demandais s'il y avait un moyen d'exécuter chaque groupe séparément dans une boucle au lieu de répertorier tous les ID d'instance. Je ne veux pas créer une ligne en double avec chaque identifiant d'instance.

Le but ici est de déployer à une seule instance dans chaque centre de données à la fois au lieu de tout exécuter avec une faible série qui prend beaucoup de temps.

Il peut y avoir une manière différente de le faire, je ne veux pas créer de groupes statiques dans l'inventaire pour chaque instance_id également.

---
- hosts: tag_type_edgenode
  tasks:
    - group_by: key=instance_id_{{instance_id}}
      register: dyn_groups

- hosts: instance_id_1
  tasks:
    - ping:
- hosts: instance_id_2
  tasks:
    - ping:
- hosts: instance_id_3
  tasks:
    - ping:
- hosts: instance_id_4
  tasks:
    - ping:
6
Shay Rybak

Si vous avez un nombre d’hôtes égal dans chaque groupe, vous pouvez utiliser modèle + série.
Formulaires possibles Liste d'hôtes par motif se déplaçant séquentiellement à travers les groupes. Donc, si vous avez un nombre égal d'hôtes, les lots formés par série seront égaux aux groupes.

Dans votre exemple, si vous avez exactement 3 hôtes dans chaque groupe, vous pouvez utiliser:

- hosts: instance_id_*
  serial: 3
  tasks:
    - ping:

Si cela ne vous dérange pas un peu de correction Ansible, vous pouvez modifier la méthode _ get_serialized_batches .
Ajoutez ce code juste avant while len(all_hosts) > 0::

    if 'serialize_by_var' in play.get_vars():
        param = play.get_vars()['serialize_by_var']
        sb = []
        def by_param(x):
            vrs = x.get_vars()
            if param in vrs:
                return vrs[param]
            else:
                return None

        s_hosts = sorted(all_hosts,key=by_param)
        for k, g in itertools.groupby(s_hosts, by_param):
            sb.append(list(g))

        display.vv('Serializing by Host var "{}": {}'.format(param,sb))
        return sb

Et vous pouvez sérialiser les hôtes par n'importe quelle variable comme celle-ci:

- hosts: tag_type_edgenode
  vars:
    serialize_by_var: instance_id
  tasks:
    - ping
8
Konstantin Suvorov

À partir de l'idée de Konstantin, vous pouvez faire quelque chose comme ça en utilisant des alias et une liste de modèles:

---
- hosts: "*-server-batch-1,*-servers-batch-2,*-server-batch-3"
  serial: 3
  ...
...


[london]
london-server-batch-1 ansible_Host=server1.london.com
london-server-batch-2 ansible_Host=server2.london.com
london-server-batch-3 ansible_Host=server3.london.com

[tokyo]
tokyo-server-batch-1 ansible_Host=server1.tokyo.com
tokyo-server-batch-2 ansible_Host=server2.tokyo.com
tokyo-server-batch-3 ansible_Host=server3.tokyo.com
0
Paul Calabro