这是此问题中解决的问题的后续行动。
需要从主机添加另一个变量,即INSTANCE_CLASS
. 主机变量在目录中保存为无扩展名文件host_vars
,以主机名作为文件名,例如host12
:
---
ansible_host: 10.11.12.15
INSTANCE_CLASS: vm_host
...
链接的问题中描述了从多个主机中提取 hostvar ,但是当我尝试创建字典列表而不是字符串列表时,结果并不像我预期的那样。
尝试#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
这个会覆盖之前的变量,只留下数组中的最后一个:
TASK [Display gathered IPs] ***************************************************************************************************************************************
ok: [localhost] => {
"ne_hosts": [
{
"instance_class": "mdd_controller",
"ip": "10.11.12.19"
}
]
}
尝试#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
这给出了完整的 IP 列表,但仅显示最后一个实例类:
TASK [Display gathered IPs] ***************************************************************************************************************************************
ok: [localhost] => {
"ne_hosts": "ip: ['10.11.12.15', '10.11.12.19'], instance_class: mdd_controller"
}
怎样做才能收到类似的东西:
"ne_hosts": "[
{ip: '10.11.12.15', instance_class: vm_host},
{ip: '10.11.12.19', instance_class: mdd_controller}
]"
?
下面的声明给了你你想要的
例如,给定库存
和主机变量
剧本
给出(删节)
注:以上声明有效,因为该剧的主持人仅限于集团将军。因此,列表ansible_play_hosts_all保留与groups.general相同的项目。回答你的问题:
问:“如何从组中的所有主机中提取多个主机变量?”
答:更好的答案可能是
基本上你问的是如何在 ansible 中附加一个数组。
尝试这个: