Ansible grupo de variable no definida en el juego

0

Pregunta

He implementado un inventario dinámico de Ansible, durante su ejecución se define una variable de grupo que estoy usando más tarde en un libro de jugadas.

En el libro de jugadas, estoy usando dos veces:

  • para el bucle sobre su contenido:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • y como un medio para establecer la serie condicionalmente
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

El comportamiento me sale que no puedo explicar es que el host_set la variable se define y rellena correctamente durante la ejecución de la tarea, pero al intentar establecer serial parece ser indefinido.

Es este comportamiento esperado, se Ansible grupo de variables indefinido cuando la creación de un juego de atributos, pero el pop hasta más tarde, cuando la ejecución de la tarea para que comience el juego?

ansible
2021-11-23 21:48:17
2

Mejor respuesta

3

Grupo de variables sólo se aplican a los hosts individuales. Juega son evaluados en un no-contexto de acogida, por lo que las únicas variables que están disponibles no son de host específico de variables, como los de --extra-vars.

2021-11-24 01:32:48
1

Cuando la razón de este comportamiento es perfectamente indicado por @flowerysong la respuesta, hay una solución que puede utilizar para lograr su requisito.

El truco es utilizar el hecho de que usted puede definir dos obras de teatro dentro de una playbook y, a continuación, utilizar la variable establecida en el host(s) de la primera jugada.

Así, lo que vamos a hacer es:

  1. Ejecute un juego de localhost y establecer un hecho que viene desde el grupo host que queremos destino en el segundo juego
  2. Opcionalmente: yo también define un target_hosts variable en el primer juego, para estar seguro de que, si el segundo juego del destino es modificado, el anfitrión de la variable de grupo siempre es el que el segundo juego va a dirigir.
  3. El uso de esa variable en la segunda obra, de localhost's hostvars

Nota adicional: no hay de contabilidad para su gusto, pero yo prefiero la de en línea si a la ternary filtro, todavía, que son estrictamente equivalentes.


Por tanto, dada la playbook:

- hosts: localhost
  gather_facts: no

  tasks:
    - set_fact:
        target_hosts: nodes
        
    - set_fact:
        host_set: "{{ hostvars[groups[target_hosts].0].host_set }}"

- hosts: "{{ hostvars.localhost.target_hosts }}"
  gather_facts: no
  serial: "{{ '100%' if hostvars.localhost.host_set else '1' }}"
  
  tasks:
    - debug: 
  • Cuando se ejecuta con host_set: true en el nodesgrupo:
    PLAY [localhost] *******************************************************************************************************************
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node1] => 
      msg: Hello world!
    ok: [node2] => 
      msg: Hello world!
    ok: [node3] => 
      msg: Hello world!
    
    PLAY RECAP *************************************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node2                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node3                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
  • Cuando se ejecuta con host_set: false en el nodesgrupo:
    PLAY [localhost] *******************************************************************************************************************
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node1] => 
      msg: Hello world!
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node2] => 
      msg: Hello world!
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node3] => 
      msg: Hello world!
    
    PLAY RECAP *************************************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node2                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node3                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
2021-11-24 11:14:59

Gracias por la información extra!
Radu Stoenescu

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................