Ansible 2.9用loop替代with_dict报错,需任务传值该如何处理?
解决Ansible 2.9中loop替代with_dict的模板错误问题
不用换回with_dict,你的问题出在loop的语法写法错误,调整后即可正常使用loop。
错误原因
你在Jinja2模板中直接写{{ key:/var/tmp/a value:/tmp/h |dict2items }}是语法错误:
- Jinja2表达式里定义字典必须用
{}包裹键值对,且字符串类型的键/值需要加引号 dict2items过滤器的正确用法是传入一个完整字典,而非零散的键值对
正确写法示例
写法1:直接定义字典列表(推荐,直观易读)
- name: copy module copy: src: "{{ item.src }}" dest: "{{ item.dest }}" loop: - { src: "/var/tmp/a", dest: "/tmp/h" } - { src: "/var/tmp/b", dest: "/tmp/z" }
写法2:保持key/value键名,用列表包裹字典
- name: copy module copy: src: "{{ item.key }}" dest: "{{ item.value }}" loop: - { key: "/var/tmp/a", value: "/tmp/h" } - { key: "/var/tmp/b", value: "/tmp/z" }
写法3:用dict2items过滤器转换字典
如果更倾向于用键值对字典的形式,可以先定义完整字典再通过dict2items转成loop可用的列表:
- name: copy module copy: src: "{{ item.key }}" dest: "{{ item.value }}" loop: "{{ { '/var/tmp/a': '/tmp/h', '/var/tmp/b': '/tmp/z' } | dict2items }}"
以上三种写法都能在Ansible 2.9中正常运行,无需退回with_dict。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

