RHEL 上 Ansible 角色与集合的应用
介绍在本实验中,你将学习如何借助 Ansible Roles 与 Collections 的强大能力和高复用特性,自动化配置 Red Hat Enterprise Linux (RHEL) Web 服务器。你将通过创建自定义角色来部署特定配置,将来自 Git 仓库的外部角色作为依赖项进行集成,并结合
介绍
在本实验中,你将学习如何借助 Ansible Roles 与 Collections 的强大能力和高复用特性,自动化配置 Red Hat Enterprise Linux (RHEL) Web 服务器。你将通过创建自定义角色来部署特定配置,将来自 Git 仓库的外部角色作为依赖项进行集成,并结合 Ansible Collection 中预构建的 RHEL System Role 来管理 SELinux 等系统服务,从而搭建一套完整的自动化运维流程。
整个实践过程从使用 ansible-galaxy init 创建标准化角色结构开始。随后,你将通过 requirements.yml 文件定义并安装来自 Git 仓库的角色依赖。集成 RHEL System Role 之后,你会将这三类角色——自定义角色、基于 Git 的角色以及基于 Collection 的角色——统一整合到一个主 Playbook 中。最后,你将执行该 Playbook,并验证 Apache Web 服务器与 SELinux 配置是否已正确应用到目标 RHEL 服务器,全面展示一个模块化、可扩展且易维护的自动化解决方案。
使用 ansible-galaxy init 创建自定义 Ansible 角色
在本步骤中,你将首先使用 ansible-galaxy init 命令为新的 Ansible 角色创建标准化目录结构。Ansible 角色是构建可复用、条理清晰的自动化内容的核心概念。它允许你将任务 (tasks)、处理程序 (handlers)、变量 (variables) 以及其他组件打包为独立且可移植的单元。采用标准结构是一种公认的最佳实践,能够让自动化内容更容易理解、维护与共享。
首先,请确认你位于正确的工作目录。本实验中的所有操作都将在 ~/project 目录下完成。
cd ~/project
在创建角色之前,你需要先确认系统已安装 Ansible 命令行工具。ansible-core 软件包提供了核心命令,其中就包括 ansible-galaxy。
使用 dnf 包管理器安装 ansible-core。-y 参数会自动对所有确认提示回答“是”。
sudo dnf install -y ansible-core
你应该会看到输出信息,显示软件包正在安装且依赖项已成功解析。
...
Installed:
ansible-core-2.16.x-1.el9.x86_64
...
Complete!
将项目中的所有角色统一组织到专用的 roles 目录中,是 Ansible 项目中非常常见的做法。现在请创建该目录。
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 角色的基础结构。接下来的步骤中,你将继续补充这些目录中的内容,以完成 Web 服务器配置。
使用 requirements.yml 从 Git 仓库安装角色依赖
在本步骤中,你将学习如何管理来自外部来源(例如 Git 仓库)的角色依赖。这是大型 Ansible 项目中非常常见的实践方式,因为你可以直接复用社区或其他团队已经开发好的角色。Ansible 通常使用一个名为 requirements.yml 的文件来定义需要安装的角色列表。
你的自定义角色 apache.developer_configs 将依赖一个基础 Apache 角色,以确保 Web 服务器已正确安装并处于运行状态。接下来,你将定义并安装这一依赖项。
首先,请确认你已回到主项目目录。如果你仍位于上一小节的 roles 子目录中,请切换回 ~/project。
cd ~/project
现在,你将在 roles 目录下创建 requirements.yml 文件。该文件用于列出项目需要的所有外部角色。使用 nano 编辑器创建并编辑此文件。
nano roles/requirements.yml
将下面这段内容写入文件即可。它的作用非常明确:通知 ansible-galaxy 从公共 Git 仓库拉取指定版本的 Apache 角色,并在本地以 infra.apache 这个名称保存。
- name: infra.apache
src: https://github.com/geerlingguy/ansible-role-apache.git
scm: git
version: 3.2.0
下面对该定义做一个简单拆解:
- name: 这是角色在本地的名称。即使源仓库名称不同,它也会被安装到名为 infra.apache 的目录中。
- src: 指向 Git 仓库的源地址 URL。
- scm: 指定源代码管理工具,本例中使用的是 git。
- version: 指定要使用的 Git 分支、标签或提交哈希。固定版本对于保证自动化稳定、结果可预测非常重要。
保存文件并退出 nano,按 Ctrl+X,然后按 Y,最后按 Enter。
当 requirements.yml 文件准备好后,就可以使用 ansible-galaxy install 命令来下载并安装该角色了。
- -r 参数用于指定 requirements 文件。
- -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 仓库中的角色声明为依赖并安装到项目中。下一步,你将把这个依赖集成到自定义角色的元数据中。
集成来自 Ansible Collection 的 RHEL 系统角色
在这一步中,你将使用 Ansible Collections。Collections 是分发 Ansible 内容的标准方式,通常包含角色、模块和插件等内容。你将安装 Community General collection,它提供了一组非常实用的模块,可用于自动化常见管理任务,其中就包括 SELinux 管理。
在当前 Web 服务器场景下,我们需要正确配置 SELinux,确保 Apache 服务能够监听非标准端口。community.general collection 中包含的 SELinux 相关模块非常适合完成这一任务。
首先,确保你当前位于主项目目录。
cd ~/project
将 collections 安装到项目目录内部是一种推荐做法,这样可以让项目具备更好的自包含性。现在创建一个名为 collections 的目录来存放它们。
mkdir collections
接下来,使用 ansible-galaxy collection install 命令安装所需的 collections。-p 参数表示将 collections 安装到你刚刚创建的 collections 目录中。
ansible-galaxy collection install community.general:7.5.0 ansible.posix:1.5.4 -p collections
该命令会下载相应的 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
为了验证 collection 是否已在当前项目中可用,你可以通过指定 collections 路径来列出已安装的所有 collections。
ansible-galaxy collection list -p collections
输出将显示已安装的 collections 以及它们在项目内的安装路径。
## /home/labex/project/collections/ansible_collections
Collection Version
----------------------- -------
ansible.posix 1.5.4
community.general 7.5.0
在 Playbook 中调用 collection 内的模块时,必须使用它们的完全限定集合名称 (FQCN)。对于 SELinux 管理,你将使用 ansible.posix.selinux 来控制 SELinux 状态,使用 community.general.seport 来管理 SELinux 端口策略。
现在,你已经成功安装了包含 SELinux 管理模块的重要 collections。下一步,你将编排一个 Playbook,把自定义角色、来自 Git 的角色,以及这些 collections 提供的 SELinux 模块组合起来,完整配置开发用 Web 服务器。
使用自定义角色、Git 角色和系统角色组装并运行 Playbook
在本步骤中,你将把所有已经准备好的组件整合起来:你的自定义角色、来自 Git 的依赖角色,以及 RHEL System Role。你将创建一个主 Playbook,用于统一协调这些角色,从而完整配置开发 Web 服务器。
你可以把这一步理解为用不同组件组装一台复杂机器——每个角色都有明确职责,它们相互协作,共同构建完整的 Web 服务器环境。下面我们将把这个过程拆分为几个更容易理解的部分:
首先,确保你位于主项目目录。
cd ~/project
在正式开始配置之前,先了解一下你将要创建的内容:
- Ansible 配置 (Ansible Configuration):定义 Ansible 的运行行为以及文件查找路径
- 清单 (Inventory):定义需要管理的服务器(本例中为 localhost)
- 变量 (Variables):存储角色将使用的数据(如开发者信息、SELinux 设置)
- 自定义角色内容 (Custom Role Content):实现开发者环境配置的具体任务
- 主 Playbook (Main Playbook):按正确顺序调度所有内容的总控制器
1. 创建 Ansible 配置和清单
ansible.cfg 文件就像 Ansible 的配置中心,它决定了 Ansible 的运行方式。没有这个文件时,你需要在每个命令中手动指定路径和参数;有了它,Ansible 就能自动知道去哪里查找角色、集合和清单文件。
使用 nano 创建 ansible.cfg 文件。该文件将告诉 Ansible 去哪里查找角色、collections 和 inventory。
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)。
Inventory 清单文件用于告诉 Ansible 要管理哪些主机。在本例中,我们要配置的是本地机器。
nano inventory
添加以下内容:
localhost ansible_connection=local
这表示:
- localhost:目标主机名称
- ansible_connection=local:不通过 SSH 连接,而是直接使用本地连接方式(因为被管理主机就是运行 Ansible 的这台机器)
保存并退出 nano。
2. 定义角色变量
在 Ansible 中,变量就像可复用的配置项。你不需要把用户名、端口号这类值硬编码在任务中,而是可以统一定义在变量文件中。这会让自动化脚本更灵活、更易复用,也更方便维护。
group_vars/all 目录是一个特殊位置,Ansible 会自动加载其中适用于所有主机的变量。该目录中的任何 YAML 文件,都可以被你的 Playbook 和角色直接使用。
创建适用于所有主机的变量目录结构:
mkdir -p group_vars/all
现在,创建一个变量文件来定义开发者信息。这些数据将由你的自定义角色使用,用于创建用户账户和 Web 配置。
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)是 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:允许 Apache 绑定端口时使用的 SELinux 类型
- 默认情况下,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 }}
ServerAdmin webmaster@localhost
DocumentRoot /var/www/{{ dev.username }}
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
{% endfor %}
理解模板语法:
- {% for dev in web_developers %}:开始遍历开发者列表
- {{ dev.port }}:插入当前开发者的端口号
- {{ dev.username }}:插入当前开发者的用户名
- {% endfor %}:结束循环
- 最终会为每位开发者生成独立的虚拟主机配置
该模板会生成什么: 针对本例中的两位开发者,这个模板将生成 Apache 配置,从而:
- 让 Apache 监听 9081 和 9082 端口
- 创建虚拟主机,并分别从 /var/www/jdoe 和 /var/www/jdoe2 提供站点内容
- 为对应目录设置合适的访问权限
保存并退出。
任务定义了 Ansible 需要执行的具体工作。每个任务通常会调用一个 Ansible 模块来完成特定操作。
nano roles/apache.developer_configs/tasks/main.yml
添加以下内容,下面也会解释每个任务的作用:
---
## 任务 1:为每位开发者创建用户帐户
- name: Create developer user accounts
ansible.builtin.user: ## 使用 'user' 模块
name: "{{ item.username }}" ## 创建此名称的用户
state: present ## 确保用户存在
loop: "{{ web_developers }}" ## 对列表中的每位开发者执行
## 任务 2:为每位开发者创建 Web 目录
- 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 }}"
## 任务 3:为每位开发者创建示例网页
- name: Create a sample index.html for each developer
ansible.builtin.copy: ## 使用 'copy' 模块
content: "Welcome to {{ item.username }}'s dev spacen" ## 文件内容
dest: "/var/www/{{ item.username }}/index.html" ## 文件保存位置
owner: "{{ item.username }}" ## 文件所有者
group: "{{ item.username }}" ## 文件所属组
mode: "0644" ## 文件权限 (rw-r--r--)
loop: "{{ web_developers }}"
## 任务 4:部署 Apache 配置文件
- 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 apache 处理程序
理解关键概念:
- 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 ## 服务名称(在 RHEL 中,Apache 服务名为 'httpd')
state: restarted ## 重启服务
为什么要使用处理程序?
- 效率更高:只有在配置确实发生变化时才会重启服务
- 执行顺序明确:所有普通任务先执行,处理程序最后统一执行
- 具备幂等性:多个任务可以通知同一个处理程序,但它通常只会运行一次
保存并退出。
最后,我们还需要告诉 Ansible:当前自定义角色依赖于之前安装好的 infra.apache 角色。
nano roles/apache.developer_configs/meta/main.yml
将文件内容替换为:
---
dependencies:
- role: infra.apache ## 该角色必须先于自定义角色执行
这段配置的作用是:
- 当 Ansible 执行 apache.developer_configs 时,会先自动执行 infra.apache
- 这样可以确保在应用自定义 Apache 配置之前,Apache 已完成安装和基础配置
- 依赖项会按照定义顺序执行
保存并退出。
4. 组装并运行主 Playbook
Playbook 就像一份自动化执行手册,用于告诉 Ansible 要做什么、以及按照什么顺序完成这些步骤。我们的 Playbook 将:
- 先配置 SELinux 设置(pre_tasks)
- 再执行角色(包括依赖链)
创建主 Playbook 文件:
nano web_dev_server.yml
添加以下内容,并结合说明理解其结构:
---
- name: Configure Dev Web Server ## Playbook 名称
hosts: localhost ## 在 localhost 上执行
pre_tasks: ## 在角色执行前运行的任务
## 任务 1:配置 SELinux 模式
- name: Set SELinux to enforcing mode
ansible.posix.selinux: ## 来自 ansible.posix collection 的模块
policy: targeted ## 使用 'targeted' SELinux 策略
state: "{{ selinux_state }}" ## 使用已定义变量
when: selinux_state is defined ## 仅当变量已定义时执行
## 任务 2:配置 SELinux 端口
- name: Configure SELinux ports for Apache
community.general.seport: ## 来自 community.general collection 的模块
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 依赖)
理解执行顺序:
- pre_tasks:先完成 SELinux 配置
- roles:先执行角色依赖(infra.apache),再执行自定义角色
- handlers:最后执行所有收到通知的处理程序
为什么这个顺序很重要:
- 在 Apache 绑定自定义端口之前,SELinux 必须先完成放行配置
- 在部署虚拟主机配置之前,Apache 必须已经安装完成
- 服务重启应放在全部配置更新之后统一进行
保存并退出。
现在,你已经可以执行完整的自动化部署了:
ansible-playbook web_dev_server.yml
Playbook 开始执行后,你会看到详细输出。以下是一个预期结果示例:
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
至此,你已经成功组装并运行了一个较为完整的 Ansible Playbook。它整合了多个不同来源的角色,共同构建出一个完整的 Web 开发服务器环境。
验证 RHEL 服务器上的 SELinux 和 Apache 配置
在最后一步中,你将验证 Ansible 自动化是否已经正确完成系统配置。确认服务是否按预期运行,以及安全策略(SELinux)是否已准确生效,是自动化部署中非常关键的一环。你将使用标准的 RHEL 命令行工具来检查系统状态。
首先,请确保你位于主项目目录中。
cd ~/project
1. 验证 SELinux 配置
来自 collections 的 SELinux 模块任务,负责将 SELinux 模式设置为 enforcing,并为 http_port_t 类型开放新增端口。
使用 sestatus 命令检查当前 SELinux 状态。
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 进程正在运行,这基本可以说明 Apache 服务已经成功启动。
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. 验证 Web 内容的可访问性
最后,也是最关键的一项验证,就是确认开发者站点是否可以正常访问。你的 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 策略也已允许通过自定义端口访问相关 Web 服务。
恭喜!你已经成功构建并验证了一个完整的 Ansible 自动化项目。该项目结合了自定义角色、来自 Git 存储库的角色,以及 Ansible collections 中的 SELinux 模块,用于配置一台安全的多用户开发 Web 服务器。
总结
在本实验中,你学习了如何利用 Ansible 角色 (Roles) 与集合 (Collections) 的强大能力和标准化结构,自动化部署与配置 RHEL Web 服务器。你从使用 ansible-galaxy init 命令创建自定义角色开始,该命令帮助你快速建立适用于可复用自动化内容的标准目录结构。这一基础步骤为后续更复杂的自动化编排打下了坚实基础。
在自定义角色之上,你继续集成了外部依赖,包括通过 requirements.yml 文件引入的 Git 仓库角色,以及来自 Ansible Collection 的官方 RHEL 系统角色。最后,你将这些不同类型的角色——自定义角色、基于 Git 的角色和系统角色——统一整合到一个 Playbook 中,执行自动化配置任务,并验证 Apache 与 SELinux 设置是否按预期生效,从而确认整个自动化流程部署成功。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
VMware安装Ubuntu完整教程:创建虚拟机与启动验证
本教程详细演示如何在VMware中创建Ubuntu虚拟机,涵盖ISO挂载、硬件配置、安装向导及启动验证。通过清晰的步骤与验证命令,帮助新手快速搭建可用的Linux学习环境。
Win10专业版U盘安装教程:制作启动盘与完整安装步骤
本文提供Win10专业版U盘安装完整流程:准备8GB以上U盘与官方镜像,制作启动盘并核对盘符;通过F12 F11 Esc等快捷键或BIOS设置U盘为第一启动项;安装时选择专业版并谨慎分区;完成后在“设置—系统—关于”验证版本与激活状态。操作前务必备份数据。
Windows10系统字体太小怎么调大
Windows10系统字体太小怎么调大?只需两步:首先打开设置中的显示选项,将缩放比例调整为125%或150%;随后运行ClearType文本调谐器优化字体清晰度。此方法适用于高分屏及普通屏幕,无需修改注册表即可解决界面拥挤问题。
Win10磁盘占用100%基础排查:从监控到清理的完整步骤
Windows 10系统出现磁盘占用100%会导致电脑卡顿、程序响应缓慢。本文提供基础排查方案:首先通过任务管理器确认是否为磁盘高负载,随后进入系统存储页面分析C盘占用类别,最后针对性清理临时文件。遵循此流程可有效缓解磁盘压力,避免盲目重装系统。
Windows10系统怎么显示此电脑和控制面板
Windows10默认可能不显示桌面图标,导致找不到“此电脑”和“控制面板”。只需进入个性化设置,在“桌面图标设置”中勾选对应选项即可恢复。本文提供详细图文步骤,帮助快速找回系统入口。
- 热门数据榜
相关攻略
2026-09-01 16:50
2026-09-01 16:50
2026-08-27 15:46
2026-08-27 15:45
2026-08-27 15:45
2026-08-27 15:45
2026-08-27 15:44
2026-08-27 15:44
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

