===== Создание роли ===== Чтобы 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