Acessando hostvars para um grupo de hosts no Ansible

6

Estou tentando usar o Ansible para adicionar entradas no arquivo de hosts do servidor. Eu tenho um grupo de servidores que eu preciso falar uns com os outros através de uma LAN privada.

Meu arquivo de inventário:

[server_list]
server1
server2

A tarefa que estou tentando trabalhar:

- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
  with_items: groups['server_list']

Não está dando certo, eu entendo isso:

fatal: [server1] => host not found:  {{item}} 
fatal: [server2] => host not found:  {{item}} 

Isso é basicamente o mesmo que este , mas no novo formato de acesso a variável Ansible {{ }} .

Alguma idéia de como fazer isso?

    
por melsayed 24.07.2014 / 13:39

4 respostas

8

OK. Eu já havia tentado isso antes e realmente não funcionou. Então devo ter feito algo errado lá atrás.

Isso funciona:

- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[item]['ansible_hostname'] }}"
  with_items: groups['server_list']

ou para o 1.9 ou posterior:

- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[item]['ansible_hostname'] }}"
  with_items: "{{ groups['server_list'] }}"
    
por 26.07.2014 / 03:39
4

Tive o mesmo problema, queria examinar a lista de hosts em um grupo e adicionar regras de firewall aos ips. Analisou um pouco como o hostvars [item] é estruturado e usou o nome diferente para acessar esse valor. Isso funcionou para mim:

- name: Setting up firewall so web_servers can access MySQL on port {{ mysql_port }}
  ufw: rule=allow proto=tcp to_port={{ mysql_port }} src="{{ hostvars[item]['ansible_default_ipv4']['address'] }}"
  with_items: groups.web_servers
    
por 01.10.2014 / 17:08
0

Sua sintaxe está apenas ligeiramente desativada. Tente usar groups.server_list como seu with_items list .

Eu não uso o host_vars como você, então me avise se você obtiver um erro de analisador trabalhando nessa parte do seu manual.

Mas o seguinte deve colocar um nome de host no lugar de {{item}}.

- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
  with_items: groups.server_list
    
por 25.07.2014 / 23:38
0

Se você precisar adicionar um prefixo e um sufixo, além de fazer de tudo uma lista, dê uma olhada no abaixo:

  set_fact:
    extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\1:2379') | list  }}"

pega a lista de todas as máquinas do grupo etcd, extrai o ipv4, adiciona um 'https: //' na frente e um ': 2379' no final. Finalmente, tudo é transformado em uma lista.

    
por 14.09.2018 / 17:14

Tags