Как автоматически установить роли Ansible Galaxy?
Все мои пьесы / роли Ansible зарегистрированы в моем git-репо.
Однако для ролей Ansible Galaxy мне всегда нужно явно загружать их по одному на каждую машину, с которой я хочу запустить Ansible.
Даже трудно заранее знать, какие именно роли Ansible Galaxy необходимы, пока Ansible не пожалуется на отсутствующую роль во время выполнения.
Как можно управлять ролевыми зависимостями Ansible Galaxy? Я бы хотел, чтобы они были зарегистрированы в моем репозитории git вместе с остальной частью моего ANSI-кода, или чтобы они автоматически идентифицировались и загружались при запуске Ansible на новой машине.
14 ответов
Вы должны использовать 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 для получения дополнительной информации.
Как и предполагалось, вы можете использовать ANSIBLE галактику для этой цели.
Ansible имеет функцию, где вы можете создать requirements.yml
файл, в котором перечислены все ваши роли. Вы можете узнать об этом здесь: http://docs.ansible.com/ansible/latest/galaxy.html
Например (needs.yml):
- src: yatesr.timezone
Вы тогда бежите ansible-galaxy install -r requirements.yml
на этот файл, чтобы загрузить все роли, перечисленные там.
Если вы хотите дополнительно автоматизировать его, вы можете создать простой сценарий оболочки, который будет запускать две команды.
Например (ansible.sh):
./ansibe.sh
ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory
Я часто нахожусь на установке 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 игнорировал их, чтобы я не проверил роли по ошибке. Кроме того, поскольку я стираю папку каждый раз, я гарантирую, что мне не нужно форсировать или игнорировать ошибки.
Вы можете использовать роль 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, на который вы ссылаетесь.
Другое решение - использовать подмодули 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
чтобы предотвратить фиксацию их кода в вашем хранилище.
На данный момент, насколько я знаю, нет автоматического способа загрузки ролей во время выполнения. Лучше всего либо внести их в свой репозиторий, либо иметь надлежащую документацию с перечнем всех требований. Вы могли бы даже создать предполетную пьесу, которая установит ваши роли.:)
Здесь мои требования касаются роли и используются в 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
Проще говоря: вы не можете. В лучшем случае вы можете добавить отдельную роль для установки, но это все равно не удастся, если вы попытаетесь включить роль Galaxy в свой плейбук. Так что просто нет другого способа, кроме как установить его вручную. Да, это смешно, как и многое другое в Ansible.
Основываясь на ответе @staylorx , вы можете создать предварительную задачу следующим образом:
- name: Install requirements
delegate_to: localhost
ansible.builtin.command: ansible-galaxy install -r {{ role_path }}/requirements.yml
это указывает на ваши требования.yml
Например, ваш playbook, вероятно, будет выглядеть так:
---
- name: Deploy
hosts: all
gather_facts: true
# ...
collections:
# All the collections you'll need
pre_tasks:
- name: Install requirements
delegate_to: localhost
ansible.builtin.command: ansible-galaxy install -r {{ role_path }}/requirements.yml
# Other tasks that you run BEFORE the roles
roles:
- { role: "roleX", tags: "roleX" }
# your other roles
post_tasks:
# other tasks that you run AFTER the roles
Ссылки:
Не существует механизма для автоматической загрузки необходимых ролей из плейбука. Как предлагали другие, использование файла - это один из способов и, возможно, лучший способ сделать это.
Однако вы также можете использовать файл роли, чтобы указать ее зависимости. См. страницу документации по ролям . Вы можете использовать этот синтаксис, например, если вы используете частное репо.
dependencies:
- name: java
src: ssh://git@myServer/myWorkspace/myRole.git
scm: git
version: master
Таким образом, вы можете определить файл для загрузкиmyRole
, а затем он загрузит все необходимые ему роли, а они, в свою очередь, смогут загрузить любые роли, которые им нужны, через своиmeta/main.yml
файлы. Это намного больше работы, чем наличиеrequirements.yml
файл ИМО.
Пример Как установить роль Ansible Galaxy в playbook:
- name: Install role from Ansible Galaxy
local_action: command /usr/bin/ansible-galaxy install <GALAXY_PACKAGE_NAME>
- В вашей учетной записи gitlab создайте группу, в которую вы поместите все свои роли
- Заходим в настройки / репозиторий и добавляем токен с правами чтения
- Скопируйте token-name: token и вставьте его в файл requirements.yml.
- src: 'https://<token-name>:<token>@gitlab.com/ansible-cim/roles/instnginx.git'
scm: 'git'
version: 'v0.0.1'
name: 'instnginx'
- Отредактируйте файл ansible.cfg, если необходимо указать, где будут установлены роли.
[defaults]
roles_path=./roles
- Создайте папку ./roles, если необходимо
- Запустить команду ansible-galaxy
mkdir roles
ansible-galaxy install -r requirements.yml
Если файл requirements.yml находится в каталоге ролей вашего проекта, Tower/AWX устанавливает роли автоматически.
Я использую метод Crono в AWX, а также на своем локальном контроллере.
Он работает хорошо, но каким-то образом путается с путем, по которому в конечном итоге загружаются роли.
Мой проект Git называется «роли», и я добавляю его в файл requirements.yml:
- src: "git+https://<token_name>:<token>@gitlab.mydomain.com/mygroup/ansible/roles.git"
Когда я бегу
ansible-galaxy install -r requirements.yml
Я получаю эту структуру папок в моем каталоге ролей после синхронизации:
├── roles
│ └── roles
│ └── My_Role
│ ├── tasks
│ │ └── main.yml
Это вынуждает меня включать мои роли в сборник пьес следующим образом:
hosts: [all]
roles:
- roles/roles/My_Role
Есть ли способ синхронизировать роли из git без корневой папки?? Вы можете сделать это с помощью git через:
git clone "https://<token_name>:<token>@gitlab.mydomain.com/mygroup/ansible/roles.git ."
но точечное соглашение не работает внутриrequirements.yml
файл.
Любые идеи будут высоко оценены.