Como leio Variáveis Ansíveis de arquivos de inventário?

2

Eu não consigo descobrir variáveis e espero que algum tipo de pessoa me aponte na direção certa.

Eu tenho três arquivos:

  • group_vars/all

    ---
    env2: server
    
  • hosts

    [all:vars]
    env=development
    
    [webservers]
    138.78.334.247
    
  • site.yml

    ---    
    - name: Provision an {{ env }} {{ env2 }} db server
      hosts: all
      become: yes
      become_user: root
      vars:
        - update_apt_cache: yes
    

Quando eu executo o comando:

ansible-playbook -i development site.yml

Minha saída mostra:

PLAY [Provision an {{ env }} {{ env2 }} db server] *****************************  

Em vez de substituir as vars.

Eu também tentei chamar site.yml de outro arquivo YAML usando include: , mas isso também não funcionou.

Eu não consigo descobrir o que estou fazendo de errado aqui, já que parece direto dos documentos.

Estou usando o Ansible 2.2.1.

O exemplo acima é um exemplo simplificado do que estou tentando realizar, que está abaixo:

---    
- name: Provision a {{ application_name }} web server
  hosts: all
  become: yes
  become_user: root
  remote_user: "{{ server_user }}"
  vars:
    - update_apt_cache: yes
  vars_files:
    - env_vars/{{ env }}.yml

   roles:
    - base
    - db
    - mysql
    - web
    - nginx
    
por Dafonz 28.01.2017 / 23:52

1 resposta

3

É bastante complicado, pois há vários aspectos envolvidos. Mas é fácil verificar com tentativa e erro.

A resposta

Você pode usar variáveis em nomes de jogos e tarefas, desde que todas as variáveis usadas no nome estejam definidas e disponíveis em um nível específico.

No seu exemplo, as variáveis env e env2 são do grupo e não são substituídas no nível da reprodução.

Ao imprimir o nome da reprodução no log de saída, o Ansible ainda não sabe em quais hosts ele será executado, portanto, ele também não sabe quais valores são definidos para esses hosts (e o valor pode variar dependendo do host).

No entanto, no nível da tarefa, os valores são unanimemente definidos.

Considere:

---
- name: Here variables do not work {{ env }} {{ env2 }}
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Here variables work {{ env }} {{ env2 }}
      debug:

produzirá:

PLAY [Here variables do not work {{ env }} {{ env2 }}] *************************

TASK [Here variables work development server] **********************************
ok: [localhost] => {
    "msg": "Hello world!"
}

Em relação ao último exemplo ( Provision a {{ application_name }} web server ):

Eu não sei de onde você tirou isso, mas parece incompleto. Um aqui muito semelhante contém uma referência estática para o arquivo variável:

vars_files:
  - env_vars/base.yml

O valor de application_name definido no env_vars/base.yml é assim unanimemente renderizado no nome do jogo.

Você, por outro lado, tentou usar o grupo vars em vez de um valor estático e é por isso que os valores não são substituídos (eles ainda não foram determinados).

Captura adicional

Se você adicionou uma variável que não está definida no nome da tarefa do exemplo acima, que funcionou de outra forma, por exemplo:

- name: Here variables work {{ env }} {{ env2 }} {{ unknown }}
  debug:

Você teria:

TASK [These variables will not work {{ env }} {{ env2 }} {{ unknown }}] ********

Mesmo as variáveis definidas corretamente não foram substituídas.

Da mesma forma, tentar usar um fato com escopo no host, por exemplo, ansible_hostname também falhará:

tasks:
  - name: These variables will not work {{ env }} {{ env2 }} {{ ansible_hostname }}
    debug:

Você teria:

TASK [These variables will not work {{ env }} {{ env2 }} {{ ansible_hostname }}] ***

E o seu exemplo é como o último:

Você tenta imprimir as variáveis do grupo em um nome de peça, ou seja, em um nível no qual as variáveis do grupo ainda não estão definidas.

    
por 29.01.2017 / 13:59