Ansible grupo de variável não definida no play

0

Pergunta

Eu tenho implementado um inventário dinâmico para Ansible, durante a sua execução, ele define uma variável de grupo que eu estou usando, mais tarde, em um livro.

No playbook, eu estou usando duas vezes:

  • para fazer loop para o seu conteúdo:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • e como um meio para definir série condicionalmente
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

O comportamento de eu chegar que eu não posso explicar é que o host_set variável é definida e preenchida corretamente durante a execução da tarefa, mas ao tentar definir o serial parece ser indefinido.

É este o comportamento esperado, são Ansible de variáveis de grupo indefinido quando a configuração de um jogo de atributos, mas o pop up mais tarde, quando a execução da tarefa para que determinado jogo começa?

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

Melhor resposta

3

Grupo de variáveis se aplicam somente para hosts individuais. As peças são avaliadas em um não-host contexto, portanto, as únicas variáveis que estão disponíveis são para não-host-de variáveis específicas, como os da --extra-vars.

2021-11-24 01:32:48
1

Quando a razão deste comportamento é perfeitamente indicado por @flowerysong a resposta, há uma solução que você pode usar para alcançar sua exigência.

O truque é usar o fato de que você pode definir dois jogos dentro de um playbook e, em seguida, usar a variável definida no host(s) do primeiro jogo.

Então, o que vamos fazer é:

  1. Executar uma brincadeira sobre localhost e definir um fato proveniente do grupo de host que o nosso objectivo é alvo no segundo jogo
  2. Opcionalmente: eu também definido um target_hosts variável no primeiro jogo, a certeza de que, se o segundo jogo do destino é modificado, o anfitrião variável do grupo é sempre o que o segundo jogo vai destino.
  3. Use essa variável no segundo jogo, a partir de localhost's hostvars

Nota Extra: há gosto não se discute, mas eu prefiro o inline se para o ternary filtro, ainda, eles são estritamente equivalentes.


Assim, dado o 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: 
  • Quando executado com host_set: true no 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   
    
  • Quando executado com host_set: false no 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

Obrigado pela informação extra!
Radu Stoenescu

Em outros idiomas

Esta página está em outros idiomas

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