Я пытаюсь преобразовать некоторые поля элементов списка в Ansible Playbook. Вот простейший путь воспроизведения, пропуская преобразование. Результат должен быть идентичен переменной users
.Как использовать Ansible with_item с переменной?
---
# Run with:
# ansible-playbook -i "localhost," loop3.yml
- hosts: localhost
connection: local
gather_facts: false
vars:
users:
- name: paul
uid: 1
- name: pete
uid: 2
tasks:
- set_fact:
args:
useritem:
name: '{{ item.name }}'
uid: '{{ item.uid }}'
with_items:
- users
register: sf_result
- debug: var=sf_result
- set_fact:
userslist: "{{ sf_result.results | map(attribute='ansible_facts.useritem') | list }}"
- debug: var=userslist
Я получаю эту ошибку:
TASK [set_fact useritem={u'name': u'{{ item.name }}', u'uid': u'{{ item.uid }}'}] ***
fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! 'unicode object' has no attribute 'name'"}
Есть severalexamples очень близко к тому, что я needbut я не смог найти рабочий пример использования set_fact
вместе с with_items
и предметов, как карты.
Я пробовал Ansible 1.9.2, 1.9.4 и 2.0.0-0.6.rc1 с различными сообщениями об ошибках, но не более успеха. Ansible 2 должен позволить пропустить второй вызов до set_fact
, но ошибка происходит до того, как попасть туда.
Проблема заключалась в 'with_items:' положение в исходном коде, на '- users' линии - это создание списка одного элемента, с единственным сам элемент является списком 'users'. Ваш пересмотренный код работает, а также позволяет избежать предупреждения об устаревании. – RichVel