展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 系统应用 > 使用 Ansible 自动化 RHEL 管理任务

使用 Ansible 自动化 RHEL 管理任务

{"position":0,"title":"介绍","layout":"doc-fullscreen","text":"## 介绍nn在本篇综合实验中,你将掌握使用 Ansible 自动化关键的 Linux 管理任务。在你掌握了文件管理的基础后,你将探索如何管理系统管理的完整生命周期,从软件安装到

本文目录
    {"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}
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用 自动化
    上一篇: Ansible Shell 模块
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。