Вот мой файл списка переменных vars/blah.yml:
---
stuff:
- stuff1: bill
stuff2: sue
Я просто пытаюсь получить значения переменных.
Вот мой план действий:
hosts: all
become: yes
vars_files:
- vars/blah.yml
tasks:
- name: test
debug:
var: "{{ item.stuff1 }} {{ item.stuff2 }}"
loop :
- "{{ stuff }}"
Я получаю эту ошибку.
fatal: [node1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'stuff1'\n\nThe error appears to be in '/home/automation/plays/test1.yml': line 11, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: test\n ^ here\n"}
Может ли кто-нибудь сказать мне, что я делаю не так?
Отредактировал форматирование переменных. Все равно получаю те же результаты.
решение1
TL;DR
loop: "{{ stuff }}"
Полная история
В отличие от предыдущего и все еще широко используемого по умолчанию варианта with_items:
, bare loop:
не применяет автоматическое действие flatten(level=1)
к переданным аргументам.
Дополнительную информацию об этой функции можно найти здесь:
- документация по поиску товара
- процедура
with_items
миграцииloop
в документации по циклам ansible.
Если ваш пример использовалwith_items
with_items:
- "{{ stuff }}"
полученный список все равно будет точно таким, какой вы определили в своем файле.
Теперь используется сloop
loop:
- "{{ stuff }}"
Вы выполняете цикл по списку списков, который выглядит следующим образом (обратите внимание на одиночное тире в верхней части примера ниже и отступ остального содержимого: это не опечатка).
-
- stuff1: bill
stuff2: sue
Таким образом, первый элемент, который вы получаете в цикле, на самом деле является полным списком в вашем var-файле.
Чтобы это исправить, просто передайте переменную правильно loop
, т.е.
loop: "{{ stuff }}"
решение2
Формат вашего файла переменных неверный. Верхний уровень — это не список, он должен выглядеть так:
---
stuff:
- stuff1: bill
stuff2: sue
Кроме того, путь к файлу vars должен начинаться с символа / из корня Ansible:
vars_files:
- /vars/blah.yml