我的host_vars中有一个名为“ bonding”的变量-这是要聚合到bond0接口中的网络接口的列表。这些值是在清单中定义的,并且已正确地在每个主机的变量中列出。
production/
├── group_vars
│ └── ipbatch.yaml
├── hosts.yaml
└── host_vars
├── ipbatch1.yaml
├── ipbatch2.yaml
└── ipbatch3.yaml
production / host_vars / ipbatch3.yaml 的内容:
---
bonding:
- eno3
- eno4
检查此变量是否正确设置:
tasks:
- name: debug test - hostvars
debug:
var: hostvars[inventory_hostname]
输出摘录-看起来正确:
"ansible_virtualization_type": "kvm",
"bonding": [
"eno3",
"eno4"
],
"dns": true,
"ftp": true,
现在,我想以这种方式在角色中使用此变量:
tasks:
- set_fact:
interface_bond: "{{ ansible_interfaces | select('match','^bond[0-9]') | sort | list | first }}"
roles:
- role: network
network_ifaces:
- device: "{{ item }}"
bondmaster: "{{ interface_bond }}"
with_items: "{{ hostvars[inventory_hostname][bonding] | list }}"
这是问题所在:ansible说我的物品清单为空。 我正在尝试通过这种方式调试变量请求:
- debug:
var: "{{ hostvars[inventory_hostname][bonding] | list }}"
输出是一条错误消息。但是,错误消息中将显示正确的值:
fatal: [ipbatch2]: FAILED! => {"msg": "ansible.vars.hostvars.HostVarsVars object has no element ['eno1']"}
fatal: [ipbatch1]: FAILED! => {"msg": "ansible.vars.hostvars.HostVarsVars object has no element ['eth0', 'eth1']"}
fatal: [ipbatch3]: FAILED! => {"msg": "ansible.vars.hostvars.HostVarsVars object has no element ['eno3', 'eno4']"}
我尝试过的:
var: "{{ hostvars[inventory_hostname][bonding] | list }}"
var: "{{ bonding }}"
var: "{{ bonding | list }}"
var: "{{ map('extract','hostvars[inventory_hostname]','bonding')| list }}"
var: "{{ hostvars[inventory_hostname] | map(attribute='bonding') | list }}"
var: "{{ hostvars[inventory_hostname].bonding | list }}"
但是即使有错误,最近的输出也是第一行。
预期结果: with_items 语句应返回以太网接口列表,如 host_vars 库存文件
中所述答案 0 :(得分:0)
bonding
是哈希中密钥的名称(以字符串形式),而不是要用作密钥的var的名称。此外,您的yaml结构中的bonding
已经是您可以直接访问的列表。在这种情况下,无需使用list
过滤器。
创建循环的正确语法是以下之一:
with_items: "{{ hostvars[inventory_hostname]['bonding'] }}"
with_items: "{{ hostvars[inventory_hostname].bonding }}"