É uma continuação de um problema resolvido nesta questão .
É necessário adicionar outra variável dos hosts, o INSTANCE_CLASS
. Variáveis de hosts são salvas como arquivos sem extensão no host_vars
diretório, carregando nomes de host como nomes de arquivos, por exemplo host12
:
---
ansible_host: 10.11.12.15
INSTANCE_CLASS: vm_host
...
A extração de hostvar de vários hosts foi descrita na pergunta vinculada; no entanto, quando tentei criar uma lista de dicionários em vez de uma lista de strings, os resultados não foram os esperados.
Tentativa nº 1:
hosts: general
gather_facts: false
vars:
ip_list: "{{ ansible_play_hosts_all | map('extract', hostvars, 'ansible_hostname') }}"
tasks:
- name: Get all IPs
set_fact:
ne_hosts:
- ip: "{{ hostvars[item]['ansible_host'] }}"
instance_class: "{{ hostvars[item]['INSTANCE_CLASS'] }}"
loop: "{{ ip_list }}"
delegate_to: localhost
delegate_facts: true
run_once: true
-
hosts: localhost
gather_facts: false
tasks:
- name: Display gathered IPs
debug:
var: ne_hosts
Este substitui as variáveis anteriores, deixando apenas a última no array:
TASK [Display gathered IPs] ***************************************************************************************************************************************
ok: [localhost] => {
"ne_hosts": [
{
"instance_class": "mdd_controller",
"ip": "10.11.12.19"
}
]
}
Tentativa nº 2:
hosts: general
gather_facts: false
vars:
ip_list: "{{ ansible_play_hosts_all | map('extract', hostvars, 'ansible_host') }}" ### changed var
tasks:
- name: Get all IPs
set_fact:
ne_hosts: "ip: {{ ip_list }}, instance_class: {{ INSTANCE_CLASS }}" ### changed line
delegate_to: localhost
delegate_facts: true
run_once: true
-
hosts: localhost
gather_facts: false
tasks:
- name: Display gathered IPs
debug:
var: ne_hosts
Este fornece a lista completa de IPs, mas apenas a última classe de instância é exibida:
TASK [Display gathered IPs] ***************************************************************************************************************************************
ok: [localhost] => {
"ne_hosts": "ip: ['10.11.12.15', '10.11.12.19'], instance_class: mdd_controller"
}
O que fazer para receber algo como:
"ne_hosts": "[
{ip: '10.11.12.15', instance_class: vm_host},
{ip: '10.11.12.19', instance_class: mdd_controller}
]"
?
A declaração abaixo dá o que você deseja
Por exemplo, dado o inventário
e o host_vars
O manual
dá (resumido)
Nota: A declaração acima funciona porque os apresentadores da peça estão limitados ao grupo geral . Portanto a lista ansible_play_hosts_all mantém os mesmos itens de groups.general . Para responder à sua pergunta:
P: "Como extrair vários hostvars de todos os hosts de um grupo?"
R: Uma resposta melhor poderia ser
Basicamente, você está perguntando como anexar um array no ansible.
Experimente isto: