it-swarm.com.ru

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

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

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

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

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

100
pdeva

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

125
dfarrell07

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

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

Если вы хотите дополнительно автоматизировать его, вы можете создать простой сценарий Shell, который будет запускать две команды.

Например (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 
44
Kieran Andrews

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

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

16
staylorx

Другое решение - использовать подмодули 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, чтобы не допустить фиксации их кода в вашем хранилище.

4
udondan

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

3
Mxx

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

3
Marco Ferrari