【问题标题】:Ansible file copy with src depending on whether a path exists根据路径是否存在,使用 src 复制 Ansible 文件
【发布时间】: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


    【解决方案1】:

    啊,看起来我可以用一个找到第一个匹配的循环来做到这一点:

    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
    

    我花了几个小时搜索类似的内容,但似乎直到现在我才使用正确的搜索词!

    【讨论】:

      猜你喜欢
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      相关资源
      最近更新 更多