Лабораторная работа №10: Структурирование кода (Роли)
Цель работы
Section titled “Цель работы”Научиться организовывать код Ansible с помощью ролей, чтобы сделать его модульным, переиспользуемым и легко читаемым, следуя лучшим практикам индустрии.
Основные теоретические положения
Section titled “Основные теоретические положения”1. Проблема больших плейбуков
Section titled “1. Проблема больших плейбуков”Когда плейбуки разрастаются, они превращаются в длинные “простыни” YAML-кода. Их становится сложно читать, поддерживать и практически невозможно использовать в других проектах. После добавления переменных, шаблонов и обработчиков наши плейбуки уже достаточно сложны, чтобы увидеть эту проблему.
2. Роли (Roles)
Section titled “2. Роли (Roles)”Роли в 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 “Задания для выполнения”-
Создание структуры ролей (20 мин):
- На
Main-serverв директорииansible-projectсоздайте стандартную структуру для двух ролей:dockerиghost.Terminal window # Создаем папки для задач, обработчиков, шаблонов и файловmkdir -p roles/{docker,ghost}/{tasks,handlers,templates,files}
- На
-
Рефакторинг в роль
docker(25 мин):- Задачи: Скопируйте все содержимое секции
tasksиз плейбукаinstall_docker.yml(Лаба №7) в файлroles/docker/tasks/main.yml. - Обработчики: Скопируйте содержимое секции
handlersизinstall_docker.ymlв файлroles/docker/handlers/main.yml. Ansible автоматически свяжетnotifyиз задач с обработчиками в этой же роли.
- Задачи: Скопируйте все содержимое секции
-
Рефакторинг в роль
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 templatetemplate:src: docker-compose.j2 # <-- Путь стал прощеdest: "{{ project_path }}/docker-compose.yml"- name: Copy .env filecopy:src: .env # <-- Путь стал прощеdest: "{{ project_path }}/.env"
- Задачи: Скопируйте задачи из плейбука
-
Создание главного плейбука
site.yml(20 мин):- Удалите старые плейбуки
install_docker.ymlиdeploy_ghost.yml. - Создайте новый, главный плейбук
site.yml. Он будет очень коротким и декларативным, описывая всю вашу инфраструктуру.site.yml ---- hosts: allbecome: yesroles:- role: docker # Применяем роль для установки Docker ко всем хостам- hosts: webbecome: yesvars: # Переменные для роли 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
- Удалите старые плейбуки
Контрольные вопросы
Section titled “Контрольные вопросы”- Какую основную проблему решают роли в Ansible?
- В какой директории внутри роли должны лежать основные задачи (
tasks) и обработчики (handlers)? - Если в роли
myroleиспользуется модульtemplate: src=config.j2 ..., в какой папке Ansible будет искать файлconfig.j2? - Как применить роль к определенной группе хостов в главном плейбуке?