У меня в 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 файлы инвентаризации