Где разместить файл requirements.yml для Ansible и использовать его для разрешения зависимостей?

Я новичок в ансибле и изучал зависимые роли. ссылка на документацию

Чего я не нашел в документации, так это того, где разместить файл requirements.yml.

Например, если мой site.yml выглядит так:

---
- name: prepare system
  hosts: all
  roles:
     - role1

И, скажем так

  • роль1 зависит от роли2 и роли3
  • role2 зависит от role4 и role5

Обычно ансибл-галактики имеют следующую структуру:

└── test-role
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

Зависимости добавляются в meta/main.yml. Предположим, что у role1 есть зависимости, отмеченные в этом файле, например (и то же самое для role2):

dependencies: 
  - role: role2
  - role: role3

И у меня также есть файл requirements.yml, который выглядит так:

---    
- src: some git link1
  version: master
  name: role2
- src: some git link2
  version: master
  name: role3

Мой вопрос: где мне разместить этот requirements.yml файл для role1?

Я понимаю, что требования нужно будет установить командой,

ansible-galaxy install -r requirements.yml -p roles/

И я могу сделать это для роли 1, но как это автоматизировать для роли 2? Нужно ли таким образом вручную разрешать и устанавливать последовательные зависимости или есть что-то получше?


person sudeepgupta90    schedule 20.04.2019    source источник


Ответы (1)


С технической точки зрения, вы можете разместить свой requirements.yml файл где угодно, если вы укажете правильный путь в вашей ansible-galaxy install команде.

Между тем, если вы когда-нибудь захотите запустить свои playbooks из Ansible Tower / Awx, я предлагаю вам придерживаться Требования к Ansible Tower и поместите свой requirements.yml файл в <project-top-level-directory>/roles/requirements.yml

Что касается зависимостей между ролями, ansible-galaxy может отслеживать их самостоятельно, когда они встречаются во время установки. Таким образом, вам не нужно указывать их все в вашем requirements.yml, только те, которые находятся на верхнем уровне. Вам просто нужно правильно указать свои зависимости в каждой внешней роли.

В meta/main.yml для роли1

dependencies:
  - src: https://my.scm.com/my-ansible-roles/role2.git
    scm: git
    version: master
    name: role2
  - src: https://my.scm.com/my-ansible-roles/role3.git
    scm: git
    version: master
    name: role3

В meta/main.yml для роли2

dependencies:
  - src: https://my.scm.com/my-ansible-roles/role4.git
    scm: git
    version: master
    name: role4
  - src: https://my.scm.com/my-ansible-roles/role5.git
    scm: git
    version: master
    name: role5

roles/requirements.yml

---    
- src: https://my.scm.com/my-ansible-roles/role1.git
  scm: git
  version: master
  name: role1

Чтобы быть максимально исчерпывающим, это то, что я сейчас обычно делаю в своих проектах, чтобы обрабатывать зависимости локально, а также локальные / проектные роли.

Базовая структура проекта

ansible-project-dir
└─── roles
|    └─── locally-versioned-role1
|    └─── locally-versioned-role2
|    └─── ...
|    └─── requirements.yml
|    └─── .gitignore
└─── ansible.cfg
└─── playbook1.yml
└─── playbook2.yml

ansible.cfg

Я принудительно выполняю поиск и загрузку ролей в локальном каталоге roles, задав roles_path = roles, чтобы пользователь мог использовать ansible-galaxy install без параметра -p.

roles/requirements.yml

Уже обсуждалось выше. Просто перечислите зависимости для внешнего верхнего уровня (т.е. не версионированные в проекте) как имя роли в галактике или как git uris. Если вам нужно полностью проверить эти роли, чтобы позже сделать их коммиты / push с помощью git, вы можете использовать ansible-galaxy install -g -f -r roles/requirements

roles/.gitignore

# Ignore everything in roles dir
/*
# Except:
# the .gitignore file
!.gitignore
# the requirements file
!requirements.yml
# Readme if you have one
!README.md
# and any specific role we want to version locally
!locally-versioned-role*/


person Zeitounator    schedule 20.04.2019
comment
Если для объявления зависимостей репозитория git (scm: git) используется roles/requirements.yml, как AWX / Tower обрабатывает аутентификацию в репозитории git? Есть ли способ указать это? - person trebor; 14.12.2020
comment
@trebor Я использую довольно старую версию AWX, поэтому они, возможно, исправили эту проблему (сейчас недостаточно времени, чтобы проверить). Но в моей версии (3.0.0.0, пожалуйста, не смейтесь ...) я могу предоставить только один ключ или учетные данные идентификации пользователя / пароля в форме проекта. Таким образом, вы можете получить доступ к частным репозиториям git для своего проекта и своих ролей, но все они должны иметь одни и те же учетные данные (например, ключ развертывания). Это мой случай, и он работает (проектные и частные роли из git scm). - person Zeitounator; 14.12.2020