可变模块字段

时间:2019-07-06 16:21:53

标签: ansible

如何为模块设置自定义键? 我想做什么:

Employee

以上内容引发错误,“模块不支持的参数:{{var}}”。

这对我很有用,例如设置iptables:

module:
  "{{ var }}": ...

我是Ansible的新手;环顾四周,我没有找到解决方法。

1 个答案:

答案 0 :(得分:1)

您不能将jinja2模板表达式用作yaml hasmap键:如您所知,它将不会被解释。

我使用file module为自己的命题提供了可复制的示例(这只是为了说明,在这些特定情况下,有很多更简单,更好的方法可以达到相同的结果)。

命题1:骇人听闻的警告

一种与您尝试的类似的操作方式是在构造的var中声明模块的所有参数,您可以在其中使用jinja2模板。

---
- name: Test dynamic parameters
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Set atime and mtime of file sequentially
      file: "{{ {'path': '/tmp/test_dynparm.txt', 'state': 'touch', item: '201901010000.00'} }}"
      loop:
        - access_time
        - modification_time

这给出了以下结果

TASK [Set atime and mtime of file sequentially] ***************************************************************************************************************************************************************************
 [WARNING]: Using a variable for a task's 'args' is unsafe in some situations (see https://docs.ansible.com/ansible/devel/reference_appendices/faq.html#argsplat-unsafe)

changed: [localhost] => (item=access_time)
changed: [localhost] => (item=modification_time)

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


如您所见,这可行,但是您会收到来自ansible的警告,提示您无法关闭,因为在var can be unsafe中传递了模块参数。而且,在这种情况下,您必须对要传递给模块的所有静态键和值进行引用。

主张2:没有警告,并且可能更容易维护

我的首选解决方案是用纯Yaml写下静态模块参数,在循环变量中传递可选参数,然后使用defaultomit过滤器。

---
- name: Test dynamic parameters
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Set atime and mtime of file sequentially
      vars:
        time: 201901010000.00
      file:
        path: '/tmp/test_dynparm.txt'
        state: 'touch'
        access_time: "{{ item.access_time | default(omit) }}"
        modification_time: "{{ item.modification_time | default(omit) }}"
      loop:
        - access_time: "{{ time }}"
        - modification_time: "{{ time }}"

哪个给:

PLAY [Test dynamic parameters] ********************************************************************************************************************************************************************************************

TASK [Set atime and mtime of file sequentially] ***************************************************************************************************************************************************************************
changed: [localhost] => (item={'access_time': 201901010000.0})
changed: [localhost] => (item={'modification_time': 201901010000.0})

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0