自动化配置软件包、服务与防火墙

AnsibleBeginner
立即练习

介绍

在实际的 RHEL 自动化运维中,通常会将软件包安装、服务管理和防火墙规则配置整合到一个收敛(convergent)的 Playbook 中。

在本实验中,你将安装 httpd,确保其已启用并正在运行,通过 firewalld 允许 HTTP 流量,并验证该 Playbook 的幂等性。

创建 RHEL 服务自动化项目

在此步骤中,你将创建一个单主机项目,用于在 RHEL 10 虚拟机上自动化管理软件包、服务和防火墙状态。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
host ansible_connection=local
EOF

由于 Playbook 将对本地 RHEL 系统进行实际更改,因此本实验使用了一个本地主机别名。这依然能让你通过常规的清单(inventory)目标定位,练习 Ansible 的软件包、服务和防火墙模块。

定义预期的 Web 服务状态

在此步骤中,你将把预期的状态存储在变量中。将软件包、服务和防火墙名称保存在变量中,可以使 Playbook 更易于调整。 在执行此步骤的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行每个步骤,命令也能保持稳定。

cd /home/labex/project/rhce-ansible
mkdir -p inventory/group_vars
cat > inventory/group_vars/web.yml <<'EOF'
web_package: httpd
web_service: httpd
firewall_service: http
EOF

将这些名称保存在变量中,使得 Playbook 的阅读体验就像是在阅读策略文档:安装此软件包、管理此服务、允许此 firewalld 服务。如果你以后需要自动化其他服务,任务结构可以保持不变。

cat inventory/group_vars/web.yml

编写软件包、服务与防火墙 Playbook

在此步骤中,你将编写一个包含特权提升(privilege escalation)的 Playbook。它将使用 package、service 和 ansible.posix.firewalld 模块来收敛 Web 堆栈。 在执行此步骤的命令之前,请返回 Ansible 项目目录。

cd /home/labex/project/rhce-ansible
cat > playbooks/web-stack.yml <<'EOF'
---
- name: Configure a basic web stack
  hosts: web
  become: true
  gather_facts: false
  tasks:
    - name: Install web package
      ansible.builtin.package:
        name: "{{ web_package }}"
        state: present

    - name: Ensure web service is enabled and running
      ansible.builtin.service:
        name: "{{ web_service }}"
        state: started
        enabled: true

    - name: Allow web traffic through the firewall
      ansible.posix.firewalld:
        service: "{{ firewall_service }}"
        permanent: true
        immediate: true
        state: enabled
EOF

这三个任务共同收敛了相关的 RHEL 状态。package 确保安装了 RPM 包,service 确保 systemd 单元正在运行并已启用,而 ansible.posix.firewalld 则同时以即时和永久生效的方式开启了 HTTP 服务。

ansible-playbook playbooks/web-stack.yml --syntax-check

运行 Web 堆栈 Playbook

在此步骤中,你将运行该 Playbook。由于使用了 RHEL 软件包管理器,软件包安装过程可能比仅涉及文件的实验耗时更长。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/web-stack.yml | tee reports/web-stack-first.txt

首次运行时,dnf 安装 httpd 可能需要一些时间。运行结束后请查看汇总信息,然后使用下方的 RHEL 工具来确认系统实际状态,而不仅仅是查看 Playbook 的输出。

rpm -q httpd

rpm -q 应该会打印出已安装的 httpd 软件包名称和版本。

systemctl is-active httpd

该服务应显示 active,这确认了 Web 服务当前正在运行。

sudo firewall-cmd --list-services | tr " " "
" | grep -Fx http

此命令检查当前激活的 firewalld 服务,并精确查找 http。开启防火墙与安装并启动服务是两个独立的状态配置。

再次运行以确认幂等性

在此步骤中,你将再次运行同一个 Playbook。一旦软件包、服务和防火墙状态已经正确,汇总信息应显示没有发生任何更改(changed=0)。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/web-stack.yml | tee reports/web-stack-second.txt

第二次运行应该会更快,且不需要进行任何修复。这是对软件包、服务和防火墙组合工作流进行幂等性检查的验证。

grep -E 'host.*changed=0' reports/web-stack-second.txt

总结

你成功安装了软件包、管理了服务、开启了防火墙、验证了 RHEL 系统状态,并证明了 Playbook 在第二次运行时能够实现收敛。