2015-11-29 2 views
1

Я пытаюсь преобразовать некоторые поля элементов списка в 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, но ошибка происходит до того, как попасть туда.

ответ

2

Я думал, что где-то читал, что with_items принимает имя переменной, но это не тот случай.

Программа работает, как ожидалось, используя:

with_items: "{{ users }}" 
+0

Проблема заключалась в 'with_items:' положение в исходном коде, на '- users' линии - это создание списка одного элемента, с единственным сам элемент является списком 'users'. Ваш пересмотренный код работает, а также позволяет избежать предупреждения об устаревании. – RichVel

Смежные вопросы