Как автоматически установить роли Ansible Galaxy?
Все мои загружаемые файлы/роли в Ansible отмечены в моем реестре git.
Однако для роли Ansible Galaxy я всегда должен явно загружать их по одному на каждой машине, с которой я хочу запускать Ansible.
Даже сложно заранее знать, какие роли Ansible Galaxy необходимы, пока Ansible не жалуется на недостающую роль во время выполнения.
Как можно управлять зависимостями роли Ansible Galaxy? Я хотел бы либо проверить их в моем реестре git вместе с остальным моим кодом, либо автоматически их идентифицировать и загрузить, когда я запустил Ansible на новом компьютере.
Ответы
Ответ 1
Вы должны использовать файл requirements.yml
для этого прецедента. Опишите роли, которые вам нужны, с помощью любого из способов установки:
# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight
# Install a role from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
# Install a role from a specific git branch
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: origin/master
# Install a role at a specific tag from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: 1.0.0
# Install a role at a specific commit from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: <commit hash>
Затем установите их:
ansible-galaxy install -r requirements.yml
Здесь рабочий пример (установка OpenDaylight с использованием Ansible в качестве устройства для бродяг). Дополнительную информацию см. В соответствующих документах Ansible.
Ответ 2
Как и предполагалось, вы можете использовать ANSIBLE галактику для этой цели.
Анзибль имеет функцию, где вы можете создать requirements.yml
файл, в котором перечислены все ваши роли. Вы можете узнать об этом здесь: http://docs.ansible.com/ansible/latest/galaxy.html#install-multiple-roles-from-a-file
Например (needs.yml):
- src: yatesr.timezone
Затем вы запускаете ansible-galaxy install -r requirements.yml
для этого файла, чтобы загрузить все роли, перечисленные там.
Если вы хотите дополнительно автоматизировать его, вы можете создать простой сценарий оболочки, который будет запускать две команды.
Например (ansible.sh):
./ansible.sh
ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory
Ответ 3
Я часто устанавливаю установку Java JDK. Использование роли облегчает это касание. Я пробовал несколько разных способов (включая множество .gitmodules и подмодулей... Мне нужно использовать несколько систем git для работы, и все это становится некрасиво). Мое самое большое требование состоит в том, что я не проверю код роли в моем проекте плейбуков, в основном, поэтому я могу держать все в одном месте.
Содержимое моего файла requirements.yml:
- src: https://github.com/staylorx/ansible-role-wls-prep.git
version: master
name: staylorx.wls-prep
- src: https://my-work-git-extravaganza.com
version: 2.x
name: coolplace.niftyrole
#From Ansible Galaxy
- src: staylorx.oracle-jdk
Я запускаю отдельную playbook, install-role.yml:
---
- hosts: localhost
tasks:
- file:
path: roles
state: absent
- local_action:
command ansible-galaxy install -r requirements.yml --roles-path roles
- lineinfile:
dest: .gitignore
regexp: '^\/roles$'
line: '/roles'
state: present
Я запускаю эту первую пьесу, затем я запускаю свои роли в любом учебнике. Для меня секрет заключается в том, чтобы игнорировать его git, поэтому я не проверяю роли по ошибке. Кроме того, поскольку я каждый раз уничтожаю папку, я гарантирую, что мне не нужно принудительно или игнорировать ошибки.
Ответ 4
Другим решением является использование подмодулей git. В конце концов, Ansible Galaxy - это только каталог репозиториев github...
Я использую эту команду для автоматического добавления любой роли Galaxy в качестве подмодуля:
ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh
Завершите изменения, затем в репозиторий git. Когда вы клонируете свое репо в будущем, обязательно клонируйте его с субмодулями, например. git clone ... --recursive
Преимущество этого заключается в том, что подмодуль git всегда ссылается на определенную версию (git commit-hash). Это предотвратит запуск непроверенных обновлений в вашей продуктивной среде. Новая версия роли Galaxy может иметь ошибки или работать совершенно иначе, чем раньше. С подмодулем git вы решаете, когда и когда вы обновите роль в новой версии.
Кроме того, вам не придется дополнительно заботиться о черных списках галактик в вашем .gitignore
, чтобы не допустить их код в ваш репозиторий.
Ответ 5
На данный момент, насколько я знаю, нет автоматического способа загрузки ролей во время выполнения.
Лучше всего либо передать их в свое собственное репо, либо иметь надлежащую документацию, в которой перечислены все требования.
Вы даже можете создать предполетную пьесу, которая устанавливает ваши роли.:)
Ответ 6
Вы можете использовать роль Ansible для установки других необходимых ролей с помощью командного модуля.
Вот очень простой пример, который запускает ansible-galaxy install
:
- name: Install roles from Ansible Galaxy
command: ansible-galaxy install {{ item.item }}
with_items:
- "{{ ansible_roles_list }}"
ansible_roles_list
может поставляться как переменная или как параметр роли.
Я реализовал роль для этого, так что вы можете использовать Ansible также для установки (части) управляющей машины: https://galaxy.ansible.com/ferrarimarco/install-roles/.
Эта роль должна быть применена до для любых других ролей, которые вы хотите установить с помощью нее, в отдельную книгу. Это связано с тем, что Ansible проверяет, доступны ли все роли, прежде чем запускать учебник, где вы ссылаетесь на них.