如何为模块设置自定义键? 我想做什么:
Employee
以上内容引发错误,“模块不支持的参数:{{var}}”。
这对我很有用,例如设置iptables:
module:
"{{ var }}": ...
我是Ansible的新手;环顾四周,我没有找到解决方法。
答案 0 :(得分:1)
您不能将jinja2模板表达式用作yaml hasmap键:如您所知,它将不会被解释。
我使用file
module为自己的命题提供了可复制的示例(这只是为了说明,在这些特定情况下,有很多更简单,更好的方法可以达到相同的结果)。
一种与您尝试的类似的操作方式是在构造的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中传递了模块参数。而且,在这种情况下,您必须对要传递给模块的所有静态键和值进行引用。
我的首选解决方案是用纯Yaml写下静态模块参数,在循环变量中传递可选参数,然后使用default
或omit
过滤器。
---
- 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