Syntax highlighting of devops/ansible/roles

# 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
```