Ansible 101: Модуляризация и отладка

Ansible 101: Модуляризация и отладка

1 февраля 2024 г.

Обзор

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

Роли

Diagram showing roles directory structure

Роли в 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 и обновления домашней страницы. Мы также хотим обработать ошибку, вызванную неверным именем пакета, и динамически ее исправить.

  1. Клонировать репозиторий
  2. 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, создавать домашнюю страницу и копировать ее на сервер.

    • Имя файла: main.yaml
    • Расположение: ansible_learn/roles/nginx/tasks
    - 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 при обновлении.

    • Имя файла: main.yaml
    • Расположение: ansible_learn/roles/nginx/handlers
    - name: Restart NGINX
      listen: "restart nginx"
      ansible.builtin.service:
       name: nginx
       state: restarted
    

    9. Создайте сборник сценариев.

    • Имя файла: nginx_setup.yaml
    • Местоположение: ansible_learn
    - 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. А пока, береги себя! 👋


    Также опубликовано здесь.


    Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE