Ansible-根据库存主机名定义的变量列表中的项目列表

Ansible-根据库存主机名定义的变量列表中的项目列表,ansible,jinja2,ansible-inventory,Ansible,Jinja2,Ansible Inventory,我的主机变量中有一个名为“bonding”的变量-这是一个要聚合到bond0接口的网络接口列表。这些值在资源清册中定义,并在每个主机的“我的变量”中正确列出 production/ ├── group_vars │   └── ipbatch.yaml ├── hosts.yaml └── host_vars ├── ipbatch1.yaml ├── ipbatch2.yaml └── ipbatch3.yaml 生产/host_vars/ipbatch3.yaml的

我的主机变量中有一个名为“bonding”的变量-这是一个要聚合到bond0接口的网络接口列表。这些值在资源清册中定义,并在每个主机的“我的变量”中正确列出

production/
├── group_vars
│   └── ipbatch.yaml
├── hosts.yaml
└── host_vars
    ├── ipbatch1.yaml
    ├── ipbatch2.yaml
    └── ipbatch3.yaml
生产/host_vars/ipbatch3.yaml的内容:

检查此变量是否正确设置:

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 }}"
    - debug:
        var: "{{ hostvars[inventory_hostname][bonding] | list }}"
问题是:ansible说我的物品清单是空的。 我正在尝试调试我的变量请求,方法如下:

  tasks:
    - set_fact:
        interface_bond: "{{ ansible_interfaces | select('match','^bond[0-9]') | sort | list | first }}"
    - 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清单文件中所述,

bonding
是散列中键的名称(作为字符串),而不是要用作键的变量的名称。此外,yaml结构中的
bonding
已经是您可以直接访问的列表。在这种情况下,不需要使用
列表
过滤器

创建循环的正确语法为:

  • 带有以下项:“{{hostvars[inventory\u hostname]['bonding']}}”
  • 带有以下项:“{{hostvars[inventory\u hostname].bonding}”

感谢@Zeitounator的回答。但是,这些解决方案都不起作用,它们都输出相同的错误:任务[debug]***确定:[ipbatch3]=>{“”:“变量未定义!”}任务[network:network | setup NIC]***致命:[ipbatch3]:失败!=>{“msg”:“'item'未定义”}也许我应该改变声明变量的方式以获得一个干净的变量名?您包含角色的方式似乎很奇怪。你能发布你的完整剧本吗?I这包括在剧本的角色部分,它不能按预期工作。您需要将include角色用作
任务
。考虑一下也看一下。根据经验:你通常会提出你自己的解决方案,只是试着用一个简单的例子来复制。事实上,我已经把剧本的一部分剪短了。独立任务在我的角色之前启动。但这应该是这样的:```-hosts:ipbatch3变成:true-gather\u-facts:true-roles:-role:network-network\u-ifaces:-device:“{{item}”bondmaster:bond0和{u-items:“{{hostvars[inventory\u-hostname].bonding}”```