Ansible 角色之间的共享文件

Ansible 角色之间的共享文件,ansible,Ansible,描述了每个角色都包含具有此规则所需的所有文件的文件目录 在我的例子中,我有不同的角色共享相同的文件。但我不能在每个角色中复制这些文件,因为这些文件没有一个源,如果其中一个文件发生编辑,则对每个角色进行此更改将变得非常乏味 我提出的一个解决方案是创建另一个文件夹,并使用绝对路径或相对路径引用它这是最好的方法吗? 我的ansible目录如下所示 play.yml roles/ web/ tasks/ files/ common-1 common-2

描述了每个角色都包含具有此规则所需的所有文件的文件目录

在我的例子中,我有不同的角色共享相同的文件。但我不能在每个角色中复制这些文件,因为这些文件没有一个源,如果其中一个文件发生编辑,则对每个角色进行此更改将变得非常乏味

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

我的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
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/

你有两种相当不错的方法,可以在这里尝试,以减少重复

您可以有一个单独的
共享文件
目录,作为您的角色文件夹的同级目录,如下所示:

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
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
然后,您将在任务中引用此文件,其中包含角色/文件文件夹所在的相对文件位置:

- 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/
      other-multiple-files
  role-2/
    tasks/
    files/
      other-multiple-files
  role-3/
    tasks/
  role-4/
    tasks/
  shared-files/
    common-1
    common-2
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
然后,您可以直接引用该文件,就像它位于role/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

我的解决方案是为常见的东西创建角色,并将它们添加为依赖项

例如,您的剧本将如下所示

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
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-1
roles/common-2
是只部署文件的角色,以及所有需要这些文件的角色,它们在
meta/
文件夹中作为依赖项。

我使用一些给定的可解析变量,如
inventory\u 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

Ansible实际上支持项目范围的通用文件夹。无需创建自定义命名文件夹。 在另一个问题中看到答案

也接受根级别的
ansible/
任务/文件夹


顺便说一句,我找不到任何关于这种目录结构的正式文档

“src”路径是相对于您角色中的“files”目录的。这就是为什么文件角色/bar/files/foo.txt是通过简单地将foo.txt指定为src来获取的。按扩展名,相对路径是相对于文件文件夹的。所以src:../../../../foo/bar.txt的位置非常清晰。如果您的所有角色都需要bar.txt,那么它们都可以提供相同的相对路径,因为您的所有角色都是兄弟

使用新角色中的公共文件重构这两个角色的任务,然后将此新角色作为这两个角色的meta/main.yml中的依赖项@ᴳᵁᴵᴰᴼ 如果两个规则之间有相同的公共文件,我可以这样做,但如果我有更多的规则,其中包含一些作为依赖项创建角色的文件,则将不适用。很抱歉,我不太清楚,我在问题中又添加了两条规则,以明确我的观点。我非常喜欢符号链接方法,它将使角色不受路径限制,并且路径在符号链接中只设置一次。我在角色中使用了相当多的符号链接来共享文件、模板等。git很好地处理符号链接,因此各种文件和模板目录之间的相对符号链接是小菜一碟。您的src:
。/../common-1
应该是
src:../../shared files/common-1
我们如何在ansible角色/文件中创建符号链接?我们必须在ansible中设置它,还是必须在客户端机器中配置它?它只是在文件系统上。如果您将Ansible代码保留在git中,则它将为存储库的所有用户设置符号链接。当尝试使用
{%-import”file.j2“-%}
从另一个角色导入模板时,这可能很有用,因为相对路径不被接受。不幸的是,Ansible似乎已放弃对此功能的支持(显然,这不是有意的)。请参见和。