Как автоматически установить роли Ansible Galaxy?

129

Все мои пьесы / роли Ansible зарегистрированы в моем репозитории git.

Однако для ролей Ansible Galaxy мне всегда приходится явно загружать их по одному на каждую машину, с которой я хочу запускать Ansible.

Трудно даже заранее знать, какие роли Ansible Galaxy необходимы, пока Ansible не пожалуется на недостающую роль во время выполнения.

Как можно управлять зависимостями ролей Ansible Galaxy? Я хотел бы, чтобы они были зарегистрированы в моем репозитории git вместе с остальной частью моего доступного кода, или чтобы они автоматически определялись и загружались при запуске Ansible на новой машине.

pdeva
источник
galaxy.ansible.com/docs/using/index.html Вот все, что вам нужно для использования ansible-galaxy. Это хорошо сделанный документ! Даже если вы новичок :)
Ayra
@pdeva Не могли бы вы принять один из правильных ответов ниже?
Г.Г.

Ответы:

149

Для этого варианта использования вам следует использовать 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 в качестве инициатора Vagrant). Дополнительную информацию см. В соответствующих документах по Ansible .

dfarrell07
источник
См. Также ответ @Kieran Andrews ниже. Это расширяет этот.
Марко Феррари
1
На самом деле это не автоматическая установка ролевых зависимостей playbook, это явная установка списка зависимостей, которые были вручную перечислены человеком, создавшим playbook.
Нил
53

Как было предложено, для этой цели вы можете использовать доступную галактику.

В Ansible есть функция, в которой вы можете создать requirements.ymlфайл, в котором перечислены все ваши роли. Вы можете узнать об этом здесь: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

Например (requirements.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 
Киран Эндрюс
источник
1
Только что протестировано, отображается сообщение о том, что роли уже загружены, ошибок нет. Версия2.2.1
Igonato
Если playbook использует роли галактики, которые вы устанавливаете, то они не будут запускаться при первом вызове playbook, поскольку их присутствие проверяется до их загрузки. При повторном вызове playbook будут выбраны вновь установленные роли.
Бен
Я обновился до того, как я сейчас это делаю, с помощью сценария-оболочки для сокращения команд.
Киран Эндрюс
19

Я часто устанавливаю Java JDK. Использование роли упрощает это прикосновение. Я пробовал несколько разных способов (включая множество .gitmodules и подмодулей ... Мне приходится использовать несколько систем git для работы, и все это становится уродливым). Мое главное требование - не проверять код роли в моем проекте playbook, в основном для того, чтобы я мог хранить все в одном месте.

Содержимое моего файла 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

Я запускаю отдельную книгу install-roles.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 игнорирует его, чтобы я не проверял роли по ошибке. Кроме того, поскольку я каждый раз удаляю папку, я гарантирую, что мне не нужно форсировать или игнорировать ошибки.

staylorx
источник
Он потерпит неудачу с «ролью не найдена» еще до того, как вы запустите локальную команду.
Даниэль Андрей Минкэ
1
@ Mincă Daniel Andrei, вам нужно использовать динамический способ, например include_role. проверьте это
user1686407 01
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чтобы предотвратить передачу их кода в ваш репозиторий.

udondan
источник
5
На мой взгляд, это плохая практика. Обычно проще использовать инструменты управления зависимостями, чем склеивать репозитории SCM вместе, особенно когда мы говорим о подмодулях git для SCM.
Дэвид Резник
1
Согласовано. Фактически я этим больше не пользуюсь. Тем не менее, это верный подход, поскольку ансибл-галактика далека от совершенства. Galaxy не будет проверять наличие обновлений, даже если версия указана в вашем файле требований, если вы заставите его повторно загрузить все роли с недокументированным --forceфлагом, он не покажет вам, изменилось ли или что на самом деле. Это черный ящик, которым вы можете управлять, только если сохраните загруженные роли галактик в SCM. Хотя по другим причинам это все равно хорошая идея. Вытаскивая подмодули, вы хотя бы видите, какие роли изменились.
udondan
Кстати, все проблемы с подмодулями, AFAIK незначительны в этой ситуации, потому что они связаны с изменением их содержимого. По моему опыту,
тяга
4

Вы можете использовать роль 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 проверяет, доступны ли все роли, прежде чем запускать playbook, в котором вы на них ссылаетесь.

Марко Феррари
источник
яйцо и курица :)
bazeusz
2

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

Mxx
источник
3
Для этого можно использовать файл requirements.txt. См .: docs.ansible.com/…
toast38coza
0

Здесь мои требования касаются роли и используются в install.yml

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml
TJVerne
источник
0

Если файл requirements.yml находится в каталоге ролей вашего проекта, Tower / AWX устанавливает роли автоматически.

bbaassssiiee
источник