我想运行一个使用 with_items 填充参数的任务,而不必手动写入parameter:{{item.key}}
。例如,我有这个主机变量:
HtpasswdsToSet:
- path: /etc/nginx/passwdfile
name: janedoe
password: 'abc123'
- path: /etc/nginx/passwdfile
name: bob
password: '123abc'
笔记字典列表的键是实际的 htpasswd 任务参数。
在剧本中,不要这样做:
- name: add htpasswd users
htpasswd:
path: {{item.path}}
name: {{item.name}}
password: '{{item.password}}'
with_items: "{{HtpasswdsToSet}}"
有没有什么方法可以简单地做到这一点?
- name: add htpasswd users
htpasswd: "{{HtpasswdsToSet}}"
这确实能帮助我减少剧本的冗长程度。谢谢。
答案1
使用 Ansible 2.2,您仍然可以使用args
参数来实现这一点。
但它已被弃用一段时间,并且会向您显示警告。
一些细节关于折旧。
例子:
- hosts: localhost
gather_facts: no
vars:
args_list:
- content: hello world
dest: /tmp/test1.txt
mode: 0666
- content: test test test
dest: /tmp/test2.txt
mode: 0444
tasks:
- copy:
args: "{{ item }}"
with_items: "{{ args_list }}"
答案2
对于那些通过搜索引擎来到这里的人,我已经在 Ansible 2.9.14 上成功测试了以下内容:
vars:
my_module_defaults:
state: present
data_to_fetch:
- arg1: 42
arg2: foo
- arg1: 43
[...]
tasks:
- name: Very slim task
my_module: "{{ my_module_defaults | combine(item) }}"
with_items: "{{ data_to_fetch }}"