我发现自己反复向 Ansible 的文件相关模块输入参数,如下所示:
- copy:
[…]
owner: root
group: root
mode: ugo=r
尽管可以安全地假设省略这些所有权参数将导致与任务“sudo
已”执行相同的结果,但我想在角色的默认值或每个模块或甚至一组模块的主机变量的范围内明确定义这些参数。
有没有办法可以促进这样的定义?
答案1
是的,只要您使用的是 >= 2.6 版本,就可以这样做。这可以使用module_defaults
关键词。
示例用法如下:
---
- hosts: localhost
gather_facts: no
module_defaults:
file:
owner: foobar
tasks:
- file:
path: /tmp/defaults_test
state: touch
答案2
每次调用模块时都需要传入参数,这是模块输入的唯一方式。
在任务中复制多个文件时,您可以遍历列表。
- copy:
src: "{{item}}"
dest: "/etc/logrotate.d/{{item}}"
owner: root
group: root
mode: ugo=r
with_items:
- foo
- bar
您可以为这些参数定义变量,但您仍然需要在每次调用模块时使用这些变量。这样您就可以同时在多个位置覆盖该值。
答案3
我想在角色的默认值或每个模块或甚至一组模块的主机变量的范围内明确定义这些参数。
幸运的是,你不能,而且由于你使用“明确”这个词的方式,你的请求是不连贯的。
事实上,你想“定义这些参数一次,以便它们被应用隐含地“。
另一方面,Ansible 需要指定参数值明确地。
尽管可以安全地假设省略这些所有权参数将产生与“sudoedly”执行的任务相同的结果,
不,不安全的假设省略参数会将所有权设置为您头脑中定义的值。
最简单的情况是文件已经存在,Ansible 仅更改其内容。在这种情况下,它不会隐式修复权限/所有权。
您能做的最好的事情是在任务中明确指定所需的参数。
如果您想要一些灵活性,请使用在单个地方定义的变量:
vars:
my_owner: root
my_group: root
my_mode: ugo=r
tasks:
- copy:
[…]
owner: "{{ my_owner }}"
group: "{{ my_group }}"
mode: "{{ my_mode }}"
另一件需要牢记的重要事情是,历史上并非所有模块在文件权限方面的行为方式都相同。也就是说,有些模块(url
如果我没记错的话)仅在实际创建/更改文件时才设置明确指定的权限,而其他情况下则保持权限不变。
没有理由不测试系统(使用单独的流程,无论是使用 Ansible 还是其他工具)。