Введение
В этой лабораторной работе вы научитесь реализовывать полный плейбук Ansible для развертывания веб-сервера Apache в системе Red Hat Enterprise Linux (RHEL). Вы начнете с настройки основных компонентов проекта Ansible, включая создание статического файла инвентаризации для определения управляемых узлов и настройку локальной среды Ansible с использованием файла ansible.cfg.
После первоначальной настройки вы напишете плейбук с несколькими задачами для автоматизации основного процесса развертывания. Это включает установку и запуск службы Apache, развертывание пользовательской веб-страницы и настройку системного брандмауэра для разрешения HTTP-трафика. Чтобы завершить лабораторную работу, вы добавите второй плей в свой плейбук, который будет тестировать веб-сервер из командной строки, проверяя успешность всего развертывания.
Создание статического файла инвентаря для веб-серверов
На этом шаге вы изучите основы инвентаризации Ansible. Инвентаризация — это текстовый файл, который перечисляет серверы (или "управляемые узлы"), которыми будет управлять Ansible. Вы создадите простой статический файл инвентаризации для группы веб-серверов и научитесь проверять его содержимое.
Сначала вам нужно убедиться, что Ansible установлен в вашей системе. Поскольку он не установлен по умолчанию, вы будете использовать менеджер пакетов dnf для его установки.
Откройте терминал и установите пакет
ansible-core, который предоставляет основные инструменты командной строки Ansible.sudo dnf install -y ansible-coreВы должны увидеть вывод, указывающий на установку и проверку пакета.
... Installed: ansible-core-2.16.x-x.el9.x86_64 ... Complete!Для лучшей организации создайте выделенный каталог для этого проекта в вашем домашнем каталоге. Назовем его
ansible-lab.mkdir -p ~/project/ansible-labПерейдите в только что созданный каталог проекта. Вся последующая работа в этой лабораторной работе будет выполняться из этого места.
cd ~/project/ansible-labТеперь вы создадите свой первый файл инвентаризации. Файл инвентаризации обычно пишется в формате, похожем на INI. Вы будете использовать текстовый редактор
nanoдля создания файла с именемinventory.## install nano sudo dnf install -y nanonano inventoryВ редакторе
nanoдобавьте следующее содержимое. Эта конфигурация определяет группу с именем[webservers]и добавляет вашу локальную машинуlocalhostв эту группу.[webservers]— это имя группы. Группы используются для нацеливания на несколько хостов одной командой.localhost— это имя хоста машины, которой вы хотите управлять. В данном случае это сама виртуальная машина LabEx.ansible_connection=local— это специальная переменная, которая указывает Ansible выполнять команды непосредственно на управляющем узле (вашей виртуальной машине), а не пытаться подключиться к нему через SSH.
[webservers] localhost ansible_connection=localЧтобы сохранить файл в
nano, нажмитеCtrl+O, затемEnterдля подтверждения имени файла иCtrl+Xдля выхода из редактора.После создания файла инвентаризации вы можете использовать команду
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 из предыдущего шага.
Используйте текстовый редактор
nanoдля создания нового файла с именемansible.cfgв вашем текущем каталоге (~/project/ansible-lab).nano ansible.cfgВ редакторе
nanoдобавьте следующее содержимое. Эта конфигурация указывает Ansible, где найти ваш файл инвентаризации по умолчанию.- Секция
[defaults]является стандартной частью файлаansible.cfg, где вы определяете большинство настроек по умолчанию. - Строка
inventory = ./inventoryустанавливает инвентаризацию по умолчанию в файлinventory, расположенный в текущем каталоге (.).
[defaults] inventory = ./inventoryСохраните файл, нажав
Ctrl+O, затемEnter, и выйдите с помощьюCtrl+X.- Секция
Теперь, когда вы настроили путь к инвентаризации по умолчанию, вам больше не нужно использовать флаг
-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.
Сначала используйте текстовый редактор
nanoдля создания нового файла с именемapache.yml. Этот файл будет содержать ваш плейбук.nano apache.ymlВ редакторе
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:Теперь добавьте задачи в ваш плейбук. Каждая задача — это одно действие, вызывающее модуль 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- Задача 1: Установить httpd. Эта задача использует модуль
Ваш полный плейбук
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).Перед запуском плейбука хорошей практикой является проверка его на наличие синтаксических ошибок с помощью команды
ansible-playbookс флагом--syntax-check.ansible-playbook --syntax-check apache.ymlЕсли синтаксис правильный, команда выведет имя файла плейбука без ошибок.
playbook: apache.ymlТеперь выполните плейбук.
ansible-playbook apache.ymlAnsible выполнит задачи. Поскольку это первый запуск, вы увидите статус
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Наконец, проверьте, что веб-сервер 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.
Сначала создайте простой HTML-файл, который будет развертывать ваш плейбук. Используйте
nanoдля создания файла с именемindex.htmlв вашем текущем каталоге.nano index.htmlДобавьте следующее 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).Теперь вы обновите свой плейбук
apache.yml, чтобы добавить новую задачу. Чтобы избежать ошибок форматирования YAML, рекомендуется пересоздать файл с полным содержимым.Важно: Чтобы обеспечить правильное форматирование YAML и избежать ошибок отступов, удалите существующий файл
apache.ymlи создайте новый с полным содержимым, показанным ниже.rm apache.yml nano apache.ymlВы добавите новую задачу в плейбук. Эта задача скопирует файл
index.htmlв корневой каталог документов веб-сервера (/var/www/html/).- Задача: Развернуть index.html. Эта задача использует модуль
ansible.builtin.copy.srcуказывает исходный файл на управляющем узле (index.html), аdestуказывает путь назначения на управляемом хосте.
- Задача: Развернуть index.html. Эта задача использует модуль
Скопируйте и вставьте полное содержимое плейбука
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.Сохраните файл и выйдите из
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Наконец, снова используйте
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.
Теперь вы добавите вторую игру в свой плейбук. Чтобы обеспечить правильное форматирование YAML при добавлении второй игры, рекомендуется пересоздать файл с полным содержимым.
Важно: Чтобы избежать ошибок отступов YAML при добавлении второй игры, удалите существующий файл
apache.ymlи создайте новый с полным содержимым из двух игр, показанным ниже.rm apache.yml nano apache.ymlВы добавите вторую игру в плейбук. Вторая игра позволяет организовать задачи, нацеленные на разные хосты или имеющие разные цели.
name: Test web server: Описательное имя для новой игры.hosts: localhost: Эта игра будет выполняться наlocalhost, самом управляющем узле.become: false: Этот тест не требует прав root, поэтому мы явно отключаем повышение привилегий.- Задача: Проверить веб-содержимое. Эта задача использует модуль
ansible.builtin.uriдля выполнения HTTP-запроса к веб-серверу. Она проверяет, что сервер возвращает код состояния 200 (OK) и что возвращаемое содержимое содержит строку "Ansible-managed". Это автоматизирует проверкуcurlиgrep, которую вы выполняли вручную.
Скопируйте и вставьте полное содержимое плейбука
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).Запустите полный плейбук. 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 для тестирования подключения к недавно развернутому веб-серверу, демонстрируя полный рабочий процесс настройки и проверки.


