Skip to content

Лабораторная работа №10: Структурирование кода (Роли)

Научиться организовывать код Ansible с помощью ролей, чтобы сделать его модульным, переиспользуемым и легко читаемым, следуя лучшим практикам индустрии.

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Проблема больших плейбуков

Section titled “1. Проблема больших плейбуков”

Когда плейбуки разрастаются, они превращаются в длинные “простыни” YAML-кода. Их становится сложно читать, поддерживать и практически невозможно использовать в других проектах. После добавления переменных, шаблонов и обработчиков наши плейбуки уже достаточно сложны, чтобы увидеть эту проблему.

Роли в Ansible — это стандартный способ разбить плейбук на логические компоненты и организовать их в предопределенную структуру директорий. Роль инкапсулирует в себе все необходимое для выполнения определенной “роли” сервера, например, docker, webserver, database.

  • Переиспользуемость: Роль docker можно будет использовать в любом другом проекте, где требуется установка Docker.
  • Читаемость: Основной плейбук становится очень коротким и декларативным — он просто перечисляет, какие роли нужно применить к каким хостам.
  • Стандартная структура: Ansible ожидает, что у роли будет определенная структура папок (tasks, handlers, files, templates, vars).
  • Рекомендуемая литература: Roles (Документация Ansible)

3. Структура директорий роли

Section titled “3. Структура директорий роли”

Ansible автоматически ищет компоненты в соответствующих папках внутри роли.

  • Directoryroles/
    • Directorydocker/
      • Directorytasks/
        • main.yml
      • Directoryhandlers/
        • main.yml
      • Directorytemplates/
      • Directoryfiles/
    • Directoryghost/
      • Directorytasks/
        • main.yml
      • Directoryhandlers/
      • Directorytemplates/
        • docker-compose.j2
      • Directoryfiles/
        • .env

Задания для выполнения

Section titled “Задания для выполнения”
  1. Создание структуры ролей (20 мин):

    • На Main-server в директории ansible-project создайте стандартную структуру для двух ролей: docker и ghost.
      Terminal window
      # Создаем папки для задач, обработчиков, шаблонов и файлов
      mkdir -p roles/{docker,ghost}/{tasks,handlers,templates,files}
  2. Рефакторинг в роль docker (25 мин):

    • Задачи: Скопируйте все содержимое секции tasks из плейбука install_docker.yml (Лаба №7) в файл roles/docker/tasks/main.yml.
    • Обработчики: Скопируйте содержимое секции handlers из install_docker.yml в файл roles/docker/handlers/main.yml. Ansible автоматически свяжет notify из задач с обработчиками в этой же роли.
  3. Рефакторинг в роль ghost (25 мин):

    • Задачи: Скопируйте задачи из плейбука deploy_ghost.yml (Лаба №8) в файл roles/ghost/tasks/main.yml.
    • Файлы: Переместите зашифрованный .env в папку для файлов роли:
      Terminal window
      mv ansible-project/files/.env roles/ghost/files/
    • Шаблоны: Переместите шаблон docker-compose.j2 в папку для шаблонов роли:
      Terminal window
      mv ansible-project/templates/docker-compose.j2 roles/ghost/templates/
    • Важно: В roles/ghost/tasks/main.yml пути в модулях copy и template теперь должны быть простыми именами файлов. Ansible сам найдет их в папках files и templates внутри роли.
      # ... в roles/ghost/tasks/main.yml
      - name: Generate docker-compose.yml from template
      template:
      src: docker-compose.j2 # <-- Путь стал проще
      dest: "{{ project_path }}/docker-compose.yml"
      - name: Copy .env file
      copy:
      src: .env # <-- Путь стал проще
      dest: "{{ project_path }}/.env"
  4. Создание главного плейбука site.yml (20 мин):

    • Удалите старые плейбуки install_docker.yml и deploy_ghost.yml.
    • Создайте новый, главный плейбук site.yml. Он будет очень коротким и декларативным, описывая всю вашу инфраструктуру.
      site.yml
      ---
      - hosts: all
      become: yes
      roles:
      - role: docker # Применяем роль для установки Docker ко всем хостам
      - hosts: web
      become: yes
      vars: # Переменные для роли ghost теперь определяются здесь
      project_path: "/home/{{ ansible_user }}/ghost-project"
      ghost_version: "5.75.2"
      mysql_version: "8.0"
      ghost_port: "8080"
      roles:
      - role: ghost # Применяем роль для развертывания Ghost только к веб-серверу
    • Запустите его и убедитесь, что результат тот же, что и раньше:
      Terminal window
      ansible-playbook -i inventory.ini site.yml --vault-password-file vault_password.txt
  1. Какую основную проблему решают роли в Ansible?
  2. В какой директории внутри роли должны лежать основные задачи (tasks) и обработчики (handlers)?
  3. Если в роли myrole используется модуль template: src=config.j2 ..., в какой папке Ansible будет искать файл config.j2?
  4. Как применить роль к определенной группе хостов в главном плейбуке?