【问题标题】:How to use Ansible's with_item with a variable?如何将 Ansible 的 with_item 与变量一起使用?
【发布时间】:2016-03-03 00:52:45
【问题描述】:

我正在尝试转换 Ansible Playbook 中列表项的某些字段。这是最简单的复制路径,跳过转换。结果应该与users 变量相同。

---
# 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 非常接近我的需要,但我找不到使用 set_fact 以及 with_items 和项目作为地图的工作示例。

我已经尝试了 Ansible 1.9.2、1.9.4 和 2.0.0-0.6.rc1 的不同错误消息,但没有更多成功。 Ansible 2 应该允许跳过对 set_fact 的第二次调用,但错误发生在到达那里之前。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    我以为我确实在某处读到 with_items 接受一个裸变量名,但事实并非如此。

    程序按预期运行:

    with_items: "{{ users }}"
    

    【讨论】:

    • 问题出在原始代码中的 with_items: 子句中,在 - users 行上 - 这是创建一个单项列表,单项本身就是 users 列表。您修改后的代码有效,并且还避免了弃用警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多