Роли и коллекции Ansible на RHEL

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

Введение

В этой лабораторной работе вы научитесь автоматизировать настройку веб-сервера Red Hat Enterprise Linux (RHEL), используя мощь и повторное использование Ansible Roles и Collections. Вы создадите комплексный рабочий процесс автоматизации, создав пользовательскую роль для развертывания специфических конфигураций, интегрировав внешнюю роль из Git-репозитория в качестве зависимости и используя готовую RHEL System Role из Ansible Collection для управления системными службами, такими как SELinux.

Процесс начинается с создания стандартизированной структуры роли с помощью ansible-galaxy init. Затем вы определите и установите зависимость роли из Git-репозитория, используя файл requirements.yml. После интеграции RHEL System Role вы объедините все три типа ролей — пользовательскую, основанную на Git и основанную на Collection — в единый мастер-плейбук. Наконец, вы выполните плейбук и проверите, что веб-сервер Apache и настройки SELinux были корректно применены к целевому RHEL-серверу, демонстрируя полное, модульное решение для автоматизации.

Создание пользовательской роли Ansible с помощью ansible-galaxy init

На этом шаге вы начнете с создания стандартизированной структуры каталогов для новой роли Ansible с помощью команды ansible-galaxy init. Роли Ansible являются фундаментальной концепцией для создания повторно используемого и организованного контента автоматизации. Они позволяют упаковывать задачи, обработчики, переменные и другие компоненты в автономный, переносимый блок. Использование стандартной структуры является лучшей практикой, которая делает вашу автоматизацию более понятной, управляемой и удобной для обмена.

Сначала убедитесь, что вы находитесь в правильном рабочем каталоге. Вся работа для этой лабораторной работы будет проводиться в каталоге ~/project.

cd ~/project

Перед созданием роли вам необходимо убедиться, что установлены инструменты командной строки Ansible. Пакет ansible-core предоставляет основные инструменты, включая ansible-galaxy.

Установите ansible-core с помощью менеджера пакетов dnf. Флаг -y автоматически отвечает "yes" на любые запросы подтверждения.

sudo dnf install -y ansible-core

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

...
Installed:
  ansible-core-2.16.x-1.el9.x86_64
  ...
Complete!

Распространенной практикой является организация всех ролей проекта в выделенном каталоге roles. Создайте этот каталог сейчас.

mkdir roles

Теперь перейдите в только что созданный каталог roles. Здесь вы инициализируете свою новую пользовательскую роль.

cd roles

Теперь вы будете использовать команду ansible-galaxy init для создания скелета роли с именем apache.developer_configs. Эта команда автоматически генерирует набор стандартных каталогов и файлов, предоставляя чистую отправную точку для разработки вашей роли.

ansible-galaxy init apache.developer_configs

После выполнения команды вы увидите подтверждающее сообщение.

- Role apache.developer_configs was created successfully

Чтобы увидеть только что созданную структуру, вы можете использовать команду ls -R, которая рекурсивно выводит содержимое каталога и всех его подкаталогов.

ls -R apache.developer_configs

Вывод показывает стандартную структуру каталогов для роли Ansible:

apache.developer_configs:
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars

apache.developer_configs/defaults:
main.yml

apache.developer_configs/files:

apache.developer_configs/handlers:
main.yml

apache.developer_configs/meta:
main.yml

apache.developer_configs/tasks:
main.yml

apache.developer_configs/templates:

apache.developer_configs/tests:
inventory  test.yml

apache.developer_configs/vars:
main.yml

Вот краткий обзор наиболее важных каталогов:

  • tasks: Содержит основной список задач, которые будут выполнены ролью.
  • handlers: Содержит обработчики, которые являются задачами, выполняющимися только при уведомлении другой задачей.
  • vars: Содержит переменные для роли.
  • templates: Содержит шаблоны файлов, использующие движок шаблонизации Jinja2.
  • meta: Содержит метаданные для роли, включая зависимости от других ролей.

Теперь вы успешно создали базовую структуру для вашей пользовательской роли Ansible. На следующих шагах вы заполните эти каталоги контентом для настройки веб-сервера.

Установка зависимости роли из Git-репозитория с помощью requirements.yml

На этом шаге вы научитесь управлять зависимостями ролей из внешних источников, таких как Git-репозиторий. Это распространенная практика в более крупных проектах Ansible, где вы повторно используете роли, разработанные сообществом или другими командами. Ansible использует файл, обычно называемый requirements.yml, для определения списка устанавливаемых ролей.

Ваша пользовательская роль, apache.developer_configs, будет зависеть от базовой роли Apache, чтобы обеспечить установку и запуск веб-сервера. Вы определите эту зависимость и установите ее.

Сначала убедитесь, что вы находитесь в основном каталоге проекта. Если вы все еще находитесь в подкаталоге roles из предыдущего шага, вернитесь в ~/project.

cd ~/project

Теперь вы создадите файл requirements.yml внутри вашего каталога roles. Этот файл будет содержать список всех внешних ролей, необходимых вашему проекту. Используйте редактор nano для создания и редактирования файла.

nano roles/requirements.yml

Добавьте следующее содержимое в файл. Эта запись указывает ansible-galaxy загрузить определенную версию роли Apache из общедоступного Git-репозитория и локально назвать ее infra.apache.

- name: infra.apache
  src: https://github.com/geerlingguy/ansible-role-apache.git
  scm: git
  version: 3.2.0

Разберем это определение:

  • name: Это локальное имя роли. Несмотря на то, что исходный репозиторий имеет другое имя, он будет установлен в каталог с именем infra.apache.
  • src: URL источника Git-репозитория.
  • scm: Указывает инструмент управления исходным кодом, в данном случае git.
  • version: Конкретная ветка Git, тег или хэш коммита для использования. Фиксация версии имеет решающее значение для обеспечения стабильности и предсказуемости вашей автоматизации.

Сохраните файл и выйдите из nano, нажав Ctrl+X, затем Y и Enter.

После размещения файла requirements.yml вы можете использовать команду ansible-galaxy install для загрузки и установки роли.

  • Флаг -r указывает на ваш файл требований.
  • Флаг -p указывает путь, по которому должны быть установлены роли.
ansible-galaxy install -r roles/requirements.yml -p roles

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

Starting galaxy role install process
- downloading role 'ansible-role-apache', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-apache/archive/3.2.0.tar.gz
- extracting infra.apache to /home/labex/project/roles/infra.apache
- infra.apache (3.2.0) was installed successfully

Чтобы убедиться, что роль была установлена правильно, выведите содержимое каталога roles.

ls -l roles

Теперь вы должны увидеть каталог infra.apache рядом с ролью apache.developer_configs, которую вы создали ранее.

total 12
drwxr-xr-x. 9 labex labex 4096 Nov 10 10:10 apache.developer_configs
drwxr-xr-x. 9 labex labex 4096 Nov 10 10:15 infra.apache
-rw-r--r--. 1 labex labex  118 Nov 10 10:12 requirements.yml

Теперь вы успешно объявили внешний Git-репозиторий в качестве зависимости и установили его в свой проект. Следующим шагом будет интеграция этой зависимости в метаданные вашей пользовательской роли.

Интеграция системной роли RHEL из коллекции Ansible

На этом шаге вы будете работать с коллекциями Ansible (Ansible Collections), которые являются стандартным способом распространения контента Ansible, включая роли, модули и плагины. Вы установите коллекцию Community General, которая предоставляет набор полезных модулей для автоматизации распространенных административных задач, включая управление SELinux.

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

Сначала убедитесь, что вы находитесь в основной директории проекта.

cd ~/project

Рекомендуется устанавливать коллекции в директории проекта, чтобы сделать ваш проект самодостаточным. Создайте директорию с именем collections для их хранения.

mkdir collections

Теперь используйте команду ansible-galaxy collection install для установки необходимых коллекций. Флаг -p указывает команде устанавливать коллекции в только что созданную вами директорию collections.

ansible-galaxy collection install community.general:7.5.0 ansible.posix:1.5.4 -p collections

Команда загрузит коллекции и их зависимости. Вы увидите вывод, похожий на следующий:

Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'community.general:7.5.0' to '/home/labex/project/collections/ansible_collections/community/general'
Installing 'ansible.posix:1.5.4' to '/home/labex/project/collections/ansible_collections/ansible/posix'
...
community.general:7.5.0 was installed successfully
ansible.posix:1.5.4 was installed successfully

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

ansible-galaxy collection list -p collections

Вывод покажет установленные коллекции и пути их установки в вашем проекте.

## /home/labex/project/collections/ansible_collections
Collection              Version
----------------------- -------
ansible.posix           1.5.4
community.general       7.5.0

При использовании модуля из коллекции в плейбуке вы должны ссылаться на него по его Полному Квалифицированному Имени Коллекции (Fully Qualified Collection Name - FQCN). Для управления SELinux вы будете использовать ansible.posix.selinux для управления состоянием SELinux и community.general.seport для управления портами SELinux.

Теперь вы успешно установили мощные коллекции, включающие модули управления SELinux. На следующем шаге вы соберете плейбук, который использует вашу пользовательскую роль, роль из Git и модули SELinux из этих коллекций для полной настройки сервера разработки.

Сборка и запуск плейбука с пользовательскими ролями, ролями из Git и системными ролями

На этом шаге вы объедините все подготовленные компоненты: вашу пользовательскую роль, зависимость из Git и системную роль RHEL. Вы создадите основной плейбук, который будет оркестрировать эти роли для полной настройки сервера разработки веб-приложений.

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

Сначала убедитесь, что вы находитесь в основной директории проекта.

cd ~/project

Прежде чем приступить к настройке, давайте разберемся, что мы создаем:

  • Конфигурация Ansible: Настраивает поведение Ansible и места поиска файлов.
  • Инвентарь (Inventory): Определяет, какими серверами управлять (в нашем случае, localhost).
  • Переменные (Variables): Хранят данные, которые будут использоваться ролями (информация о разработчиках, настройки SELinux).
  • Содержимое пользовательской роли: Фактические задачи, которые будут настраивать среду разработки.
  • Основной плейбук (Main Playbook): Оркестратор, который выполняет все в правильном порядке.

1. Создание конфигурации Ansible и инвентаря

Файл ansible.cfg подобен конфигурационному файлу, который указывает Ansible, как ему следует работать. Без него вам пришлось бы указывать пути и опции в каждой команде. С ним Ansible автоматически знает, где искать ваши роли, коллекции и инвентарь.

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

nano ansible.cfg

Добавьте следующее содержимое. Давайте разберем каждую строку:

[defaults]
inventory = inventory
roles_path = roles
collections_paths = collections
host_key_checking = False

[privilege_escalation]
become = True

Что означает каждая настройка:

  • inventory = inventory: Вместо того чтобы каждый раз вводить -i inventory, Ansible будет автоматически использовать этот файл.
  • roles_path = roles: Ansible будет искать роли в директории roles.
  • collections_paths = collections: Здесь Ansible будет находить установленные вами коллекции.
  • host_key_checking = False: Предотвращает ошибки проверки SSH-ключей в лабораторных средах.
  • become = True: Автоматически выполняет задачи с повышенными привилегиями при необходимости.

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

Файл инвентаря указывает Ansible, какими машинами управлять. В нашем случае мы настраиваем локальную машину.

nano inventory

Добавьте следующую строку:

localhost ansible_connection=local

Что это означает:

  • localhost: Имя нашей целевой машины.
  • ansible_connection=local: Вместо SSH используется локальное соединение (поскольку мы управляем той же машиной, на которой запускаем Ansible).

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

2. Определение переменных роли

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

Директория group_vars/all — это специальное место, где Ansible автоматически загружает переменные для всех хостов. Любой YAML-файл в этой директории становится доступным для ваших плейбуков и ролей.

Создайте структуру директорий для переменных, которые применяются ко всем хостам:

mkdir -p group_vars/all

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

nano group_vars/all/developers.yml

Добавьте следующее содержимое:

---
web_developers:
  - username: jdoe ## Первый разработчик
    port: 9081 ## Пользовательский порт для веб-сайта этого разработчика
  - username: jdoe2 ## Второй разработчик
    port: 9082 ## Пользовательский порт для веб-сайта этого разработчика

Что означает эта структура данных:

  • web_developers: Список, содержащий информацию о разработчиках.
  • У каждого разработчика есть username и port.
  • Ваша пользовательская роль будет перебирать этот список для создания конфигураций для каждого разработчика.

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

Далее создайте файл переменных для настройки SELinux. SELinux (Security-Enhanced Linux) — это модуль безопасности, который контролирует, что могут делать приложения.

nano group_vars/all/selinux.yml

Добавьте следующее содержимое:

---
selinux_state: enforcing ## Установить SELinux в режим enforcing (максимальная безопасность)
selinux_ports: ## Список портов, которые Apache разрешено использовать
  - ports: "9081" ## Разрешить порт 9081
    proto: "tcp" ## Протокол: TCP
    setype: "http_port_t" ## Тип SELinux: HTTP порт
    state: "present" ## Добавить это правило
  - ports: "9082" ## Разрешить порт 9082
    proto: "tcp" ## Протокол: TCP
    setype: "http_port_t" ## Тип SELinux: HTTP порт
    state: "present" ## Добавить это правило

Понимание настроек SELinux:

  • selinux_state: enforcing: SELinux будет активно блокировать несанкционированные действия.
  • selinux_ports: Список конфигураций портов.
  • http_port_t: Тип SELinux, который позволяет Apache привязываться к портам.
  • По умолчанию Apache может использовать только порты 80 и 443; нам нужно явно разрешить порты 9081 и 9082.

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

3. Заполнение пользовательской роли

Ваша роль apache.developer_configs в настоящее время имеет структуру директорий, но без фактического содержимого. Нам нужно добавить:

  • Шаблоны (Templates): Файлы, которые могут включать переменные (с использованием синтаксиса Jinja2).
  • Задачи (Tasks): Фактическая работа, которую будет выполнять Ansible.
  • Обработчики (Handlers): Специальные задачи, которые выполняются только при уведомлении (например, перезапуск служб).
  • Метаданные (Metadata): Информация о зависимостях роли.

Шаблоны позволяют создавать файлы конфигурации, которые адаптируются на основе ваших переменных. Расширение .j2 указывает, что это шаблон Jinja2.

nano roles/apache.developer_configs/templates/developer.conf.j2

Добавьте следующее содержимое:

{% for dev in web_developers %}
Listen {{ dev.port }}
<VirtualHost *:{{ dev.port }}>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/{{ dev.username }}

    <Directory /var/www/{{ dev.username }}>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
{% endfor %}

Понимание синтаксиса шаблона:

  • {% for dev in web_developers %}: Начать цикл по списку разработчиков.
  • {{ dev.port }}: Вставить номер порта для этого разработчика.
  • {{ dev.username }}: Вставить имя пользователя для этого разработчика.
  • {% endfor %}: Завершить цикл.
  • Результатом будут отдельные конфигурации виртуальных хостов для каждого разработчика.

Что это создает: Для наших двух разработчиков этот шаблон сгенерирует конфигурацию Apache, которая:

  1. Заставляет Apache слушать порты 9081 и 9082.
  2. Создает виртуальные хосты, которые обслуживают контент из /var/www/jdoe и /var/www/jdoe2.
  3. Устанавливает соответствующие права доступа для каждой директории.

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

Задачи — это фактическая работа, которую выполняет Ansible. Каждая задача использует модуль Ansible для выполнения конкретной операции.

nano roles/apache.developer_configs/tasks/main.yml

Добавьте следующее содержимое и давайте разберем каждую задачу:

---
## Task 1: Create user accounts for each developer
- name: Create developer user accounts
  ansible.builtin.user: ## Использовать модуль 'user'
    name: "{{ item.username }}" ## Создать пользователя с этим именем
    state: present ## Убедиться, что пользователь существует
  loop: "{{ web_developers }}" ## Сделать это для каждого разработчика в списке

## Task 2: Create web directories for each developer
- name: Create developer web root directories
  ansible.builtin.file: ## Использовать модуль 'file'
    path: "/var/www/{{ item.username }}" ## Создать эту директорию
    state: directory ## Убедиться, что это директория
    owner: "{{ item.username }}" ## Установить владельца
    group: "{{ item.username }}" ## Установить группу
    mode: "0755" ## Установить права доступа (rwxr-xr-x)
  loop: "{{ web_developers }}"

## Task 3: Create a sample webpage for each developer
- name: Create a sample index.html for each developer
  ansible.builtin.copy: ## Использовать модуль 'copy'
    content: "Welcome to {{ item.username }}'s dev space\n" ## Содержимое файла
    dest: "/var/www/{{ item.username }}/index.html" ## Куда поместить файл
    owner: "{{ item.username }}" ## Владелец файла
    group: "{{ item.username }}" ## Группа файла
    mode: "0644" ## Права доступа к файлу (rw-r--r--)
  loop: "{{ web_developers }}"

## Task 4: Deploy the Apache configuration file
- name: Deploy developer apache configs
  ansible.builtin.template: ## Использовать модуль 'template'
    src: developer.conf.j2 ## Исходный файл шаблона
    dest: /etc/httpd/conf.d/developer.conf ## Место назначения на сервере
    mode: "0644" ## Права доступа к файлу
  notify: restart apache ## Запустить обработчик restart при изменении этого файла

Понимание ключевых концепций:

  • loop: Повторяет задачу для каждого элемента в списке.
  • {{ item.username }}: Ссылается на имя пользователя текущего элемента в цикле.
  • notify: restart apache: Когда эта задача вносит изменения, она запускает обработчик с именем "restart apache".
  • Права доступа к файлам: 0755 означает, что владелец может читать/писать/выполнять, остальные могут читать/выполнять; 0644 означает, что владелец может читать/писать, остальные могут только читать.

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

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

nano roles/apache.developer_configs/handlers/main.yml

Добавьте следующее содержимое:

---
- name: restart apache ## Это имя должно совпадать с оператором notify:
  ansible.builtin.service: ## Использовать модуль 'service'
    name: httpd ## Имя службы (Apache называется 'httpd' в RHEL)
    state: restarted ## Перезапустить службу

Зачем использовать обработчики?

  • Эффективность: Служба перезапускается только в том случае, если конфигурация действительно изменилась.
  • Порядок: Все задачи выполняются сначала, затем все обработчики выполняются в конце.
  • Идемпотентность: Несколько задач могут уведомлять один и тот же обработчик, но он выполняется только один раз.

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

Наконец, нам нужно сообщить Ansible, что наша пользовательская роль зависит от роли infra.apache, которую мы установили ранее.

nano roles/apache.developer_configs/meta/main.yml

Замените содержимое файла на:

---
dependencies:
  - role: infra.apache ## Эта роль должна быть выполнена перед нашей пользовательской ролью

Что это делает:

  • Когда Ansible выполняет apache.developer_configs, он сначала автоматически выполнит infra.apache.
  • Это гарантирует, что Apache установлен и настроен до того, как мы добавим наши пользовательские конфигурации.
  • Зависимости выполняются в том порядке, в котором они перечислены.

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

4. Сборка и запуск основного плейбука

Плейбук — это как рецепт, который указывает Ansible, что делать и в каком порядке. Наш плейбук будет:

  1. Настраивать параметры SELinux (pre_tasks).
  2. Выполнять наши роли (которые включают цепочку зависимостей).

Создайте файл основного плейбука:

nano web_dev_server.yml

Добавьте следующее содержимое с подробными объяснениями:

---
- name: Configure Dev Web Server ## Название плейбука
  hosts: localhost ## Выполнять на localhost
  pre_tasks: ## Задачи, которые выполняются перед ролями
    ## Task 1: Configure SELinux mode
    - name: Set SELinux to enforcing mode
      ansible.posix.selinux: ## Модуль из коллекции ansible.posix
        policy: targeted ## Использовать политику SELinux 'targeted'
        state: "{{ selinux_state }}" ## Использовать переменную, которую мы определили
      when: selinux_state is defined ## Выполнять только если переменная определена

    ## Task 2: Configure SELinux ports
    - name: Configure SELinux ports for Apache
      community.general.seport: ## Модуль из коллекции community.general
        ports: "{{ item.ports }}" ## Номер порта
        proto: "{{ item.proto }}" ## Протокол (tcp)
        setype: "{{ item.setype }}" ## Тип SELinux (http_port_t)
        state: "{{ item.state }}" ## present или absent
      loop: "{{ selinux_ports }}" ## Перебрать наш список портов
      when: selinux_ports is defined ## Выполнять только если переменная определена

  roles: ## Роли для выполнения
    - apache.developer_configs ## Наша пользовательская роль (которая запустит infra.apache)

Понимание порядка выполнения:

  1. pre_tasks: Сначала выполняется настройка SELinux.
  2. roles: Сначала выполняются зависимости ролей (infra.apache), затем наша пользовательская роль.
  3. handlers: Любые уведомленные обработчики выполняются в конце.

Почему этот порядок важен:

  • SELinux должен быть настроен до того, как Apache попытается привязаться к пользовательским портам.
  • Apache должен быть установлен до того, как мы сможем настроить виртуальные хосты.
  • Перезапуск служб происходит после завершения всей конфигурации.

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

Теперь вы готовы выполнить вашу полную автоматизацию:

ansible-playbook web_dev_server.yml

Плейбук выполнится, и вы увидите подробный вывод. Вот что можно ожидать (например):

PLAY [Configure Dev Web Server] *************************************************

TASK [Gathering Facts] **********************************************************
ok: [localhost]                     ## Ansible собирает информацию о системе

TASK [Set SELinux to enforcing mode] *******************************************
changed: [localhost]                ## Режим SELinux был изменен

TASK [Configure SELinux ports for Apache] **************************************
changed: [localhost] => (item={'ports': '9081', 'proto': 'tcp', 'setype': 'http_port_t', 'state': 'present'})
changed: [localhost] => (item={'ports': '9082', 'proto': 'tcp', 'setype': 'http_port_t', 'state': 'present'})

TASK [infra.apache : Ensure Apache is installed.] *******************************
changed: [localhost]                ## Пакет Apache был установлен

TASK [apache.developer_configs : Create developer user accounts] ****************
changed: [localhost] => (item={'username': 'jdoe', 'port': 9081})
changed: [localhost] => (item={'username': 'jdoe2', 'port': 9082})

TASK [apache.developer_configs : Create developer web root directories] *********
changed: [localhost] => (item={'username': 'jdoe', 'port': 9081})
changed: [localhost] => (item={'username': 'jdoe2', 'port': 9082})

TASK [apache.developer_configs : Create a sample index.html for each developer] *
changed: [localhost] => (item={'username': 'jdoe', 'port': 9081})
changed: [localhost] => (item={'username': 'jdoe2', 'port': 9082})

TASK [apache.developer_configs : Deploy developer apache configs] ***************
changed: [localhost]                ## Файл конфигурации был создан

RUNNING HANDLER [apache.developer_configs : restart apache] *********************
changed: [localhost]                ## Apache был перезапущен

PLAY RECAP **********************************************************************
localhost                  : ok=17   changed=12   unreachable=0    failed=0    skipped=3    rescued=0    ignored=0

Вы успешно собрали и запустили сложный плейбук, который объединяет несколько ролей из разных источников для создания полноценной среды разработки веб-приложений!

Проверка конфигурации SELinux и Apache на сервере RHEL

На этом заключительном шаге вы проверите, правильно ли ваша автоматизация Ansible настроила систему. Крайне важно убедиться, что службы работают должным образом и что политики безопасности (SELinux) были применены корректно. Вы будете использовать стандартные инструменты командной строки RHEL для проверки состояния системы.

Сначала убедитесь, что вы находитесь в основном каталоге проекта.

cd ~/project

1. Проверка конфигурации SELinux

Модули SELinux из коллекций были назначены для установки режима SELinux в enforcing и разрешения новых портов для типа http_port_t.

Проверьте текущий статус SELinux с помощью команды sestatus.

sestatus

Вывод должен показать, что SELinux включен и находится в режиме enforcing.

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

Далее используйте команду semanage port, чтобы проверить, были ли порты 9081 и 9082 добавлены в контекст http_port_t. Вы можете передать вывод команде grep, чтобы найти соответствующие строки.

sudo semanage port -l | grep http_port_t

Вы должны увидеть ваши пользовательские порты в списке стандартных портов HTTP. Точный вывод может отличаться, но он будет включать порты, которые вы определили.

http_port_t                    tcp      9082, 9081, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988

Это подтверждает, что модули SELinux успешно обновили политику.

2. Проверка службы Apache и конфигурации

Роль infra.apache установила и запустила службу httpd. Поскольку systemctl недоступен в этой контейнерной среде, вы можете проверить запущенный процесс с помощью ps.

ps aux | grep httpd

Вы должны увидеть несколько запущенных процессов httpd, что указывает на активную службу.

root        8851  0.2  0.4  25652 16228 ?        Ss   09:31   0:00 /usr/sbin/httpd -DFOREGROUND
apache      8852  0.0  0.1  25308  6044 ?        S    09:31   0:00 /usr/sbin/httpd -DFOREGROUND
apache      8853  0.0  0.3 1443348 11364 ?       Sl   09:31   0:00 /usr/sbin/httpd -DFOREGROUND
apache      8854  0.0  0.3 1443348 11480 ?       Sl   09:31   0:00 /usr/sbin/httpd -DFOREGROUND
apache      8855  0.0  0.4 1574484 15848 ?       Sl   09:31   0:00 /usr/sbin/httpd -DFOREGROUND
labex       9298  0.0  0.0   6408  2176 pts/3    S+   09:31   0:00 grep --color=auto httpd

3. Проверка доступности веб-контента

Наконец, самый важный тест — проверить, доступны ли веб-сайты разработчиков. Ваша роль apache.developer_configs настроила виртуальные хосты на портах 9081 и 9082. Используйте команду curl для запроса контента с каждого конечного узла.

Сначала протестируйте сайт для пользователя jdoe на порту 9081.

curl http://localhost:9081

Ожидаемый вывод — это содержимое файла index.html, который вы создали для этого пользователя.

Welcome to jdoe's dev space

Затем протестируйте сайт для пользователя jdoe2 на порту 9082.

curl http://localhost:9082

Вы должны увидеть соответствующее приветственное сообщение.

Welcome to jdoe2's dev space

Эти успешные команды curl подтверждают, что Apache правильно настроен, виртуальные хосты работают, а политика SELinux разрешает трафик на пользовательских портах.

Поздравляем! Вы успешно создали полный проект автоматизации Ansible, который объединяет пользовательскую роль, роль из репозитория Git и модули SELinux из коллекций Ansible для настройки безопасного многопользовательского сервера для разработки веб-сайтов.

Резюме

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

Основываясь на пользовательской роли, вы затем интегрируете внешние зависимости, включая роль из репозитория Git через файл requirements.yml и официальную системную роль RHEL из коллекции Ansible. Наконец, вы соберете эти различные типы ролей — пользовательскую, основанную на Git и системную — в единый плейбук, выполните его для настройки сервера и проверите полученные настройки Apache и SELinux, чтобы подтвердить успешность автоматизации.