Ansible - список предметов из списка переменных, определенного из имени хоста инвентаря - PullRequest
1 голос
/ 10 мая 2019

У меня в 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 должен возвращать список интерфейсов Ethernet, как описано в host_vars файлы инвентаризации

1 Ответ

0 голосов
/ 10 мая 2019

bonding - это имя (в виде строки) вашего ключа в хэше, а не имя переменной, которую вы хотите использовать в качестве ключа. Более того, bonding в вашей структуре yaml - это уже список, к которому вы обращаетесь напрямую. В этом случае нет необходимости использовать фильтр list.

Правильный синтаксис для создания вашего цикла - один из:

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