Необязательные общие файлы между ролями

Ansible Best Practices описал, что каждая роль содержит каталог файлов, в котором есть все файлы, необходимые этому правилу.

В моем случае у меня разные роли, которые используют одни и те же файлы. Но я не могу сделать копию этих файлов в каждой роли, так как не будет ни одного источника этих файлов, и если редактирование произойдет с одним из них, станет утомительно сделать это изменение для каждой роли.

Решение, которое я сделал, - создать другую папку и ссылаться на нее с использованием абсолютного или относительного пути. Это лучший способ сделать это?

Мой знакомый каталог выглядит следующим образом

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

Ответ 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

Затем вы ссылаетесь на это в задачах с относительным расположением файла, из которого будет папка 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-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

Ответ 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-1 и roles/common-2 - это роли, которые просто развертывают файлы, и все роли, которые в них нуждаются, у них есть зависимость в папке meta/.

Ответ 3

Я использую некоторые заданные переменные типа TG40 и размещаю файлы по этому пути. Итак, я определяю переменную

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

... а затем использовать его в задании

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

Ответ 4

Ansible на самом деле поддерживает общие папки проекта. Нет необходимости создавать пользовательские папки. Смотрите ответ и в этом другом вопросе Ответ: глобальная папка шаблонов?

Папка tasks/ на корневом уровне ansible/ также принимается.

Кстати, я не смог найти никакой официальной документации по такого рода структуре каталогов. https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout

Ответ 5

Короткий ответ (должны быть дополнительные баллы для коротких, сжатых ответов) o вопрос:

Нет

Лучше использовать git подмодули. От:

http://random-notes-chris.blogspot.co.uk/2014/02/git-submodules-for-ansible-roles.html

Every role lives in its own git repo. An example is Vincent Rischmann ansible-role-java.
Every app (or project) has its own git repo for its Ansible configuration (inventory definition and playbooks etc.).
The app repo has a roles sub directory. Actual roles (e.g. the java role) are then added as git submodules.

git submodule add https://github.com/vrischmann/ansible-role-java.git roles/java