Ansible在角色之间共享文件

时间:2015-12-15 10:59:57

标签: ansible

Ansible Best Practices描述了每个角色都包含文件目录,其中包含此规则所需的所有文件。

在我的情况下,我有不同的角色,共享相同的文件。但我无法在每个角色中复制这些文件,因为这些文件没有任何一个来源,如果其中一个文件发生了编辑,那么为每个角色进行此更改将变得乏味。

我制作的解决方案是创建另一个文件夹并使用绝对或相对路径引用它。 这是最好的方法吗?

我的ansible目录看起来像这样

play.yml
roles/
  web/
    tasks/
    files/
      common-1
      common-2
      other-multiple-files
  role-2/
    tasks/
    files/
      common-1
      common-2
      other-multiple-files
  role-3/
    tasks/
      files/
        common-2
  role-4/
    tasks/
      files/
        common-1

5 个答案:

答案 0 :(得分:19)

你可以尝试两种相当不错的方法来减少重复。

您可以拥有一个单独的shared-files目录,作为您的角色文件夹的兄弟,如下所示:

play.yml
roles/
  web/
    tasks/
    files/
      other-multiple-files
  role-2/
    tasks/
    files/
      other-multiple-files
  role-3/
    tasks/
  role-4/
    tasks/
  shared-files/
    common-1
    common-2

然后,您将在任务中使用角色/文件夹所在的相对文件位置引用它:

- name: copy common-1
  copy:
    src: ../../common-1
    dest: /path/to/dest/common-1

- name: copy role specific file
    src: other-multiple-files
    dest: /path/to/dest/other-multiple-files

或者,要使用文件夹的相对路径,您可以将这些内容符号链接:

play.yml
roles/
  web/
    tasks/
    files/
      common-1 -> ../../common-1
      common-2 -> ../../common-2
      other-multiple-files
  role-2/
    tasks/
    files/
      common-1 -> ../../common-1
      common-2 -> ../../common-2
      other-multiple-files
  role-3/
    tasks/
    files/
      common-2 -> ../../common-2
  role-4/
    tasks/
    files/
      common-1 -> ../../common-1
  shared-files/
    common-1
    common-2

然后,您可以直接引用该文件,就好像它位于角色/ files目录中一样:

- name: copy common-1
  copy:
    src: common-1
    dest: /path/to/dest/common-1

- name: copy role specific file
    src: other-multiple-files
    dest: /path/to/dest/other-multiple-files

答案 1 :(得分:10)

我的解决方案是为常见内容创建角色并将其添加为依赖项。

例如,您的剧本看起来像这样

play.yml
roles/
  common-1/
    files/
      common-1
  common-2/
    files/
      common-2
  web/
    meta/
      common-1
      common-2
    tasks/
    files/
      other-multiple-files
  role-2/
    meta/
      common-1
      common-2
    tasks/
    files/
      other-multiple-files
  role-3/
    meta/
      common-2
    tasks/
  role-4/
    meta/
      common-1
    tasks/

因此,roles/common-1roles/common-2是仅部署文件的角色,以及需要这些文件的所有角色,它们将其作为meta/文件夹中的依赖项。

答案 2 :(得分:2)

Ansible实际上支持项目范围的公用文件夹。无需创建自定义文件夹。 参见and

的其他问题,请参见Ansible: Global template folder?的答案

还接受tasks/根级别的ansible/文件夹。

顺便说一句,我找不到关于这种目录结构https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout

的任何官方文档

答案 3 :(得分:1)

我使用一些给定的变量,例如inventory_dir,并将文件相对于此路径放置。然后定义一个变量

common_files_path: "{{ inventory_dir }}/resources/shared_files"

...然后在ansible任务中使用它

- name: get local files
  command: cat {{ item }}
  register: some_files
  with_fileglob: "{{ common_files_path }}/*"
  delegate_to: localhost

答案 4 :(得分:0)

“ src”路径相对于您角色中的“ files”目录。这就是为什么仅通过将foo.txt指定为src来选择文件role / bar / files / foo.txt的原因。通过扩展,相对路径是相对于文件文件夹的。 src的位置:../../../../foo/bar.txt十分清晰。如果您所有的角色都需要bar.txt,则它们都可以提供相同的相对路径,因为您的所有角色都是同级。