【发布时间】:2018-03-21 08:13:36
【问题描述】:
假设我有一个分发标准/etc/aliases 文件的任务。
- name: Distribute /etc/aliases
copy:
src: generic/etc/aliases
dest: /etc/aliases
owner: root
group: root
mode: 0644
但我希望有一个如下所示的目录结构:
site.yml
roles/
common/
files/
fqdn/
foo.example.com/
etc/
aliases
generic/
etc/
aliases
tasks/
main.yml
etc_aliases.yml
然后,如果(且仅当)文件 fqdn/{{ inventory_hostname }}/etc/aliases 存在,则复制该文件,否则复制文件 generic/etc/aliases。因此,选择复制哪个文件完全取决于该文件是否存在;通过创建fqdn/foo.example.com/etc/aliases 文件,主机 foo.example.com 会得到该文件,而不是通用文件。
在 Ansible 中这样做是否明智?如果是,我将如何实现?如果不是,这种事情的正确模式是什么?
我意识到我可以通过为源路径设置一个变量并在每个主机上覆盖它来做到这一点。对我来说,这种方法的缺点是主机变量被设置在远离角色定义的地方,而且它需要一个变量设置和一个文件被放置,而我的方式是我想这样做只需要在角色目录树中放置一个文件。
我还发现我可以通过使用 stat 模块来检查是否首先存在带有主机名的源文件路径,但是我没有找到没有两个复制任务的方法,一个带有when: blah.stat.exists defined,另一个带有when: blah.stat.exists not defined,用于通用文件的副本。然后它还在输出中列出了三个任务:一个用于统计数据,然后一个用于每个可能的副本,这似乎有点冗长。
有没有办法做我想做的事,或者有更好的方法来实现类似的结果?
【问题讨论】:
标签: ansible