【问题标题】:Ansible shared files between roles角色之间的 Ansible 共享文件
【发布时间】:2015-12-15 10:59:57
【问题描述】:

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

【问题讨论】:

  • 使用新角色中的公共文件重构两个角色的任务,然后将这个新角色作为两个角色的 meta/main.yml 中的依赖项
  • @ᴳᵁᴵᴰᴼ 如果两个规则之间有相同的文件,我可以这样做,但是如果我有更多的规则包含一些文件创建角色作为依赖项将不适用。抱歉,我对此不够清楚,我在问题中添加了另外两条规则以明确我的观点

标签: ansible


【解决方案1】:

您可以在这里尝试两种相当不错的方法来减少重复。

您可以有一个单独的 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

然后您可以像直接在角色/文件目录中一样引用该文件:

- 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

【讨论】:

  • 我非常喜欢符号链接的方式,它可以让角色没有路径,并且路径只会在符号链接中设置一次。
  • 我在角色中经常使用符号链接来共享文件、模板等。 git 可以很好地处理符号链接,因此各种文件和模板目录之间的相对符号链接是小菜一碟。
  • 你的来源:../../common-1 应该是src: ../../shared-files/common-1
  • 我们如何在 ansible 角色/文件中创建符号链接?我们必须在 ansible 中设置它还是必须在客户端机器中配置它?
  • 它只是在文件系统上。如果您将 Ansible 代码保存在 git 中,那么它将为存储库的所有用户设置符号链接。
【解决方案2】:

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

例如,你的剧本应该是这样的

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/ 文件夹中。

【讨论】:

  • 在尝试使用不接受相对路径的 {%- import "file.j2" -%} 从另一个角色导入模板时可能很有用。
【解决方案3】:

Ansible 实际上支持项目范围的公共文件夹。无需创建自定义命名的文件夹。 在另一个问题Ansible: Global template folder? 中查看and 的答案

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

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

【讨论】:

【解决方案4】:

我使用一些给定的 ansible 变量,例如 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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      这里还没有讨论另一种方法。您可以在主要 playbook 所在的同一文件夹中创建“文件”和其他目录,并使用 playbook_dir 特殊变量来访问它们。

      例如:

      play.yml
      files/
        common-1.py
      roles/
        role-1/
          tasks/
            main.yml
      

      然后,在角色/role-1/tasks/main.yml 中运行播放级“文件”目录中的常用脚本,如下所示:

      - name: Run common-1.py
        command: "{{ playbook_dir }}/files/common-1.py"
        changed_when: false
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        相关资源
        最近更新 更多