Необязательные общие файлы между ролями
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