Ansible: Adicione o IP de todos os hosts ao / etc / hosts de todos os outros hosts

3

Portanto, estou implantando um pequeno cluster de 3 nós e preciso adicionar os endereços IP públicos, conforme definido no meu inventário, a todos os arquivos / etc / hosts de todos os nós. Eu estou tentando usar o seguinte, mas está me dando um erro:

- name: Add IP address of all hosts to all hosts
  lineinfile: 
    dest: /etc/hosts
    line: '{{ hostvars[item]["ansible_host"] }} {{ hostvars[item]["ansible_hostname"] }} {{ hostvars[item]["ansible_nodename"] }}'
    state: present
  with_items: groups['all']

O erro é:

fatal: [app1.domain.com]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'ansible.vars.hostvars.HostVars object' has no attribute u\"groups['all']\"\n\nThe error appears to have been in '/Users/k/Projects/Ansible/roles/common/tasks/main.yml': line 29, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Add IP address of all hosts to all hosts\n ^ here\n"}

Não sei o que está acontecendo. Eu ainda sou novo no Ansible e fiquei feliz com o meu progresso até agora. Alguma idéia do que eu sinto falta?

    
por Kevin 15.02.2017 / 23:11

2 respostas

8

Parece que você tem erros em sua sintaxe. Além disso, qual versão do ansible você está usando? Os nomes das variáveis podem ser diferentes. Na versão 2.2 , isso funciona para mim:

- name: Add IP address of all hosts to all hosts
  lineinfile:
    dest: /etc/hosts
    line: "{{ hostvars[item].ansible_host }} {{ hostvars[item].inventory_hostname }} {{ hostvars[item].inventory_hostname_short }}"
    state: present
  with_items: "{{ groups.all }}"

UPDATE

Basil pensou em situações em que o IP muda. Nesse caso, é melhor usar a solução sugerida:

- name: Add IP address of all hosts to all hosts
  lineinfile:
    dest: /etc/hosts
    regexp: '.*{{ item }}$'
    line: "{{ hostvars[item].ansible_host }} {{item}}"
    state: present
  when: hostvars[item].ansible_host is defined
  with_items: "{{ groups.all }}"
    
por 16.02.2017 / 07:01
2

A resposta anterior simplesmente não funciona porque adiciona uma nova linha ao mesmo host em vez de modificar a linha existente quando um endereço IP de um host é alterado.

A solução a seguir leva em conta quando o endereço IP muda para um servidor específico e o trata bem apenas modificando a linha em vez de adicionar entradas duplicadas.

---
- name: Add IP address of all hosts to all hosts
  lineinfile:
    dest: /etc/hosts
    regexp: '.*{{ item }}$'
    line: "{{ hostvars[item].ansible_host }} {{item}}"
    state: present
  when: hostvars[item].ansible_host is defined
  with_items: "{{ groups.all }}"
    
por 15.10.2018 / 13:15

Tags