Как автоматически установить роли 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> 
  1. В вашей учетной записи gitlab создайте группу, в которую вы поместите все свои роли
  2. Заходим в настройки / репозиторий и добавляем токен с правами чтения
  3. Скопируйте 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'
  1. Отредактируйте файл ansible.cfg, если необходимо указать, где будут установлены роли.
      [defaults]
roles_path=./roles
  1. Создайте папку ./roles, если необходимо
  2. Запустить команду 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файл.

Любые идеи будут высоко оценены.

Другие вопросы по тегам