Ansible-由清单主机名

时间:2019-05-10 09:08:51

标签: ansible jinja2 ansible-inventory

我的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 库存文件

中所述

1 个答案:

答案 0 :(得分:0)

bonding是哈希中密钥的名称(以字符串形式),而不是要用作密钥的var的名称。此外,您的yaml结构中的bonding已经是您可以直接访问的列表。在这种情况下,无需使用list过滤器。

创建循环的正确语法是以下之一:

  • with_items: "{{ hostvars[inventory_hostname]['bonding'] }}"
  • with_items: "{{ hostvars[inventory_hostname].bonding }}"