具有src的Ansible文件副本,具体取决于路径是否存在

时间:2018-03-21 08:13:36

标签: ansible

假设我有分配标准/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中想做什么是明智之举,如果是这样,我将如何实现它?如果没有,这种事情的正确模式是什么?

我意识到我可以通过为源路径设置变量并在每个主机的基础上覆盖它来实现。对我来说,这种方法的缺点是主机变量设置在远离角色定义的位置,而且它需要一个变量设置一个文件被放置,而我的方式d喜欢这样做只需要将文件放在角色目录树中。

我还发现我可以通过使用stat模块来检查主机名中的源文件路径是否确实存在,但是如果没有两个复制任务我没有找到方法,一个when: blah.stat.exists defined,另一个when: blah.stat.exists not defined,用于通用文件的副本。然后它还会在输出中列出三个任务:一个用于stat,然后一个用于每个可能的副本,这看起来有点冗长。

有没有办法做我想做的事情,或者有更好的方法来实现类似的结果吗?

1 个答案:

答案 0 :(得分:0)

啊,看起来我能够通过找到第一个匹配的循环来完成它:

http://docs.ansible.com/ansible/latest/playbooks_loops.html#finding-first-matched-files

- name: Define contents of /etc/aliases
  copy:
      src:   "{{ item }}"
      dest:  /etc/aliases
      owner: root
      group: root
      mode:  0644
  with_first_found:
      - fqdn/{{ inventory_hostname }}/etc/aliases
      - generic/etc/aliases

我花了几个小时搜索这样的东西,但直到现在我似乎没有使用正确的搜索词!