# Ansible Roles
[TOC]
## Полезные роли
https://galaxy.ansible.com/
Service | Role names | Links
---|---|---
docker | geerlingguy.docker | [Galaxy](https://galaxy.ansible.com/geerlingguy/docker)
nginx | geerlingguy.nginx | [Galaxy](https://galaxy.ansible.com/geerlingguy/nginx)
nginx basic auth | geerlingguy.htpasswd | [Galaxy](https://galaxy.ansible.com/geerlingguy/htpasswd)
ssh | willshersystems.sshd | [Galaxy](https://galaxy.ansible.com/willshersystems/sshd)
systemd | cimon-io.systemd-service | [Galaxy](https://galaxy.ansible.com/cimon-io/systemd-service)
```bash
ansible-galaxy install -p ./roles geerlingguy.docker
# --- or
git submodule add git@github.com:geerlingguy/ansible-role-docker.git roles/geerlingguy.docker
```
## Общие сведения
*Роли* в Ansible - это основной механизм деления сценария на отдельные файлы. Они упрощают написание сценариев и их повторное использование.
Например, файлы, связанные с ролью `database`, хранятся в каталоге *roles/database* со следующей структурой
Каталог/файл | Описание
---|---
*roles/database/defaults/main.yml* | Переменные, которые могут переопределяться
*roles/database/files/* | Файлы, выгружаемые на хосты
*roles/database/handlers/main.yml* | Обработчики
*roles/database/meta/main.yml* | Информация о зависимостях данной роли
*roles/database/tasks/main.yml* | Список задач без высокоуровневой операции
*roles/database/templates/* | Файлы шаблонов Jinja2
*roles/database/vars/main.yml* | Переменные, которые не должны переопределяться
По-умолчанию роли располагаются в каталоге */etc/ansible/roles* или *./roles* проекта. Изменение каталога ролей осуществляется через *ansible.cfg*
```ini
[defaults]
roles_path = ~/ansible_roles
```
Подключение ролей к сценариям
```yml
- name: deploy something on somewhere
hosts: web
vars_files:
- secrets.yml
roles:
- role: database
database_name: "{{ dbname }}"
database_user: "{{ dbuser }}"
- role: mezzanine
live_hostname: 192.168.0.1
```
Если никакие переменные не переопределяются, то `roles` можно записать компактнее
```yml
...
roles:
- database
- mezzanine
```
Определение зависимостей между ролями
```yml
# roles/web/meta/main.yml
dependencies:
- { roles: ntp, ntp_server=ntp.ubuntu.com }
# roles/django/meta/main.yml
dependencies:
- { roles: web }
- { role: memcached }
```
Работа с Galaxy
```bash
# список ролей
ansible-galaxy list
# Установка роли
ansible-galaxy install -p ./roles bennojoy.ntp
# Удаление роли
ansible-galaxy remove bennojoy.ntp
```