Ansible 101: Модуляризация и отладка
1 февраля 2024 г.Обзор
Когда сборники сценариев увеличиваются в размерах, ими становится сложно управлять. Модульность помогает отделить логику от данных, делая плейбуки более чистыми и удобными в обслуживании. При представлении этих абстракций крайне важно интегрировать надежные методы обработки ошибок и отладки для обеспечения надежности.
Роли
Роли в Ansible — это организационные единицы, которые позволяют группировать связанные задачи, переменные, файлы и шаблоны. Они делают ваши сборники пьес модульными. Вот как их создавать и использовать:
- Создание роли. Организуйте свою книгу игр в структуру каталогов с отдельными файлами для задач, обработчиков, значений по умолчанию, переменных, файлов и шаблонов.
- Использование ролей. Добавьте роль в свою книгу с помощью свойства
roles
или модуляinclude_role
для динамического включения.
- hosts: all
roles:
- role: my_custom_role
Обработка ошибок и усиление; Отладка
Обработка ошибок
Ansible предоставляет способы определения пользовательских условий сбоя и управления потоком выполнения плейбука при обнаружении ошибок.
- Блокировка и восстановление. Используйте
block
для группировки задач иrescue
для определения действий по исправлению в случае сбоя какой-либо задачи в блоке. Блокировка и восстановление. >
tasks:
- block:
- name: Attempt to do something
command: /bin/false
rescue:
- name: This will run on failure
command: /bin/true
Отладчик
Отладчик Ansible позволяет в интерактивном режиме устранять неполадки в задачах, которые завершаются сбоем во время выполнения плейбука. Его можно вызвать, добавив отладчик
в вашу книгу воспроизведения. Используйте одно из следующих значений, чтобы контролировать активацию отладчика:
всегда
: всегда активировать отладчикникогда
: никогда не активировать отладчикon_failed
: активировать только при сбое задачи.on_unreachable
: активируется, когда хост недоступен.on_skipped
: активируется, когда задача пропущена.
- name: Install NGINX Web Server
hosts: webservers
tasks:
- name: Install NGINX
ansible.builtin.apt:
name: httpd
state: present
debugger: on_failed
Основные команды при работе с отладчиком включают:
print
: отобразить сведения о задачеtask.args['arg-name'] = 'updated-val'
: обновить значение аргументаповторить
: повторно запустить задачуquit
: выйти из отладчика
Практика
Наша цель — модульизировать процесс установки NGINX и обновления домашней страницы. Мы также хотим обработать ошибку, вызванную неверным именем пакета, и динамически ее исправить.
- Клонировать репозиторий ол>
- Имя файла:
main.yaml
- Расположение:
ansible_learn/roles/nginx/tasks
- Имя файла:
main.yaml
- Расположение:
ansible_learn/roles/nginx/handlers
- Имя файла:
nginx_setup.yaml
- Местоположение:
ansible_learn
git clone https://github.com/perplexedyawdie/ansible-learn.git
2. Разверните среду с помощью docker-compose
docker compose up -d --build
3. SSH на сервер Ansible
ssh -o StrictHostKeyChecking=no -o NoHostAuthenticationForLocalhost=yes root@localhost -p 2200# password: test123
4. Измените каталог на ansible_learn
cd ansible_learn
Роли и усиление; Модульность
5. Создайте каталог ролей с соответствующими папками. Для этой задачи нам потребуются только задачи
, шаблоны
и обработчики
cd ansible_learn
mkdir -p roles/nginx/tasks roles/nginx/templates roles/nginx/handlers
6. Создайте шаблон, который будет генерировать домашнюю страницу.
Имя файла: index.html.j2
Местоположение: ansible_learn/roles/nginx/templates
<html>
<head>
<title>Welcome to {{ ansible_facts['os_family'] }}</title>
</head>
<body>
<h1>Server running on {{ ansible_facts['distribution'] }}</h1>
</body>
</html>
7. Создайте задачи, которые будут устанавливать NGINX, создавать домашнюю страницу и копировать ее на сервер.
- name: Install NGINX for Debian-based systems
ansible.builtin.apt:
name: nginx
state: present
- name: Create Homepage with Jinja2 Template for NGINX
ansible.builtin.template:
src: index.html.j2
dest: /var/www/html/index.html
mode: '644'
notify: restart nginx
8. Создайте обработчик, который перезапустит NGINX при обновлении.
- name: Restart NGINX
listen: "restart nginx"
ansible.builtin.service:
name: nginx
state: restarted
9. Создайте сборник сценариев.
- name: Install NGINX
hosts: all
roles:
- role: nginx
10. Запускаем линтер
ansible-lint nginx_setup.yaml
11. Выполните сценарий.
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml nginx_setup.yaml
12. Подтвердите развертывание, посетив http://localhost:2203 в своем браузере.
Обработка ошибок
Цель состоит в том, чтобы использовать block
и rescue
для печати специального сообщения в случае ошибки.
13. Создайте новый сборник сценариев, который должен установить Apache, но использовать неправильное имя пакета, затем добавьте блок & свойства восстановления. Имя файла: error_test.yaml
Местоположение: ansible_learn
- name: Install Apache on Ubuntu
hosts: all
tasks:
- name: Install Apache for Debian-based systems
block:
- name: Installer
ansible.builtin.apt:
name: httpd
state: present
rescue:
- name: Installer errors
ansible.builtin.debug:
msg: "Error installing Apache on {{ ansible_facts['distribution'] }}"
14. Запускаем линтер
ansible-lint error_test.yaml
15. Выполните сценарий
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml error_test.yaml
Отладка
Цель – использовать отладчик
и динамически исправить ошибку в задаче.
16. Обновите плейбук error_test.yaml
и добавьте свойство debugger
- name: Install Apache on Ubuntu
hosts: all
debugger: on_failed
tasks:
- name: Install Apache for Debian-based systems
block:
- name: Installer
ansible.builtin.apt:
name: httpd
state: present
rescue:
- name: Installer errors
ansible.builtin.debug:
msg: "Error installing Apache on {{ ansible_facts['distribution'] }}"
17. Запускаем линтер
ansible-lint error_test.yaml
18. Выполните сценарий
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml error_test.yaml
19. В интерактивном отладчике выполните следующие команды, чтобы обновить имя пакета
# display all args in the failed task, we are interested in the name, since that contains the name of the package
p task.args
# update the package name. When installing Apache on Ubuntu, we use apache2
task.args['name'] = 'apache2'
# rerun the task
redo
# exit the debugger
quit
20. Подтвердите успешную установку Apache
ssh -i /root/.ssh/id_rsa_ansible root@server1 apache2 -V
Резюме
Отличная попытка! Мы узнали, как создавать сборники сценариев, которые легче расширять и поддерживать, а также как обрабатывать ошибки и выполнять задачи отладки для обеспечения надежности. В последнем уроке мы рассмотрим, как безопасно хранить конфиденциальные данные с помощью Ansible Vault. А пока, береги себя! 👋
Также опубликовано здесь.
Оригинал