为什么可以为每个主机创建一个新的主机作用域列表变量?



我需要创建一个从所有主机的运行状态派生的ip地址变量。我希望插入一个新的字符串值,并将其附加到列表中。

当我运行下面的ansible-playbook时,它为每个主机创建了一个看起来像新的列表实例的东西,而不是修改playbook级别变量。

我的理解是下面的set_fact应该连接列表并将它们分配回播放范围varip_list_from_terraform。为什么我得到主机作用域的结果?

---
- name: Bootstrap nodes
hosts: all
become: true
gather_facts: true
vars:
ip_list_from_terraform: ['Verify']
tasks:
- name: assign a list of all the physical network private IPs
set_fact:
ip_list_from_terraform: "{{ ip_list_from_terraform + [ item ] }}"
with_items: " {{ hostvars[inventory_hostname]['ansible_' + ansible_default_ipv4['interface']]['ipv4']['address'] }} "
register: ip_list_from_terraform_list
- name: Debug global var
debug:
var: ip_list_from_terraform
- name: Debug register result
debug:
var: ip_list_from_terraform_list

:

ok: [shrimp-master-0] => {
"ip_list_from_terraform": [
"Verify",
"10.0.2.41",
"10.0.2.172",
"10.0.2.33",
"10.0.2.215",
"10.0.2.131",
"10.0.2.168",
"10.0.2.118"
]

}

实际:

TASK [Debug global var] ********************************************************************************************************************************************************************************************************************
ok: [shrimp-master-0] => {
"ip_list_from_terraform": [
"Verify",
"10.0.2.12"
]
}
ok: [shrimp-master-1] => {
"ip_list_from_terraform": [
"Verify",
"10.0.2.33"
]
}
ok: [shrimp-master-2] => {
"ip_list_from_terraform": [
"Verify",
"10.0.2.215"
]
}
ok: [shrimp-worker-0-super-wallaby] => {
"ip_list_from_terraform": [
"Verify",
"10.0.2.131"
]
}
ok: [shrimp-gpu-worker-0-settled-wombat] => {
"ip_list_from_terraform": [
"Verify",
"10.0.2.151"
]
}

让我们简化一下。给定库存

shell> cat hosts
host1 test_ip=10.0.2.41
host2 test_ip=10.0.2.172
host3 test_ip=10.0.2.33

的剧本
- hosts: host1,host2,host3
vars:
ip_list_from_terraform: ['Verify']
tasks:
- set_fact:
ip_list_from_terraform: "{{ ip_list_from_terraform + [ item ] }}"
with_items: "{{ hostvars[inventory_hostname]['test_ip'] }}"
- debug:
var: ip_list_from_terraform

ok: [host2] => 
ip_list_from_terraform:
- Verify
- 10.0.2.172
ok: [host1] => 
ip_list_from_terraform:
- Verify
- 10.0.2.41
ok: [host3] => 
ip_list_from_terraform:
- Verify
- 10.0.2.33

作为旁注,with_items是必需的,因为参数是字符串。loop将崩溃,错误为'Invalid data passed to ''loop'', it requires a list,


Q:">set_fact应该连接列表">

A:运行一次并循环ansible_play_hosts。例如

- set_fact:
ip_list_from_terraform: "{{ ip_list_from_terraform +
[hostvars[item]['test_ip']] }}"
loop: "{{ ansible_play_hosts }}"
run_once: true

ip_list_from_terraform:
- Verify
- 10.0.2.41
- 10.0.2.172
- 10.0.2.33

相关内容

  • 没有找到相关文章

最新更新