Estoy tratando de simplificar mi Ansible Playbook para la implementación de un HA-Zookeeper-Cluster (3 instancias). Como necesito configurar el Zookeeper-ID por separado para cada instancia, se ve así ahora (extracto):

- hosts: zoo1
  tasks:
    - include: tasks/install-zookeeper.yml ID=1

- hosts: zoo2
  tasks:
    - include: tasks/install-zookeeper.yml ID=2

- hosts: zoo3
  tasks:
    - include: tasks/install-zookeeper.yml ID=3

Ahora creo que de alguna manera debería ser posible hacer esto en un bucle. Aquí hay un pseudocódigo de lo que quiero:

- for i in (1,2,3):
  hosts: "zoo{{ i }}"
  tasks:
    - include tasks/install-zookeeper.yml ID="{{ i }}"

¿Es posible algo así?

1
larissaphone 26 jun. 2020 a las 11:51

2 respuestas

Coloque la ID var por host en su inventario. Esto se puede hacer directamente en su archivo de inventario o en un archivo host_vars/YouHostInventoryName.yml. Consulte la documentación del inventario para obtener más información al respecto.

Para este ejemplo, podemos usar un inventario básico estático de yaml:

---
all:
  hosts:
    zoo1:
      ID: 1
    zoo2:
      ID: 2
    zoo3:
      ID: 3

Y ahora solo tiene que llamar para incluirlo en cada host que automáticamente obtendrá el ID correcto del inventario:

- hosts: all
  tasks:
    - include_tasks: tasks/install-zookeeper.yml

Nota: include todavía es compatible, pero quedará en desuso en un futuro más o menos cercano. Debe pasar a la nueva <include|import>_<task|role|playbook> como se indica en las notas de la documentación vinculada anteriormente.

0
Zeitounator 26 jun. 2020 a las 09:50

El equivalente de

- for i in (1,2,3):
  hosts: "zoo{{ i }}"
  tasks:
    - include tasks/install-zookeeper.yml ID="{{ i }}"

Podría implementarse con el inventario y el libro de jugadas a continuación

shell> cat hosts
[cluster1]
zoo1
zoo2
zoo3
shell> cat playbook.yml
- hosts: cluster1
  tasks:
    - include_tasks: install-zookeeper.yml
      vars:
        ID: "{{ inventory_hostname[3:0] }}"

      vars:
        ID: "{{ inventory_hostname|
                regex_replace('^(\\D*)(.*)$', '\\2') }}"
0
Vladimir Botka 26 jun. 2020 a las 10:56