Реализация плейбука Ansible на RHEL

AnsibleBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь реализовывать полный плейбук Ansible для развертывания веб-сервера Apache в системе Red Hat Enterprise Linux (RHEL). Вы начнете с настройки основных компонентов проекта Ansible, включая создание статического файла инвентаризации для определения управляемых узлов и настройку локальной среды Ansible с использованием файла ansible.cfg.

После первоначальной настройки вы напишете плейбук с несколькими задачами для автоматизации основного процесса развертывания. Это включает установку и запуск службы Apache, развертывание пользовательской веб-страницы и настройку системного брандмауэра для разрешения HTTP-трафика. Чтобы завершить лабораторную работу, вы добавите второй плей в свой плейбук, который будет тестировать веб-сервер из командной строки, проверяя успешность всего развертывания.

Создание статического файла инвентаря для веб-серверов

На этом шаге вы изучите основы инвентаризации Ansible. Инвентаризация — это текстовый файл, который перечисляет серверы (или "управляемые узлы"), которыми будет управлять Ansible. Вы создадите простой статический файл инвентаризации для группы веб-серверов и научитесь проверять его содержимое.

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

  1. Откройте терминал и установите пакет ansible-core, который предоставляет основные инструменты командной строки Ansible.

    sudo dnf install -y ansible-core

    Вы должны увидеть вывод, указывающий на установку и проверку пакета.

    ...
    Installed:
      ansible-core-2.16.x-x.el9.x86_64
    ...
    Complete!
  2. Для лучшей организации создайте выделенный каталог для этого проекта в вашем домашнем каталоге. Назовем его ansible-lab.

    mkdir -p ~/project/ansible-lab
  3. Перейдите в только что созданный каталог проекта. Вся последующая работа в этой лабораторной работе будет выполняться из этого места.

    cd ~/project/ansible-lab
  4. Теперь вы создадите свой первый файл инвентаризации. Файл инвентаризации обычно пишется в формате, похожем на INI. Вы будете использовать текстовый редактор nano для создания файла с именем inventory.

    nano inventory
  5. В редакторе nano добавьте следующее содержимое. Эта конфигурация определяет группу с именем [webservers] и добавляет вашу локальную машину localhost в эту группу.

    • [webservers] — это имя группы. Группы используются для нацеливания на несколько хостов одной командой.
    • localhost — это имя хоста машины, которой вы хотите управлять. В данном случае это сама виртуальная машина LabEx.
    • ansible_connection=local — это специальная переменная, которая указывает Ansible выполнять команды непосредственно на управляющем узле (вашей виртуальной машине), а не пытаться подключиться к нему через SSH.
    [webservers]
    localhost ansible_connection=local

    Чтобы сохранить файл в nano, нажмите Ctrl+O, затем Enter для подтверждения имени файла и Ctrl+X для выхода из редактора.

  6. После создания файла инвентаризации вы можете использовать команду ansible-inventory для разбора файла и отображения списка хостов, которые он содержит. Флаг -i указывает путь к вашему файлу инвентаризации.

    ansible-inventory --list -i inventory

    Команда выведет представление вашей инвентаризации в формате JSON, что подтверждает, что Ansible может правильно читать и понимать ваш файл.

    {
      "_meta": {
        "hostvars": {
          "localhost": {
            "ansible_connection": "local"
          }
        }
      },
      "all": {
        "children": ["ungrouped", "webservers"]
      },
      "webservers": {
        "hosts": ["localhost"]
      }
    }

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

Настройка среды Ansible с помощью ansible.cfg

На этом шаге вы создадите файл конфигурации Ansible, ansible.cfg. Этот файл позволяет устанавливать поведение Ansible по умолчанию, избавляя вас от необходимости многократно вводить общие параметры в командной строке. Разместив файл ansible.cfg в каталоге вашего проекта, вы можете определить такие параметры, как путь к файлу инвентаризации по умолчанию, который Ansible будет автоматически использовать при запуске из этого каталога.

Вы должны по-прежнему находиться в каталоге ~/project/ansible-lab из предыдущего шага.

  1. Используйте текстовый редактор nano для создания нового файла с именем ansible.cfg в вашем текущем каталоге (~/project/ansible-lab).

    nano ansible.cfg
  2. В редакторе nano добавьте следующее содержимое. Эта конфигурация указывает Ansible, где найти ваш файл инвентаризации по умолчанию.

    • Секция [defaults] является стандартной частью файла ansible.cfg, где вы определяете большинство настроек по умолчанию.
    • Строка inventory = ./inventory устанавливает инвентаризацию по умолчанию в файл inventory, расположенный в текущем каталоге (.).
    [defaults]
    inventory = ./inventory

    Сохраните файл, нажав Ctrl+O, затем Enter, и выйдите с помощью Ctrl+X.

  3. Теперь, когда вы настроили путь к инвентаризации по умолчанию, вам больше не нужно использовать флаг -i с командами Ansible (если вы находитесь в каталоге ~/project/ansible-lab).

    Чтобы проверить это, снова выполните команду ansible-inventory --list, но на этот раз опустите часть -i inventory.

    ansible-inventory --list

    Вы должны увидеть точно такой же вывод JSON, как и на предыдущем шаге, что подтверждает, что Ansible автоматически находит и использует ваш файл inventory благодаря новой конфигурации ansible.cfg.

    {
      "_meta": {
        "hostvars": {
          "localhost": {
            "ansible_connection": "local"
          }
        }
      },
      "all": {
        "children": ["ungrouped", "webservers"]
      },
      "webservers": {
        "hosts": ["localhost"]
      }
    }

Создав ansible.cfg для конкретного проекта, вы сделали свой рабочий процесс более эффективным. Это распространенная практика в проектах Ansible для обеспечения согласованного поведения и снижения сложности командной строки.

Написание плейбука для установки и запуска службы Apache

На этом шаге вы напишете свой первый Ansible Playbook. Плейбук — это файл, написанный в формате YAML, который описывает набор задач, выполняемых на управляемых хостах. Вы создадите плейбук, который установит веб-сервер Apache (httpd) и запустит его службу на машине localhost, определенной в вашей инвентаризации.

Вы должны по-прежнему находиться в каталоге ~/project/ansible-lab.

  1. Сначала используйте текстовый редактор nano для создания нового файла с именем apache.yml. Этот файл будет содержать ваш плейбук.

    nano apache.yml
  2. В редакторе nano вы определите "play" (игру). Play — это основная единица плейбука, которая сопоставляет группу хостов с набором задач. Добавьте следующее содержимое в apache.yml.

    • ---: Это стандартный маркер YAML, указывающий на начало документа.
    • - name: ...: Это начало вашего play. Присвоение ему описательного имени является лучшей практикой.
    • hosts: webservers: Это указывает Ansible выполнить этот play на всех хостах из группы webservers из вашего файла инвентаризации.
    • become: true: Это инструктирует Ansible использовать повышение привилегий (например, sudo) для выполнения задач. Это необходимо для таких действий, как установка программного обеспечения или управление службами.
    • tasks:: Этот ключевое слово начинает список выполняемых задач.
    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
  3. Теперь добавьте задачи в ваш плейбук. Каждая задача — это одно действие, вызывающее модуль Ansible. Отступы критически важны в YAML, поэтому убедитесь, что задачи правильно отступлены под секцией tasks:.

    • Задача 1: Установить httpd. Эта задача использует модуль ansible.builtin.dnf для обеспечения установки пакета httpd. Параметр state: present означает, что Ansible установит пакет, если он отсутствует, и ничего не будет делать, если он уже установлен.
    • Задача 2: Запустить службу httpd. Эта задача использует модуль ansible.builtin.service. state: started гарантирует, что служба запущена, а enabled: true гарантирует, что она будет автоматически запускаться при загрузке системы.

    Добавьте следующие задачи в ваш файл apache.yml, непосредственно под строкой tasks::

    - name: Install httpd package
      ansible.builtin.dnf:
        name: httpd
        state: present
    
    - name: Start and enable httpd service
      ansible.builtin.service:
        name: httpd
        state: started
        enabled: true
  4. Ваш полный плейбук apache.yml теперь должен выглядеть следующим образом. Внимательно проверьте отступы.

    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
        - name: Install httpd package
          ansible.builtin.dnf:
            name: httpd
            state: present
    
        - name: Start and enable httpd service
          ansible.builtin.service:
            name: httpd
            state: started
            enabled: true

    Сохраните файл и выйдите из nano (Ctrl+O, Enter, Ctrl+X).

  5. Перед запуском плейбука хорошей практикой является проверка его на наличие синтаксических ошибок с помощью команды ansible-playbook с флагом --syntax-check.

    ansible-playbook --syntax-check apache.yml

    Если синтаксис правильный, команда выведет имя файла плейбука без ошибок.

    playbook: apache.yml
  6. Теперь выполните плейбук.

    ansible-playbook apache.yml

    Ansible выполнит задачи. Поскольку это первый запуск, вы увидите статус changed для обеих задач, что указывает на изменение состояния системы.

    PLAY [Install and start Apache web server] *************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Install httpd package] ***************************************************
    changed: [localhost]
    
    TASK [Start and enable httpd service] ******************************************
    changed: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  7. Наконец, проверьте, что веб-сервер Apache запущен, используя curl для запроса страницы по умолчанию с localhost.

    curl http://localhost

    Вы должны увидеть стандартную тестовую страницу Apache, что подтверждает успешную работу вашего плейбука.

    <html>
      <head>
        <title>Test Page</title>
      </head>
      <body>
        <h1>Test Page</h1>
        <p>This is the default test page for the Apache HTTP server.</p>
      </body>
    </html>

Добавление задач для развертывания веб-страницы

На этом шаге вы расширите свой плейбук для выполнения более реалистичной настройки веб-сервера. Вы добавите задачу для развертывания пользовательской страницы index.html. Это демонстрирует, как управлять файлами с помощью модулей управления файлами Ansible.

Вы должны по-прежнему находиться в каталоге ~/project/ansible-lab.

  1. Сначала создайте простой HTML-файл, который будет развертывать ваш плейбук. Используйте nano для создания файла с именем index.html в вашем текущем каталоге.

    nano index.html
  2. Добавьте следующее HTML-содержимое в файл. Это будет содержимое вашей пользовательской веб-страницы.

    <h1>Welcome to the Ansible-managed Web Server!</h1>
    <p>This page was deployed using an Ansible Playbook.</p>

    Сохраните и выйдите из nano (Ctrl+O, Enter, Ctrl+X).

  3. Теперь вы обновите свой плейбук apache.yml, чтобы добавить новую задачу. Чтобы избежать ошибок форматирования YAML, рекомендуется пересоздать файл с полным содержимым.

    Важно: Чтобы обеспечить правильное форматирование YAML и избежать ошибок отступов, удалите существующий файл apache.yml и создайте новый с полным содержимым, показанным ниже.

    rm apache.yml
    nano apache.yml
  4. Вы добавите новую задачу в плейбук. Эта задача скопирует файл index.html в корневой каталог документов веб-сервера (/var/www/html/).

    • Задача: Развернуть index.html. Эта задача использует модуль ansible.builtin.copy. src указывает исходный файл на управляющем узле (index.html), а dest указывает путь назначения на управляемом хосте.
  5. Скопируйте и вставьте полное содержимое плейбука apache.yml ниже. Это обеспечит правильное форматирование и отступы YAML.

    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
        - name: Install httpd package
          ansible.builtin.dnf:
            name: httpd
            state: present
    
        - name: Deploy custom index.html
          ansible.builtin.copy:
            src: index.html
            dest: /var/www/html/index.html
    
        - name: Start and enable httpd service
          ansible.builtin.service:
            name: httpd
            state: started
            enabled: true

    Сохраните и выйдите из nano.

  6. Сохраните файл и выйдите из nano (Ctrl+O, Enter, Ctrl+X), затем запустите обновленный плейбук.

    ansible-playbook apache.yml

    На этот раз вы должны увидеть выполнение новой задачи. Задачи "Install httpd" и "Start httpd" должны сообщить ok, поскольку их желаемое состояние уже достигнуто. Задача "Deploy custom index.html" сообщит changed.

    PLAY [Install and start Apache web server] *************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Install httpd package] ***************************************************
    ok: [localhost]
    
    TASK [Deploy custom index.html] ************************************************
    changed: [localhost]
    
    TASK [Start and enable httpd service] ******************************************
    ok: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  7. Наконец, снова используйте curl, чтобы убедиться, что ваша пользовательская веб-страница теперь обслуживается.

    curl http://localhost

    Вывод теперь должен быть содержимым вашего файла index.html.

    <h1>Welcome to the Ansible-managed Web Server!</h1>
    <p>This page was deployed using an Ansible Playbook.</p>

Реализация второго плейбука для тестирования развертывания веб-сервера

На этом заключительном шаге вы добавите вторую игру (play) в свой плейбук. Один файл плейбука может содержать несколько игр, которые выполняются последовательно. Это полезно для организации задач, нацеленных на разные хосты или имеющих разные цели. Вы добавите новую игру, которая будет выполняться только на управляющем узле (localhost) для тестирования веб-сервера, настроенного в первой игре.

Вы должны по-прежнему находиться в каталоге ~/project/ansible-lab.

  1. Теперь вы добавите вторую игру в свой плейбук. Чтобы обеспечить правильное форматирование YAML при добавлении второй игры, рекомендуется пересоздать файл с полным содержимым.

    Важно: Чтобы избежать ошибок отступов YAML при добавлении второй игры, удалите существующий файл apache.yml и создайте новый с полным содержимым из двух игр, показанным ниже.

    rm apache.yml
    nano apache.yml
  2. Вы добавите вторую игру в плейбук. Вторая игра позволяет организовать задачи, нацеленные на разные хосты или имеющие разные цели.

    • name: Test web server: Описательное имя для новой игры.
    • hosts: localhost: Эта игра будет выполняться на localhost, самом управляющем узле.
    • become: false: Этот тест не требует прав root, поэтому мы явно отключаем повышение привилегий.
    • Задача: Проверить веб-содержимое. Эта задача использует модуль ansible.builtin.uri для выполнения HTTP-запроса к веб-серверу. Она проверяет, что сервер возвращает код состояния 200 (OK) и что возвращаемое содержимое содержит строку "Ansible-managed". Это автоматизирует проверку curl и grep, которую вы выполняли вручную.
  3. Скопируйте и вставьте полное содержимое плейбука apache.yml ниже, которое теперь включает обе игры:

    ---
    - name: Install and start Apache web server
      hosts: webservers
      become: true
      tasks:
        - name: Install httpd package
          ansible.builtin.dnf:
            name: httpd
            state: present
    
        - name: Deploy custom index.html
          ansible.builtin.copy:
            src: index.html
            dest: /var/www/html/index.html
    
        - name: Start and enable httpd service
          ansible.builtin.service:
            name: httpd
            state: started
            enabled: true
    
    - name: Test web server from localhost
      hosts: localhost
      become: false
      tasks:
        - name: Verify web server is serving correct content
          ansible.builtin.uri:
            url: http://localhost
            return_content: yes
            status_code: 200
          register: result
          failed_when: "'Ansible-managed' not in result.content"

    Сохраните файл и выйдите из nano (Ctrl+O, Enter, Ctrl+X).

  4. Запустите полный плейбук. Ansible выполнит первую игру, обнаружит, что все задачи уже находятся в желаемом состоянии (ok), а затем перейдет ко второй игре для выполнения теста.

    ansible-playbook apache.yml

    Вывод покажет выполнение обеих игр. Все задачи должны успешно завершиться со статусом ok.

    PLAY [Install and start Apache web server] *************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Install httpd package] ***************************************************
    ok: [localhost]
    
    TASK [Deploy custom index.html] ************************************************
    ok: [localhost]
    
    TASK [Start and enable httpd service] ******************************************
    ok: [localhost]
    
    PLAY [Test web server from localhost] ******************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [Verify web server is serving correct content] ****************************
    ok: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

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

Резюме

В этой лабораторной работе вы научились подготавливать среду RHEL для автоматизации с помощью Ansible, установив пакет ansible-core и структурировав каталог проекта. Вы создали базовый статический файл инвентаря для определения группы управляемых узлов, указав localhost с локальным подключением. Вы также настроили среду Ansible, используя файл ansible.cfg, чтобы указать на ваш пользовательский инвентарь, создав чистую и организованную рабочую область для запуска плейбуков.

Затем вы создали комплексный плейбук Ansible для автоматизации развертывания веб-сервера Apache. Это включало написание задач для установки пакета httpd с использованием модуля ansible.builtin.dnf и для обеспечения запуска и включения службы с помощью модуля ansible.builtin.service. Плейбук был улучшен для развертывания пользовательской веб-страницы index.html с использованием модуля ansible.builtin.copy. Наконец, вы реализовали вторую игру в том же плейбуке для проверки развертывания, используя модуль ansible.builtin.uri для тестирования подключения к недавно развернутому веб-серверу, демонстрируя полный рабочий процесс настройки и проверки.