Як автоматично встановити ролі Ansible Galaxy?


129

Всі мої іграшки / ролі Ansible заносяться до мого репоту.

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

Навіть важко заздалегідь дізнатися, які саме ролі в Ansible Galaxy потрібні, поки Ansible скаржиться на відсутність ролі під час виконання.

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


galaxy.ansible.com/docs/using/index.html Ось все, що вам потрібно використовувати ansible-galaxy. Це добре зроблений доктор! Навіть якщо ви початківець :)
Айра

@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 як провізорного програми). Додаткову інформацію див. У відповідних документах Ansible .


Дивіться також відповідь @Kieran Andrews нижче. Це розширює цей.
Марко Феррарі

1
Це насправді не автоматично встановлюється рольова залежність ігрової книги, вона явно встановлює список залежностей, які були вручну перераховані людиною, яка створила книгу.
Ніл

53

Як було запропоновано, ви можете використовувати для цієї потреби відповідальну галактику.

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

Наприклад (Requires.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
Ігонато

Якщо в програмі для використання використовуються галактичні ролі, які ви встановлюєте, вони не запускатимуться при першому виклику, оскільки перевіряється їх наявність перед завантаженням. Якщо вдруге зателефонувати до ігрової книги, ви отримаєте щойно встановлені ролі.
Бен

Я оновив, як я зараз це робив, із скриптом обгортки для зменшення команд.
Kieran Andrews

19

Я часто можу встановити встановлення Java JDK. Використання ролі полегшує цей дотик. Я спробував декілька різних способів (включаючи безліч .gitmodules та submodule ... Доводиться використовувати декілька систем git для роботи, і все це стає некрасивим). Моя найбільша вимога полягає в тому, щоб я не перевіряв рольовий код у своєму проекті ігрової книги, здебільшого, щоб я міг тримати все в одному місці.

Вміст мого файлу 'Requires.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, щоб я не перевіряв ролі помилково. Крім того, оскільки я стираю папку кожного разу, я гарантую, що мені не потрібно примушувати або ігнорувати помилки.


Він не вийде з "роллю не знайдено", перш ніж ви навіть запустите локальну команду.
Даніель Андрій Мінка

1
@ Mincă Daniel Andrei вам потрібен динамічний спосіб, наприклад, включаючи_роле. перевірити це
користувач1686407

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 repo. Коли ви клонуєте репо в майбутньому, переконайтесь, що клонуєте його субмодулями, наприкладgit clone ... --recursive

Перевагою цього є те, що підмодуль git завжди посилається на конкретну версію (git commit-hash). Це не дасть вам неперевірених оновлень у виробничому середовищі. Нова версія ролі Galaxy може мати помилки або працювати зовсім інше, ніж раніше. За допомогою підмодуля git ви вирішите, чи і коли ви оновите роль до нової версії.

Крім того, вам не доведеться додатково піклуватися про чорні списки ролей галактики, .gitignoreщоб запобігти передачі їх коду до вашого сховища.


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 перевіряє, чи є всі ролі, перш ніж запустити програму, де ви посилаєтесь на неї.


яйце і курка :)
bazeusz

2

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


3
Ви можете використовувати для цього файл вимоги.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

0

Якщо needs.yml знаходиться в каталозі ролей вашого проекту, то Tower / AWX встановлює ролі автоматично.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.