===== Создание роли =====
Чтобы Ansible смог найти и использовать роли, нужна специально разработанная структура каталогов. Создадим каталог с именем roles:
📁 ansible-demo
+---📁 inventory
| +---cluster
+---📁 roles
| +---📁 deploy
| +---📁 tasks
| +--- main.yaml
| +---📁 preconfig
| +---📁 meta
| +--- main.yaml
| +---📁 tasks
| +--- main.yaml
\---all.yaml
В этом **roles** определим роли, которые можно использовать повторно в нескольких плейбуках и на разных серверах. Каждая роль, которую мы создадим, требует собственного каталога.
В зависимости от сложности выполняемых задач роли может использовать один или несколько каталогов. Что представляют собой каталоги:
* 📁 **defaults**: позволяет устанавливать переменные по умолчанию для включенных или зависимых ролей.
* 📁 **files**: содержит статические файлы и файлы сценариев, которые могут быть скопированы на удалённый сервер или выполнены на нём.
* 📁 **handlers**: все обработчики, которые ранее были в вашем плейбуке, теперь могут быть добавлены в каталог.
* 📁 **meta**: для метаданных роли, которые используются для управления зависимостями. Например, вы можете определить список ролей, которые должны быть применены до вызова текущей роли.
* 📁 **templates**: для шаблонов, которые генерируют файлы на удалённых хостах.
* 📁 **tasks**: содержит один или несколько файлов с задачами, которые определяются в разделе tasks обычного плейбука Ansible. Эти задачи могут напрямую ссылаться на файлы и шаблоны, содержащиеся в соответствующих каталогах внутри роли, без необходимости указывать полный путь к файлу.
* 📁 **vars**: переменные для роли могут быть указаны в файлах внутри каталога, а затем ссылаться на них в другом месте роли.
==== Превращаем плейбук в роль ====
Переносим все задачи из palybook **all.yaml** в роль **roles->preconfig->tasks->main.yaml**.
roles->preconfig->tasks->main.yaml:
---
- name: All configs
hosts: cluster
roles:
- preconfig
- deploy
main.yaml:
---
- name: Установка Docker
block:
- name: Create user # Первая задача
vars: # lsb_release -a - узнать версию ubuntu
user: werwolf
user:
name: "{{ user }}"
state: present
- name: Добавим universe
apt_repository: # lsb_release -a - узнать версию ubuntu
repo: "deb http://archive.ubuntu.com/ubuntu {{ ansible_distribution_release }} universe"
state: present
- name: Установка дополнительных пакетов
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
update-cache: yes
cache_valid_time: 86400
state: present
- name: добавление ключа Docker
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Установка стабильного репозитория
apt_repository:
repo: >
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg]
https://download.docker.com/linux/ubuntu
{{ ansible_distribution_release }} stable
state: present
update-cache: yes
filename: docker
- name: Установка Docker-ce
apt:
name: docker-ce
update-cache: yes
cache_valid_time: 86400
- name: Проверка что docker установлен и перезагружен
service:
name: docker
state: restarted
enabled: yes
become: true # общий для всего блока вызов sudo
- name: Установка Docker-compose
block:
- name: получение последней версии docker-compose
uri:
url: https://api.github.com/repos/docker/compose/releases/latest
body_format: json
register: release
- name: Установка docker-compose
get_url:
url: "https://github.com/docker/compose/releases/download/{{ release.json.tag_name }}/docker-compose-linux-x86_64"
dest: /usr/local/bin/docker-compose
mode: 0755
become: yes
- name: завершени установки
block:
- name: Добавление пользователя в группу Docker
user:
name: werwolf
groups: docker
append: yes
- name: Перезагрузка сервера
reboot:
msg: "Rebooting machine in 5 seconds"
become: yes
Теперь файл tasks проще понимать, потому что он содержит только фактические шаги, которые будут выполняться при использовании роли **preconfig**.
Для роли **deploy** создадим свою задачу
roles->deploy->tasks->main.yaml:
---
- name: Demo
command: echo "Demo"
==== meta данные ====
Для того чтобы указать порядок запуска ролей и метаданные в ролях можно использовать каталог meta.
Добавим в нем описание плейбука и зависимости(**dependencies**) роли **preconfig** от **deploy**
argument_specs:
main:
short_description: Настройка серверов для работы с докером
description: Настройка серверов для работы с докером
licension: CUSTOM
min_ansible_version: 2.9
author: Sergey Anchikin
platforms: Ubuntu
dependencies:
- role: deploy