我可以使用字典变量来提供所有任务参数吗?

我可以使用字典变量来提供所有任务参数吗?

我想运行一个使用 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 }}"

相关内容