商城首页欢迎来到中国正版软件门户

您的位置:首页 >使用 Ansible 自动化 RHEL 管理任务

使用 Ansible 自动化 RHEL 管理任务

  发布于2026-08-13 阅读(0)

扫一扫,手机访问

{"position":0,"title":"介绍","layout":"doc-fullscreen","text":"## 介绍nn在本篇综合实验中,你将掌握使用 Ansible 自动化关键的 Linux 管理任务。在你掌握了文件管理的基础后,你将探索如何管理系统管理的完整生命周期,从软件安装到用户管理、服务配置、存储配置和网络设置。nn你将首先使用 `ansible.builtin.dnf`、`ansible.builtin.yum_repository` 和 `ansible.builtin.rpm_key` 等模块来自动化软件包管理和仓库配置。接下来,你将创建和管理用户账户,配置 SSH 访问,并设置 sudo 权限。本实验将逐步进行服务管理、使用 cron 和 systemd 进行计划任务,然后进阶到使用 LVM 和文件系统操作进行存储管理。最后,你将配置网络接口并收集系统信息。nn本实验强调在企业 Linux 环境中常见的真实场景,帮助你有效地实施基础设施即代码(Infrastructure as Code)实践。n","need_verify":false,"has_solution":false},{"position":1,"title":"配置仓库和管理软件包","layout":"doc-workbench-split","text":"## 配置仓库和管理软件包nn在本步骤中,你将学习如何使用 Ansible 在 RHEL 系统上自动化软件包管理。你将配置一个 Yum 仓库,管理 RPM GPG 密钥,并在托管主机上收集软件包信息。这对于在你的基础设施中维护一致的软件安装至关重要。nn你将使用几个关键模块:`ansible.builtin.yum_repository` 用于仓库管理,`ansible.builtin.rpm_key` 用于 GPG 密钥处理,`ansible.builtin.package_facts` 用于收集软件包信息,以及 `ansible.builtin.dnf` 用于软件包安装。nn1. **首先,设置项目环境并安装 Ansible。**nn 安装 `ansible-core` 包并导航到项目目录。nn ```bashn sudo dnf install -y ansible-coren cd ~/projectn mkdir system-softwaren cd system-softwaren ```nn2. **创建 Ansible inventory 文件** 来定义我们的托管主机。在本实验中,我们将管理本地机器。nn ```bashn cat << EOF > inventory.inin [webservers]n localhost ansible_connection=localn n [all:children]n webserversn EOFn ```nn3. **创建主 playbook `repo_playbook.yml`**,它将管理仓库配置和软件包安装。此 playbook 演示了一个完整的软件管理工作流程。nn ```bashn nano repo_playbook.ymln ```nn 添加以下内容来创建一个全面的软件管理 playbook:nn ```yamln ---n - name: Repository Configuration and Software Managementn hosts: alln become: truen vars:n custom_pkg: httpdn tasks:n - name: Gather Package Factsn ansible.builtin.package_facts:n manager: autonn - name: Show Package Facts for the custom package (initial check)n ansible.builtin.debug:n var: ansible_facts['packages'][custom_pkg]n when: custom_pkg in ansible_facts['packages']nn - name: Ensure EPEL repository is configuredn ansible.builtin.yum_repository:n name: epeln description: Extra Packages for Enterprise Linux 9n file: epeln baseurl: https://download.fedoraproject.org/pub/epel/9/Everything/x86_64/n gpgcheck: yesn gpgkey: https://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9n enabled: yesn state: presentnn - name: Import EPEL GPG keyn ansible.builtin.rpm_key:n state: presentn key: https://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9nn - name: Install the custom packagen ansible.builtin.dnf:n name: "{{ custom_pkg }}"n state: presentnn - name: Gather Package Facts (after installation)n ansible.builtin.package_facts:n manager: autonn - name: Show Package Facts for the custom package (post-installation)n ansible.builtin.debug:n var: ansible_facts['packages'][custom_pkg]n when: custom_pkg in ansible_facts['packages']nn - name: Display installed package versionn ansible.builtin.debug:n msg: "{{ custom_pkg }} version {{ ansible_facts['packages'][custom_pkg][0]['version'] }} is installed"n when: custom_pkg in ansible_facts['packages']n ```nn > **注意:** 本实验中的配置文件相当长,为了保持文档简洁,此处不提供详细解释。如果你需要任何部分的解释,请点击代码块左下角的“Explain Code”按钮,获取 Labby 提供的详细解释。nn 此 playbook 演示了几个重要概念:nn - **软件包事实收集**:展示了如何收集已安装软件包的信息n - **仓库管理**:配置 EPEL 仓库并进行适当的 GPG 验证n - **GPG 密钥管理**:导入仓库的 GPG 密钥以确保安全n - **软件包安装**:使用 dnf 模块安装指定的软件包n - **验证**:通过更新的事实确认软件包安装nn4. **执行 playbook** 以查看完整的软件管理工作流程。nn ```bashn ansible-playbook -i inventory.ini repo_playbook.ymln ```nn 你应该会看到输出显示:nn - 初始软件包检查(由于 httpd 未安装,可能被跳过)n - 仓库配置n - GPG 密钥导入n - 软件包安装n - 最终验证显示已安装的软件包nn5. **验证仓库配置**,通过检查创建的仓库文件。nn ```bashn cat /etc/yum.repos.d/epel.repon ```nn 你应该会看到 EPEL 仓库配置,其中包含 baseurl、gpgcheck 和 gpgkey 设置。nn6. **测试软件包管理的幂等性**,再次运行 playbook。nn ```bashn ansible-playbook -i inventory.ini repo_playbook.ymln ```nn 请注意,Ansible 会报告不需要更改的任务为“ok”,这展示了其幂等性。nn你已成功使用 Ansible 自动化了软件软件包管理,包括仓库配置、GPG 密钥管理和软件包安装验证。n","need_verify":true,"has_solution":false},{"position":2,"title":"自动化用户管理和 SSH 配置","layout":"doc-workbench-split","text":"## 自动化用户管理和 SSH 配置nn在本步骤中,你将学习如何使用 Ansible 自动化用户账户管理、SSH 配置和 sudo 权限。这对于在你的基础设施中维护一致的用户访问和安全策略至关重要。nn你将使用诸如 `ansible.builtin.user` 用于用户管理,`ansible.builtin.group` 用于组创建,`ansible.posix.authorized_key` 用于 SSH 密钥管理,以及 `ansible.builtin.lineinfile` 用于配置文件修改等模块。nn1. **导航到新的项目目录以进行用户管理任务。**nn ```bashn cd ~/projectn mkdir system-usersn cd system-usersn ```nn 安装 `ansible.posix` collection。nn ```bashn ansible-galaxy collection install ansible.posixn ```nn2. **创建本次实验的 inventory 文件**。nn ```bashn cat << EOF > inventory.inin [webservers]n localhost ansible_connection=localn EOFn ```nn3. **创建一个变量文件** 来定义我们要管理的用户的组和用户。nn ```bashn mkdir varsn nano vars/users_vars.ymln ```nn 添加以下内容来定义用户账户及其组的成员关系:nn ```yamln ---n users:n - username: webuser1n groups: webadminn - username: webuser2n groups: webadminn - username: devuser1n groups: webadminn ```nn4. **为我们的用户生成 SSH 密钥对**。在实际环境中,用户会提供他们的公钥。nn ```bashn mkdir filesn n ## 为每个用户生成 SSH 密钥n ssh-keygen -t rsa -b 2048 -f files/webuser1.key -N "" -C "webuser1@example.com"n ssh-keygen -t rsa -b 2048 -f files/webuser2.key -N "" -C "webuser2@example.com"n ssh-keygen -t rsa -b 2048 -f files/devuser1.key -N "" -C "devuser1@example.com"n ```nn5. **创建主用户管理 playbook `users.yml`**。此 playbook 将创建组、用户,分发 SSH 密钥,并配置 sudo 访问。nn ```bashn nano users.ymln ```nn 添加以下全面的用户管理 playbook:nn ```yamln ---n - name: Create and manage user accountsn hosts: webserversn become: truen vars_files:n - vars/users_vars.ymln tasks:n - name: Create webadmin groupn ansible.builtin.group:n name: webadminn state: presentnn - name: Create user accountsn ansible.builtin.user:n name: "{{ item['username'] }}"n groups: "{{ item['groups'] }}"n shell: /bin/bashn create_home: yesn state: presentn loop: "{{ users }}"nn - name: Set up SSH authorized keysn ansible.posix.authorized_key:n user: "{{ item['username'] }}"n key: "{{ lookup('file', 'files/' + item['username'] + '.key.pub') }}"n state: presentn loop: "{{ users }}"nn - name: Configure sudo access for webadmin groupn ansible.builtin.lineinfile:n path: /etc/sudoers.d/webadminn state: presentn create: yesn mode: "0440"n line: "%webadmin ALL=(ALL) NOPASSWD: ALL"n validate: /usr/sbin/visudo -cf %snn - name: Configure SSH to disable root loginn ansible.builtin.lineinfile:n dest: /etc/ssh/sshd_confign regexp: "^PermitRootLogin"n line: "PermitRootLogin no"n backup: yesn notify: restart sshdnn - name: Configure SSH to disable password authenticationn ansible.builtin.lineinfile:n dest: /etc/ssh/sshd_confign regexp: "^PasswordAuthentication"n line: "PasswordAuthentication no"n backup: yesn notify: restart sshdnn handlers:n - name: restart sshdn ansible.builtin.service:n name: sshdn state: restartedn ```nn 此 playbook 演示了几个用户管理最佳实践:nn - **组管理**:创建管理组n - **用户创建**:设置用户账户及其正确的家目录n - **SSH 密钥管理**:分发公钥以进行基于密钥的认证n - **Sudo 配置**:安全地授予管理权限n - **SSH 加固**:禁用 root 登录和密码认证n - **服务管理**:在配置更改时重启 SSH 服务nn6. **执行用户管理 playbook**。nn ```bashn ansible-playbook -i inventory.ini users.ymln ```nn Playbook 将创建用户,设置 SSH 密钥,配置 sudo 访问,并加固 SSH 配置。nn7. **验证用户创建和组的成员关系**。nn ```bashn ## 检查用户是否已创建n getent passwd webuser1 webuser2 devuser1n n ## 检查组的成员关系n groups webuser1n groups webuser2n groups devuser1n n ## 验证 webadmin 组是否存在n getent group webadminn ```nn8. **测试其中一个已创建用户的 SSH 密钥认证**。nn ```bashn ## 测试 SSH 密钥认证(这将连接到 localhost)n ssh -i files/webuser1.key webuser1@localhost "whoami"n ```nn9. **验证 sudo 配置**,通过测试无密码的 sudo 访问。nn ```bashn ## 测试 webuser1 的 sudo 访问n ssh -i files/webuser1.key webuser1@localhost "sudo whoami"n ```nn10. **检查 SSH 配置更改**。nn ```bashn ## 验证 SSH 配置n sudo grep "PermitRootLogin\|PasswordAuthentication" /etc/ssh/sshd_confign n ## 检查 sudo 配置n sudo cat /etc/sudoers.d/webadminn ```nn你已成功使用 Ansible 自动化了用户账户创建、SSH 密钥分发和安全配置,为跨基础设施的安全用户管理奠定了基础。n","need_verify":true,"has_solution":false},{"position":3,"title":"自动化服务管理和任务调度","layout":"doc-workbench-split","text":"## 自动化服务管理和任务调度nn在本步骤中,你将学习如何使用 Ansible 管理 systemd 服务、调度 cron 作业以及配置系统启动目标。这对于维护服务可用性和自动化基础设施中的例行任务至关重要。nn你将使用诸如 `ansible.builtin.service` 用于服务管理,`ansible.builtin.cron` 用于调度任务,`ansible.posix.at` 用于一次性任务,以及 `ansible.builtin.systemd` 用于系统目标管理等模块。nn1. **导航到新的项目目录以进行服务和进程管理。**nn ```bashn cd ~/projectn mkdir system-processn cd system-processn ```nn2. **创建本次实验的 inventory 文件**。nn ```bashn cat << EOF > inventory.inin [webservers]n localhost ansible_connection=localn EOFn ```nn3. **创建一个 playbook 来管理 Apache HTTP 服务器服务**。这将演示基本的服务管理。nn ```bashn nano service_management.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Manage Apache HTTP Server Servicen hosts: webserversn become: truen tasks:n - name: Start and enable httpd servicen ansible.builtin.service:n name: httpdn state: startedn enabled: yesnn - name: Create a simple index.htmln ansible.builtin.copy:n content: |n n Ansible Managed Servern n

Welcome to Ansible Managed Apache Server

n

This server is configured and managed by Ansible.

n

Service started at: $(date)

n n n dest: /var/www/html/index.htmln owner: apachen group: apachen mode: "0644"nn - name: Verify httpd service is runningn ansible.builtin.service_facts:nn - name: Display httpd service statusn ansible.builtin.debug:n var: ansible_facts.services['httpd.service']n ```nn4. **创建一个用于调度 cron 作业的 playbook**。这演示了自动化任务调度。nn ```bashn nano create_crontab_file.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Schedule recurring cron jobsn hosts: webserversn become: truen tasks:n - name: Create labex user for cron jobsn ansible.builtin.user:n name: labexn state: presentn create_home: yesnn - name: Schedule system monitoring cron jobn ansible.builtin.cron:n name: System monitoring logn job: "date >> /home/labex/system_monitor.log && df -h >> /home/labex/system_monitor.log"n minute: "*/5"n hour: "*"n user: labexn cron_file: system-monitoringn state: presentnn - name: Schedule daily log rotationn ansible.builtin.cron:n name: Daily log cleanupn job: "find /home/labex -name '*.log' -mtime +7 -delete"n minute: "0"n hour: "2"n weekday: "*"n user: labexn cron_file: log-cleanupn state: presentnn - name: Schedule weekly system update checkn ansible.builtin.cron:n name: Weekly update checkn job: "dnf check-update > /home/labex/update_check.log 2>&1"n minute: "0"n hour: "3"n weekday: "0"n user: labexn cron_file: update-checkn state: presentn ```nn5. **创建一个使用 `at` 调度一次性任务的 playbook**。nn ```bashn nano schedule_at_task.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Schedule one-time tasks with atn hosts: webserversn become: truen become_user: labexn tasks:n - name: Schedule immediate system info collectionn ansible.posix.at:n command: "uname -a > ~/system_info_$(date +%Y%m%d_%H%M%S).txt"n count: 2n units: minutesn unique: yesn state: presentnn - name: Schedule delayed service status checkn ansible.posix.at:n command: "systemctl status httpd > ~/httpd_status_$(date +%Y%m%d_%H%M%S).txt"n count: 5n units: minutesn unique: yesn state: presentn ```nn6. **创建一个管理系统启动目标的 playbook**。nn ```bashn nano boot_target_management.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Manage system boot targetsn hosts: webserversn become: truen tasks:n - name: Check current default targetn ansible.builtin.command:n cmd: systemctl get-defaultn register: current_targetn changed_when: falsenn - name: Display current boot targetn ansible.builtin.debug:n msg: "Current default boot target: {{ current_target.stdout }}"nn - name: Set default boot target to multi-usern ansible.builtin.systemd:n name: multi-user.targetn enabled: yesn when: current_target.stdout != "multi-user.target"nn - name: Verify the boot target changen ansible.builtin.command:n cmd: systemctl get-defaultn register: new_targetn changed_when: falsenn - name: Display new boot targetn ansible.builtin.debug:n msg: "New default boot target: {{ new_target.stdout }}"n ```nn7. **执行服务管理 playbook**。nn ```bashn ansible-playbook -i inventory.ini service_management.ymln ```nn 这将启动 httpd 服务并创建一个欢迎页面。nn8. **执行 cron 作业调度 playbook**。nn ```bashn ansible-playbook -i inventory.ini create_crontab_file.ymln ```nn 这将为系统监控和维护创建几个计划任务。nn9. **执行一次性任务调度 playbook**。nn ```bashn ansible-playbook -i inventory.ini schedule_at_task.ymln ```nn 这将使用 `at` 命令调度即时任务。nn10. **执行启动目标管理 playbook**。nn ```bashn ansible-playbook -i inventory.ini boot_target_management.ymln ```nn 这将检查并可能修改系统的默认启动目标。nn11. **验证计划任务和服务**。nn ```bashn ## 检查 cron 作业n sudo cat /etc/cron.d/system-monitoringn sudo cat /etc/cron.d/log-cleanupn sudo cat /etc/cron.d/update-checkn n ## 检查 at 作业n sudo atqn n ## 检查 httpd 服务状态n sudo systemctl status httpdn n ## 测试 Web 服务器n curl localhostn n ## 检查系统监控日志(等待几分钟让 cron 运行)n sudo cat /home/labex/system_monitor.logn ```nn12. **创建一个清理 playbook** 以在需要时删除计划任务。nn ```bashn nano remove_scheduled_tasks.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Remove scheduled tasksn hosts: webserversn become: truen tasks:n - name: Remove system monitoring cron jobn ansible.builtin.cron:n name: System monitoring logn user: labexn cron_file: system-monitoringn state: absentnn - name: Remove log cleanup cron jobn ansible.builtin.cron:n name: Daily log cleanupn user: labexn cron_file: log-cleanupn state: absentnn - name: Remove update check cron jobn ansible.builtin.cron:n name: Weekly update checkn user: labexn cron_file: update-checkn state: absentn ```nn你已成功使用 Ansible 自动化了服务管理、任务调度和系统配置,为自动维护和监控你的基础设施奠定了基础。n","need_verify":true,"has_solution":false},{"position":4,"title":"使用 LVM 和文件系统自动化存储管理","layout":"doc-workbench-split","text":"## 使用 LVM 和文件系统自动化存储管理nn在本步骤中,你将学习如何使用 Ansible 自动化存储管理,包括创建 LVM 物理卷、卷组、逻辑卷和文件系统。这对于以一致且可扩展的方式管理基础设施中的存储资源至关重要。nn你将使用诸如 `ansible.builtin.lvg` 用于卷组管理,`ansible.builtin.lvol` 用于逻辑卷创建,`ansible.builtin.filesystem` 用于文件系统创建,以及 `ansible.posix.mount` 用于挂载点管理等模块。nn1. **导航到新的项目目录以进行存储管理。**nn ```bashn cd ~/projectn mkdir system-storagen cd system-storagen ```nn2. **创建本次实验的 inventory 文件**。nn ```bashn cat << EOF > inventory.inin [webservers]n localhost ansible_connection=localn EOFn ```nn3. **创建一个 loop device 来模拟额外的存储**,因为我们是在虚拟环境中工作。nn ```bashn ## 创建一个 1GB 的文件用作虚拟磁盘n sudo dd if=/dev/zero of=/tmp/virtual_disk bs=1M count=1024n n ## 设置 loop devicen sudo losetup /dev/loop0 /tmp/virtual_diskn n ## 验证 loop devicen lsblk | grep loop0n ```nn4. **创建一个全面的存储管理 playbook**。这将演示 LVM 操作和文件系统管理。nn ```bashn nano storage.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Configure LVM storage and filesystemsn hosts: webserversn become: truen vars:n storage_device: /dev/loop0n volume_group: apache-vgn content_lv: content-lvn logs_lv: logs-lvn backup_lv: backup-lvn tasks:n - name: Install LVM utilitiesn ansible.builtin.dnf:n name: lvm2n state: presentnn - name: Create physical volumen community.general.lvg:n vg: "{{ volume_group }}"n pvs: "{{ storage_device }}"n state: presentnn - name: Create logical volume for web contentn community.general.lvol:n vg: "{{ volume_group }}"n lv: "{{ content_lv }}"n size: 256mn state: presentnn - name: Create logical volume for logsn community.general.lvol:n vg: "{{ volume_group }}"n lv: "{{ logs_lv }}"n size: 256mn state: presentnn - name: Create logical volume for backupn community.general.lvol:n vg: "{{ volume_group }}"n lv: "{{ backup_lv }}"n size: 256mn state: presentnn - name: Create XFS filesystem on content volumen community.general.filesystem:n fstype: xfsn dev: "/dev/{{ volume_group }}/{{ content_lv }}"n force: nonn - name: Create XFS filesystem on logs volumen community.general.filesystem:n fstype: xfsn dev: "/dev/{{ volume_group }}/{{ logs_lv }}"n force: nonn - name: Create ext4 filesystem on backup volumen community.general.filesystem:n fstype: ext4n dev: "/dev/{{ volume_group }}/{{ backup_lv }}"n force: nonn - name: Create mount pointsn ansible.builtin.file:n path: "{{ item }}"n state: directoryn mode: "0755"n loop:n - /var/wwwn - /var/log/httpdn - /backupnn - name: Mount web content volumen ansible.posix.mount:n path: /var/wwwn src: "/dev/{{ volume_group }}/{{ content_lv }}"n fstype: xfsn opts: defaultsn state: mountednn - name: Mount logs volumen ansible.posix.mount:n path: /var/log/httpdn src: "/dev/{{ volume_group }}/{{ logs_lv }}"n fstype: xfsn opts: defaultsn state: mountednn - name: Mount backup volumen ansible.posix.mount:n path: /backupn src: "/dev/{{ volume_group }}/{{ backup_lv }}"n fstype: ext4n opts: defaultsn state: mountednn - name: Set appropriate ownership for web contentn ansible.builtin.file:n path: /var/wwwn owner: apachen group: apachen recurse: yesnn - name: Set appropriate ownership for httpd logsn ansible.builtin.file:n path: /var/log/httpdn owner: apachen group: apachen recurse: yesnn - name: Create html directory for web contentn ansible.builtin.file:n path: /var/www/htmln state: directoryn owner: apachen group: apachen mode: "0755"nn - name: Create sample web contentn ansible.builtin.copy:n content: |n n Storage Management Demon n

LVM Storage Configuration

n

This content is served from an LVM logical volume managed by Ansible.

n

Volume Group: {{ volume_group }}

n

Logical Volume: {{ content_lv }}

n

Filesystem: XFS

n n n dest: /var/www/html/storage.htmln owner: apachen group: apachen mode: "0644"n ```nn5. **安装所需的 Ansible collection** 以进行 LVM 管理。nn ```bashn ansible-galaxy collection install community.generaln ```nn6. **执行存储管理 playbook**。nn ```bashn ansible-playbook -i inventory.ini storage.ymln ```nn 这将创建 LVM 结构、文件系统和挂载点。nn7. **创建一个 playbook 来收集和显示存储信息**。nn ```bashn nano get-storage.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Gather storage informationn hosts: webserversn become: truen tasks:n - name: Gather disk factsn ansible.builtin.setup:n gather_subset:n - hardwarenn - name: Display volume group informationn ansible.builtin.command:n cmd: vgdisplay apache-vgn register: vg_infon changed_when: falsenn - name: Display logical volume informationn ansible.builtin.command:n cmd: lvdisplay apache-vgn register: lv_infon changed_when: falsenn - name: Display filesystem informationn ansible.builtin.command:n cmd: df -h /var/www /var/log/httpd /backupn register: fs_infon changed_when: falsenn - name: Display mount informationn ansible.builtin.command:n cmd: cat /proc/mountsn register: mount_infon changed_when: falsenn - name: Show volume group detailsn ansible.builtin.debug:n var: vg_info.stdout_linesnn - name: Show logical volume detailsn ansible.builtin.debug:n var: lv_info.stdout_linesnn - name: Show filesystem usagen ansible.builtin.debug:n var: fs_info.stdout_linesnn - name: Show fstab entriesn ansible.builtin.command:n cmd: grep apache-vg /etc/fstabn register: fstab_entriesn changed_when: falsen failed_when: falsenn - name: Display fstab entriesn ansible.builtin.debug:n var: fstab_entries.stdout_linesn ```nn8. **执行存储信息收集 playbook**。nn ```bashn ansible-playbook -i inventory.ini get-storage.ymln ```nn 这将显示有关已创建存储结构的详细信息。nn9. **手动验证存储配置**。nn ```bashn ## 检查 LVM 结构n sudo vgs apache-vgn sudo lvs apache-vgn sudo pvs /dev/loop0n n ## 检查文件系统n df -h /var/www /var/log/httpd /backupn n ## 检查挂载点n mount | grep apache-vgn n ## 检查 fstab 条目n grep apache-vg /etc/fstabn n ## 测试 Web 内容n cat /var/www/html/storage.htmln ```nn10. **创建一个存储扩展 playbook** 来演示扩展操作。nn ```bashn nano expand_storage.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Expand storage volumesn hosts: webserversn become: truen vars:n volume_group: apache-vgn content_lv: content-lvn tasks:n - name: Extend content logical volumen community.general.lvol:n vg: "{{ volume_group }}"n lv: "{{ content_lv }}"n size: 400mn state: presentnn - name: Extend XFS filesystemn community.general.filesystem:n fstype: xfsn dev: "/dev/{{ volume_group }}/{{ content_lv }}"n resizefs: yesnn - name: Display updated filesystem sizen ansible.builtin.command:n cmd: df -h /var/wwwn register: new_sizen changed_when: falsenn - name: Show new filesystem sizen ansible.builtin.debug:n var: new_size.stdout_linesn ```nn11. **测试存储扩展**。nn ```bashn ## 在扩展前检查当前大小n df -h /var/wwwn n ## 运行扩展 playbookn ansible-playbook -i inventory.ini expand_storage.ymln n ## 验证扩展n df -h /var/wwwn sudo lvs apache-vg/content-lvn ```nn你已成功使用 Ansible 自动化了 LVM 存储管理,包括物理卷创建、逻辑卷管理、文件系统创建和挂载点配置。n","need_verify":true,"has_solution":false},{"position":5,"title":"自动化网络配置和信息收集","layout":"doc-workbench-split","text":"## 自动化网络配置和信息收集nn在最后一步中,你将学习如何使用 Ansible 自动化网络接口配置和收集全面的系统信息。这完成了从软件到存储再到网络的系统管理自动化的完整流程。nn你将使用诸如 `ansible.builtin.template` 用于网络配置文件,收集网络事实,以及创建全面的系统报告等模块。nn1. **导航到新的项目目录以进行网络管理。**nn ```bashn cd ~/projectn mkdir system-networkn cd system-networkn ```nn2. **创建本次实验的 inventory 文件**。nn ```bashn cat << EOF > inventory.inin [webservers]n localhost ansible_connection=localn EOFn ```nn3. **创建一个全面的网络和系统信息收集 playbook**。nn ```bashn nano network_info.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Gather comprehensive system informationn hosts: webserversn become: truen tasks:n - name: Gather all system factsn ansible.builtin.setup:nn - name: Create system report directoryn ansible.builtin.file:n path: /tmp/system_reportsn state: directoryn mode: "0755"nn - name: Generate system information reportn ansible.builtin.template:n src: system_report.j2n dest: /tmp/system_reports/system_info_{{ ansible_facts['hostname'] }}.htmln mode: "0644"nn - name: Generate network configuration reportn ansible.builtin.template:n src: network_report.j2n dest: /tmp/system_reports/network_info_{{ ansible_facts['hostname'] }}.htmln mode: "0644"nn - name: Collect network interface informationn ansible.builtin.command:n cmd: ip addr shown register: ip_infon changed_when: falsenn - name: Collect routing informationn ansible.builtin.command:n cmd: ip route shown register: route_infon changed_when: falsenn - name: Collect DNS configurationn ansible.builtin.command:n cmd: cat /etc/resolv.confn register: dns_infon changed_when: falsenn - name: Display network summaryn ansible.builtin.debug:n msg: |n System: {{ ansible_facts['hostname'] }}n OS: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}n Kernel: {{ ansible_facts['kernel'] }}n Default IPv4: {{ ansible_facts['default_ipv4']['address'] | default('N/A') }}n Default Interface: {{ ansible_facts['default_ipv4']['interface'] | default('N/A') }}n Total Memory: {{ ansible_facts['memtotal_mb'] }}MBn CPU Cores: {{ ansible_facts['processor_vcpus'] }}n ```nn4. **创建模板目录和文件以用于报告**。nn ```bashn mkdir templatesn nano templates/system_report.j2n ```nn 为系统报告模板添加以下内容:nn ```htmln n n n System Report - {{ ansible_facts['hostname'] }}n n n n
n

System Report for {{ ansible_facts['hostname'] }}

n

生成时间:{{ ansible_date_time.date }} {{ ansible_date_time.time }}

n
nn
n

System Information

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n
PropertyValue
Hostname{{ ansible_facts['hostname'] }}
FQDN{{ ansible_facts['fqdn'] }}
Operating Systemn {{ ansible_facts['distribution'] }} {{n ansible_facts['distribution_version'] }}n
Kernel{{ ansible_facts['kernel'] }}
Architecture{{ ansible_facts['architecture'] }}
CPU Cores{{ ansible_facts['processor_vcpus'] }}
Total Memory{{ ansible_facts['memtotal_mb'] }}MB
Uptime{{ ansible_facts['uptime_seconds'] }} seconds
n
nn
n

Storage Information

n n n n n n n n n {% for mount in ansible_facts['mounts'] %}n n n n n n n n {% endfor %}n
Mount PointFilesystemSizeUsedA vailable
{{ mount.mount }}{{ mount.fstype }}n {{ (mount.size_total / 1024 / 1024 / 1024) | round(2) }}GBn n {{ ((mount.size_total - mount.size_a vailable) / 1024 / 1024 /n 1024) | round(2) }}GBn n {{ (mount.size_a vailable / 1024 / 1024 / 1024) | round(2) }}GBn
n
nn
n

Services Status

n n n n n n n n n n n n n n n n n n
ServiceStatus
httpdn {{ ansible_facts.services['httpd.service']['state'] |n default('not installed') }}n
sshdn {{ ansible_facts.services['sshd.service']['state'] |n default('unknown') }}n
NetworkManagern {{ ansible_facts.services['NetworkManager.service']['state'] |n default('unknown') }}n
n
n n n ```nn5. **创建网络报告模板**。nn ```bashn nano templates/network_report.j2n ```nn 添加以下内容:nn ```htmln n n n Network Report - {{ ansible_facts['hostname'] }}n n n n
n

Network Configuration Report

n

Host: {{ ansible_facts['hostname'] }}

n

生成时间:{{ ansible_date_time.date }} {{ ansible_date_time.time }}

n
nn
n

Network Interfaces

n n n n n n n n n {% for interface_name in ansible_facts['interfaces'] %} {% ifn interface_name != 'lo' %} {% set interface_facts =n ansible_facts[interface_name] %}n n n n n n n n {% endif %} {% endfor %}n
InterfaceIPv4 AddressIPv6 AddressMAC AddressStatus
{{ interface_name }}n {{ interface_facts.get('ipv4', {}).get('address', 'N/A') }}n n {{ interface_facts.get('ipv6', [{}])[0].get('address', 'N/A') ifn interface_facts.get('ipv6') else 'N/A' }}n {{ interface_facts.get('macaddress', 'N/A') }}n {{ interface_facts.get('active', false) | ternary('Active',n 'Inactive') }}n
n
nn
n

Default Gateway

n n n n n n n n n n n n n n n n n n
PropertyValue
Default IPv4 Addressn {{ ansible_facts['default_ipv4']['address'] | default('N/A') }}n
Default Interfacen {{ ansible_facts['default_ipv4']['interface'] | default('N/A')n }}n
Default Gatewayn {{ ansible_facts['default_ipv4']['gateway'] | default('N/A') }}n
n
nn
n

DNS Configuration

n n n n n {% for dns in ansible_facts['dns']['nameservers'] %}n n n n {% endfor %}n
DNS Servers
{{ dns }}
n
n n n ```nn6. **创建一个网络接口配置 playbook**。nn ```bashn nano configure_network.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Configure network settingsn hosts: webserversn become: truen tasks:n - name: Install NetworkManager if not presentn ansible.builtin.dnf:n name: NetworkManagern state: presentnn - name: Ensure NetworkManager is runningn ansible.builtin.service:n name: NetworkManagern state: startedn enabled: yesnn - name: Configure hosts file with system informationn ansible.builtin.lineinfile:n path: /etc/hostsn line: "{{ ansible_facts['default_ipv4']['address'] }} {{ ansible_facts['hostname'] }}.lab.example.com {{ ansible_facts['hostname'] }}"n regexp: ".*{{ ansible_facts['hostname'] }}.*"n backup: yesnn - name: Create network monitoring scriptn ansible.builtin.copy:n content: |n #!/bin/bashn ## Network monitoring script generated by Ansiblen echo "=== Network Status Report ==="n echo "Generated at: $(date)"n echon echo "=== Interface Status ==="n ip addr shown echon echo "=== Routing Table ==="n ip route shown echon echo "=== DNS Configuration ==="n cat /etc/resolv.confn echon echo "=== Network Connectivity Test ==="n ping -c 3 8.8.8.8n dest: /usr/local/bin/network-status.shn mode: "0755"nn - name: Create network information gathering cron jobn ansible.builtin.cron:n name: Network status monitoringn job: "/usr/local/bin/network-status.sh >> /var/log/network-status.log 2>&1"n minute: "*/15"n user: rootn cron_file: network-monitoringn state: presentn ```nn7. **执行网络信息收集 playbook**。nn ```bashn ansible-playbook -i inventory.ini network_info.ymln ```nn 这将生成全面的系统和网络报告。nn8. **执行网络配置 playbook**。nn ```bashn ansible-playbook -i inventory.ini configure_network.ymln ```nn 这将配置网络设置和监控。nn9. **查看生成的报告**。nn ```bashn ## 列出生成的报告n ls -la /tmp/system_reports/n n ## 查看系统报告(你也可以在浏览器中打开)n cat /tmp/system_reports/system_info_*.htmln n ## 检查网络监控脚本n cat /usr/local/bin/network-status.shn n ## 测试网络监控脚本n sudo /usr/local/bin/network-status.shn n ## 检查网络监控 cron 作业n sudo cat /etc/cron.d/network-monitoringn ```nn10. **创建一个最终的综合 playbook**,将所有学到的概念结合起来。nn ```bashn nano complete_system_setup.ymln ```nn 添加以下内容:nn ```yamln ---n - name: Complete system setup and configurationn hosts: webserversn become: truen vars:n admin_users:n - webuser1n - webuser2n tasks:n - name: Ensure all required packages are installedn ansible.builtin.dnf:n name:n - httpdn - lvm2n - NetworkManagern - cronien state: presentnn - name: Ensure all services are runningn ansible.builtin.service:n name: "{{ item }}"n state: startedn enabled: yesn loop:n - httpdn - NetworkManagern - crondnn - name: Generate final system status reportn ansible.builtin.template:n src: system_report.j2n dest: /tmp/final_system_report.htmln mode: "0644"nn - name: Display completion messagen ansible.builtin.debug:n msg: |n ============================================n RHEL System Administration Automation Complete!n ============================================nn Summary of configured components:n - Software: EPEL repository and packages installedn - Users: {{ admin_users | length }} administrative users createdn - Services: httpd, NetworkManager, and crond configuredn - Storage: LVM volumes and filesystems configuredn - Network: Interface configuration and monitoring set upn - Scheduling: Cron jobs and at tasks configurednn Reports a vailable at:n - /tmp/system_reports/n - /tmp/final_system_report.htmlnn Your RHEL system is now fully automated with Ansible!n ```nn11. **执行最终的综合设置**。nn ```bashn ansible-playbook -i inventory.ini complete_system_setup.ymln ```nn你已成功完成了使用 Ansible 对 RHEL 系统管理任务的全面自动化,涵盖了软件管理、用户管理、服务管理、存储配置和网络设置。nn12. **在 Web 浏览器中预览生成的报告**。nn 导航到报告目录:nn ```bashn cd /tmp/system_reportsn ```nn 使用 Python 启动一个临时 Web 服务器:nn ```bashn python -m http.server 8000n ```nn 要在浏览器中预览报告:nn 1. 点击顶部菜单栏的 **+** 按钮n 2. 选择 **Web Service**n 3. 输入端口号 **8000**n 4. 你现在可以在线查看生成的 HTML 报告了nn ![在 Web 浏览器中预览生成的报告](https://file.labex.io/namespace/df87b950-1f37-4316-bc07-6537a1f2c481/rhel/rh294/lab-automate-rhel-administration-tasks-with-ansible/zh/../assets/20250620-11-09-11-yQBOv1O7.png)nn Web 服务器将显示一个目录列表,你可以在其中点击 HTML 文件来查看由你的 Ansible playbook 生成的全面系统和网络报告。nn > **注意**: 查看完报告后,按 `Ctrl+C` 停止 Web 服务器。n","need_verify":true,"has_solution":false},{"position":6,"title":"总结","layout":"doc-fullscreen","text":"## 总结nn在本次综合实验中,你已经掌握了使用 Ansible 自动化关键的 Red Hat Enterprise Linux (RHEL) 管理任务。你从软件软件包管理开始,学习了如何配置仓库、管理 GPG 密钥以及在收集软件包事实以获取系统信息的同时安装软件包。这为在你的基础设施中实现一致的软件部署奠定了基础。nn接着,你进入了用户管理和身份验证环节,自动化了用户账户的创建、配置了基于 SSH 密钥的身份验证、设置了 sudo 权限,并加固了 SSH 配置。这建立了对企业环境至关重要的安全且标准化的用户访问策略。nn实验继续进行服务管理和任务调度,你学习了如何管理 systemd 服务、创建周期性的 cron 作业、使用 `at` 调度一次性任务以及配置系统启动目标。这些技能对于维护服务可用性和自动化例行维护任务至关重要。nn存储管理通过全面的 LVM 自动化进行了涵盖,包括物理卷创建、卷组管理、逻辑卷配置、文件系统创建和挂载点配置。你还学会了动态扩展存储卷,这对于可扩展的基础设施管理至关重要。nn最后,你完成了网络配置自动化和全面的系统监控。你学习了如何收集网络事实、配置接口、使用 Jinja2 模板创建详细的系统报告,以及设置自动监控脚本。这提供了系统状态管理和报告的完整图景。nn在整个实验过程中,你应用了基础设施即代码 (IaC) 原则,确保所有系统配置都是可复现的、版本可控的且可一致部署的。你现在已经掌握了自动化 RHEL 系统管理生命周期的技能,从初始部署到持续维护和监控。n","need_verify":false,"has_solution":false}
本文转载于:https://labex.io/zh/tutorials/ansible-automate-rhel-administration-tasks-with-ansible-590613 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注