红帽认证-EX358-备考指南-全-

红帽认证 EX358 备考指南(全)

原文:annas-archive.org/md5/62c61c88c67dd576ec940522394f40ae

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

本书探讨了 Red Hat Linux 服务器管理和自动化的世界,旨在帮助你在参加 EX358 认证考试时取得成功。它详细讲解了 Red Hat 列出的每个主要目标,帮助你全面准备,完成职业生涯中的这一重要步骤。

结合多年在 Red Hat 和 Linux 领域的经验,我将深入讲解你需要了解的不同应用,帮助你理解 Red Hat Enterprise Linux 和 Ansible 自动化。我在 Red Hat 工作超过 6 年,使用 Red Hat 系统已经超过 10 年。我拥有多项认证,包括 Red Hat 认证架构师,这一认证涵盖了多个 Red Hat 产品和领域。

本书将帮助你面对在测试环境中遇到的所有细节,并覆盖一些有用的领域,节省你的时间和精力,从而帮助你以优异的成绩完成认证考试。每个目标都被分解并以有意义的方式呈现,帮助你记住成功通过考试所需的知识。

本书适合谁阅读

本书适合那些希望提升职业发展的 Linux 系统管理员。它将帮助你掌握额外的技能,使你能够通过这项行业考试。在开始本书中的任务之前,你应当具备扎实的 Red Hat Linux 和 Ansible 自动化背景。

本书的内容

第一章块存储 – 学习如何在 Red Hat Enterprise Linux 上配置块存储,详细介绍了 iSCSI 配置中的块存储设置及其连接性。

第二章网络文件存储 – 扩展你对如何共享数据的知识,解释了 NFS 和 Samba 的设置,以及对共享驱动器的权限和连接性。

第三章自动化网络服务 – Red Hat Linux 网络概述,标志着开始使用 Red Hat Enterprise Linux 进行网络配置,如 IP 地址设置。

第四章链路聚合创建 – 创建自己的链路并掌握网络领域,解释了如何在 Red Hat Enterprise Linux 服务器上设置网络团队。

第五章DNS、DHCP 和 IP 地址配置 – 深入了解 Red Hat Linux 网络,详细介绍了如何从 Red Hat Enterprise Linux 服务器为基础设施提供 DNS 和 DHCP 服务。

第六章打印机和电子邮件 – 在 Linux 服务器上设置打印机和电子邮件服务,涵盖了如何设置打印服务以及空白电子邮件客户端。

第七章数据库 – 设置与使用 MariaDB SQL 数据库,教您如何使用 MySQL 命令在 Red Hat Enterprise Linux 服务器上安装、保护和配置 MariaDB。

第八章Web 服务器和网络流量 – 学习如何创建和控制流量,讲解了如何安装和配置 Apache 与 Nginx web 服务器。我们还会讲解如何控制连接到我们基础设施的 web 服务器的流量。

第九章全面回顾与考试测试题,提供了一些示例问题,让我们可以将全书所学内容应用到实际中。

第十章帮助通过考试的小窍门和技巧,介绍了一些简单的窍门和技巧,可以帮助您节省时间,并提高您在考试中的成功率。

要想最大化地利用本书

在阅读本书之前,您应该具备 Red Hat Enterprise Linux 的工作知识,并且应该有使用 Ansible 自动化编写剧本的经验。如果没有这些技能,这本书和考试可能会让您感到有些困难。

本书涉及的软件/硬件 操作系统要求
Ansible 2.9 Red Hat Enterprise Linux 8.1
VirtualBox OSX 或 Windows

您需要从您的工作区连接互联网,以便下载所需的软件。您还需要使用 VirtualBox 来跟随实验室布局,并理解如果偏离布局,可能会有所不同。您还需要为 Red Hat 设置开发者许可,相关说明见第一章

如果您使用的是本书的数字版,建议您自己输入代码,或者从本书的 GitHub 仓库访问代码(链接将在下节提供)。这样可以帮助您避免与代码复制和粘贴相关的潜在错误。

您需要有运行 Red Hat Enterprise Linux 的经验,并且熟悉 Ansible 自动化。建议您有这些系统和应用的实际经验,以便更容易跟随和理解考试内容。

下载示例代码文件

您可以从 GitHub 下载本书的示例代码文件,链接为github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide。如果代码有更新,GitHub 仓库中的代码会随之更新。

我们还提供了其他来自我们丰富的图书和视频目录中的代码包,您可以在github.com/PacktPublishing/查看。赶紧去看看吧!

下载彩色图片

我们还提供了包含本书中截图和图表的彩色 PDF 文件。您可以在此下载:packt.link/Yrj1x

使用的约定

本书中使用了许多文本约定。

文本中的代码:表示文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入以及 Twitter 用户名。例如:“请记住,您的/etc/hosts文件将根据您的 IP 地址有所不同。”

代码块设置如下:

tasks:
    - name: Install Samba and Samba-Client
      package:
        name:
          - samba
          - samba-client
          - cifs-utils
        state: latest

任何命令行输入或输出均按如下方式书写:

$ ssh-keygen

粗体:表示新术语、重要词汇或屏幕上显示的词语。例如,菜单或对话框中的词汇通常以粗体显示。示例如下:“选择编辑 连接。”

提示或重要注意事项

如下所示。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果您对本书的任何内容有疑问,请发送电子邮件至 customercare@packtpub.com,并在邮件主题中注明书名。

勘误:尽管我们已尽最大努力确保内容的准确性,但错误仍有可能发生。如果您发现本书中的错误,我们将非常感激您向我们报告。请访问www.packtpub.com/support/errata并填写表单。

盗版:如果您在互联网上发现我们作品的任何非法复制形式,我们将非常感激您提供相关的网址或网站名称。请通过版权@packtpub.com 与我们联系,并附上相关材料的链接。

如果您有兴趣成为作者:如果您在某个领域有专业知识,并且有意写书或参与书籍的编写,请访问authors.packtpub.com

分享您的想法

阅读完《红帽认证服务管理与自动化 EX358 考试指南》后,我们希望听到您的想法!请点击这里直达 Amazon 评论页面并分享您的反馈。

您的评论对我们和技术社区都很重要,帮助我们确保提供优质内容。

下载本书的免费 PDF 副本

感谢您购买本书!

您喜欢在旅途中阅读,但无法随身携带纸质书籍吗?

您的电子书购买是否与您选择的设备不兼容?

别担心,现在购买每本 Packt 书籍时,您将免费获得该书的无 DRM PDF 版本。

随时随地,任何设备上都能阅读。您可以直接将代码从您喜爱的技术书籍中复制并粘贴到您的应用程序中。

优惠不止于此,您还可以获得独家折扣、新闻通讯和每日发送到您邮箱的精彩免费内容。

按照这些简单的步骤获取福利:

  1. 扫描二维码或访问以下链接

https://packt.link/free-ebook/9781803235493

  1. 提交您的购买凭证

  2. 就是这样!我们将直接通过电子邮件发送您的免费 PDF 和其他福利

第一部分:Red Hat Linux 8 —— 使用自动化配置和维护存储

在本部分中,您将学习如何手动和自动设置与维护块存储和文件存储。这将满足通过 Red Hat EX358 考试的目标。

本部分包含以下章节:

  • 第一章块存储——学习如何在 Red Hat 企业版 Linux 上配置块存储

  • 第二章网络文件存储——扩展您对数据共享方式的知识

第一章:块存储—在 Red Hat 企业版 Linux 上学习如何配置块存储

Red Hat Enterprise Linux (RHEL) 中的块存储构成了许多核心应用程序的基础。你将在 Linux 的多个领域中使用它,从应用程序开发、备份到 OpenStack 等基础设施的部署,使用 互联网小型计算机系统接口 (iSCSI) 等技术。通过了解何时使用块存储而非其他存储选项,以及如何通过手动步骤配置它并通过 Ansible 实现自动化,你将能够掌握日常使用 Linux 所需的知识,同时确保你理解为满足 EX358 考试需求而必备的构建模块。这些课程不仅可以帮助你成功完成 EX358 考试,还能让你更好地理解为什么在某些实际场景下我们使用块存储而非其他文件系统。

当你在公司搭建基础设施、在家庭实验室进行学习,或为你一直想创办的初创公司提供服务时,这将非常方便。本章结束时,你将能够通过 Red Hat 的最佳实践手动和通过 Ansible 自动化方式配置块存储,以满足 Red Hat 的要求。这将使你在拥有有效合同的情况下获得 Red Hat 的支持,同时,如果没有 Red Hat 支持,也能通过社区获得帮助,以解决你在使用该技术过程中可能遇到的任何问题。

在本章结束时,你将能够配置 iSCSI 启动器,手动和通过 Ansible 自动化启动它们,并且在完成后安全地拆除不再使用的 iSCSI 块存储版本。这将确保你完全理解块存储在你的生态系统中的整体生命周期和有效性。

在本章中,我们将覆盖以下主要内容:

  • iSCSI 块存储—概述它是什么以及我们为何需要它

  • iSCSI 块存储—手动配置和部署

  • iSCSI 块存储—Ansible 自动化剧本的创建与使用

技术要求

在深入讨论这些主题之前,你需要设置一些必要的东西。让我们看看它们是什么。

设置 GitHub 访问权限

你需要一个免费的 GitHub 账户,以便访问本书中提供的部分代码。请在 github.com/ 注册一个免费账户。我们将在本书中使用以下仓库中的代码:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-。我们将利用该代码库(也称为 repo)中 ch1 文件夹中的代码片段进行 iSCSI 自动化实践练习,代码位置如下:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter01。这里的代码将帮助你检查自己的工作,确保在编写 Ansible 剧本时走在正确的轨道上。请记住,这些代码是一个人编写并经过测试的剧本,能够满足考试目标;然而,编写成功剧本的方式有很多种,也能达到这些目标。

设置你的实验环境

所有 VirtualBox 和编码演示将会在 macOS 上展示,但也可以在 Windows 和 Linux 操作系统上执行。我们将设置一些 iSCSI 块设备。首先,你需要一台能够运行 VirtualBox 的计算机,并且内存足够支持运行你的计算机和三个虚拟机,每个虚拟机需要 2 GB 内存,一个 10 GB 硬盘和一个 5 GB 硬盘,这意味着每个虚拟机需要 15 GB 的硬盘空间,具体可以参考以下截图:

图 1.1 – VirtualBox 部署布局

图 1.1 – VirtualBox 部署布局

这主要是针对存储实践实验室,你可以为练习还原到一个 10 GB 的硬盘。RHEL 8.1 需要至少 9.37 GB 的空间才能运行。使用 Red Hat 开发者账户(developers.redhat.com/),你可以访问真实的 Red Hat 软件来提升你的技能以及设置所需的软件:

图 1.2 – 注册很简单!

图 1.2 – 注册很简单!

因为考试是基于 RHEL 8.1 设置的,我建议你使用这个版本进行学习,以获得最真实的考试环境。在以下截图中,你应该下载的正确版本是第一个选项:

图 1.3 – 考试和你的正确版本

图 1.3 – 考试和你的正确版本

这在整本书中都适用,包括最后的综合评审和实验。在安装操作系统之前,你可以在 VirtualBox 中从设置中创建一个第二硬盘,如下图所示:

图 1.4 – 为你的虚拟机创建第二个硬盘

图 1.4 – 为你的虚拟机创建第二个硬盘

你还需要确保为网络的 附加到 选项选择 桥接适配器 模式。混杂模式 选项也是允许的,这样它就可以连接到互联网和其他适配器。需要注意的是,桥接模式通过 Wi-Fi 并不总是稳定,因此如果你是以这种方式搭建实验环境,尽量确保你有有线连接:

图 1.5 – 带有混杂模式选项的桥接适配器

图 1.5 – 带有混杂模式选项的桥接适配器

在这里,你可以挂载已下载的 ISO 并开始安装:

图 1.6 – 挂载之前下载的 RHEL DVD ISO

图 1.6 – 挂载之前下载的 RHEL DVD ISO

你需要牢记一些最佳实践。我们将安装 带图形用户界面的服务器 选项。确保为自己创建一个管理员账户,并保留 root 账户,因为出于安全考虑以及良好的习惯,你希望使用 sudo 而不是直接使用 root 来执行所有操作。以下的用户创建界面允许你设置 root 密码和任何你希望创建的用户:

图 1.7 – 管理员账户是最佳实践;总是优先使用 sudo 而不是 root

图 1.7 – 管理员账户是最佳实践;总是优先使用 sudo 而不是 root

接下来,你需要使用 Red Hat 开发者账户的登录信息,并使用账户凭证对虚拟机进行授权。请参考以下截图,了解如何正确应用 Red Hat 订阅许可证:

图 1.8 – 需要 Red Hat 开发者凭证或有效的 Red Hat 账户

图 1.8 – 需要 Red Hat 开发者凭证或有效的 Red Hat 账户

你可以创建一台机器,然后将其克隆为你需要的另外两台。确保选择生成新的 MAC 地址并做完整克隆,以确保没有重叠导致网络或存储问题,如下图所示:

图 1.9 – 新的 MAC 生成和虚拟机新名称的完整克隆

图 1.9 – 新的 MAC 生成和虚拟机新名称的完整克隆

接下来,我们将设置主机文件,使用 example.com 域名,以便正确地进行不同系统之间的路由。你需要在服务器上使用命令行来获取 IP 地址,然后去每个设备并使用相同的信息设置主机文件:

图 1.10 – rhel1.example.com 系统的主机名和 IP

图 1.10 – rhel1.example.com 系统的主机名和 IP

接下来,使用以下命令收集主机名或将其更改为你想要的名称,并查看此情况下的输出,应该是rhel1.example.com

[emcleroy@rhel1 ~]$ sudo hostnamectl set-hostname rhel1.example.com
[emcleroy@rhel1 ~]$ hostname
 rhel1.example.com

使用主机名和 IP 地址构建主机文件的清单。完成后,确保关闭系统以永久保存更改。接下来,你将需要使用以下命令在所有三台虚拟机的主机文件中添加这些内容:

$ sudo vi /etc/hosts

下面是完成的/etc/hosts文件示例:

图 1.11 – 完成的文件

图 1.11 – 完成的/etc/hosts文件

请记住,你的/etc/hosts文件会根据你的 IP 地址有所不同。现在你应该能够通过主机名和 IP 地址互相 ping 通所有不同的虚拟机:

图 1.12 – 工作网络环境示例

图 1.12 – 工作网络环境示例

接下来,为了方便使用,我们将为我们的用户账户设置无密码的 sudo,这里我的用户名是emcleroy

我们将从运行以下命令开始:

$ sudo visudo

接下来,我们将定位到以下截图中高亮显示的代码行,并添加高亮显示的文本。还要注意,如果你允许管理员,可以简单地取消注释#,将其放在%wheel行前面:

图 1.13 – 高亮显示的文本行,需要添加并将你的用户名替换为我的用户名

图 1.13 – 高亮显示的文本行,需要添加并将你的用户名替换为我的用户名

你需要为所有三台服务器执行此操作。

最后,我们将在服务器之间添加 SSH 密钥,以便实现快速连接,这样每次从一台服务器登录到另一台服务器时,我们就不必输入密码。从你的rhel1虚拟机开始,使用以下命令生成 SSH 密钥:

$ ssh-keygen

只需保持默认设置,不断按Enter,然后一旦密钥生成,你需要执行以下操作:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub username@server

这将把密钥推送到各个服务器,并允许所有服务器进行双向通信。你需要为所有三台服务器执行这个操作,所以你将做以下操作(包括当前所在的服务器,以确保密钥被推送到所有服务器的已知主机文件中):

$ ssh-copy-id -i ~/.ssh/id_rsa.pub emcleroy@rhel1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub emcleroy@rhel2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub emcleroy@rhel3

从这里开始,你可以完全访问运行 RHEL 8.1、并为本次 iSCSI 实践练习配置了额外硬盘的三台虚拟机实验室。唯一的小差异出现在网络实践实验中,我们将讨论如何添加额外的网络接口控制器NICs)进行网络团队配置。这将是你需要了解的另一个话题,以便顺利通过EX358考试。

恭喜你!你已经成功地设置了实验环境。为自己鼓掌,休息一下。接下来我们将讨论构建 iSCSI 块设备并使用它们的手动步骤。然后,我们将测试你刚刚构建的实验环境,亲身体验这项技术。

iSCSI 块存储——它是什么,为什么我们需要它

有许多关于块存储,特别是 iSCSI 的知识需要了解。iSCSI 是一种存储区域网络SAN)协议,它允许设备或设备的部分被终端设备视为块存储。SAN 是 iSCSI 连接到网络的方式,并使其能够提供网络逻辑单元号LUNs)。这使得系统可以像使用物理硬盘一样使用这些块设备,可以从中启动、保存文件,或者像在普通计算机中使用硬盘那样使用它们。考虑到这一点,我们需要考虑一些因素。

首先,你必须确保你的网络可以无阻塞地处理连接,因为拥堵会导致系统变慢,甚至可能落后于你正在进行的操作,进而让用户感到沮丧。了解这一点后,你需要非常谨慎地规划你的 SAN,并妥善地将块存储网络配置到一个通常不加密的网络设置上,该网络应满足最低 10 GB 的速度要求,在许多情况下速度可以更高。这可以确保你在不遇到头疼问题的情况下顺畅使用存储,避免作为系统管理员时遇到的麻烦。如果你将其放置在与局域网(LAN)流量相同的网络上,并且期望流媒体用户(别在工作时做这个!)在观看视频的同时,依然能够通过从 SAN iSCSI 块存储设备托管的机器进行工作。另一个要记住的事情是,你需要确保正确使用firewalld语法,并遵循 SELinux 协议,以允许在启动时建立连接,否则你将得到一个巨大的纸重物,几乎什么也不会发生。

当你在使用targetcli配置 iSCSI 时,有几个主要事项需要考虑,我将详细介绍targetcli,因为它是我们在 RHEL 8.1 环境中使用 iSCSI 的工具集。你需要了解的主要内容包括启动器目标门户LUN访问控制列表ACL)和目标门户组TPG)。这些项目构成了 iSCSI 存储,并导致了很多误解。在我们深入探讨这些系统及其如何协同工作、通过网络向远程服务器提供块存储之前,让我们先测试一下你的知识。

测试你的知识

请回答以下问题:

  1. 在 iSCSI 服务器上,iSCSI 存储源是什么?

    1. 目标

    2. LUN

    3. iSCSI 合格 名称IQN

    4. ACL

  2. 用于标识启动器和目标的唯一全球名称是什么?

    1. 目标

    2. LUN

    3. IQN

    4. ACL

  3. 通常是软件基础的 iSCSI 客户端被称为:

    1. TPG

    2. 门户

    3. IQN

    4. 发起者

  4. 以下哪项是使用 IQN 的访问限制?

    1. 目标

    2. LUN

    3. IQN

    4. ACL

  5. 设置 RHEL 8.1 iSCSI 块存储时,最常用的软件是什么?

    1. firewalld

    2. SELinux

    3. targetcli

    4. networkd

  6. 要使 iSCSI 通过防火墙工作,需要允许哪个服务或端口?

    1. iSCSI-target

    2. 3260/UDP

    3. iSCSI

    4. targetcli

  7. 2020-06.com.mcleroy.www 包含什么?

    1. 目标

    2. LUN

    3. IQN

    4. ACL

  8. 为确保 iSCSI 在启动时自动启动,需要启用哪个系统?

    1. firewalld

    2. 目标

    3. targetcli

    4. networkd

答案:

  1. A. 目标

  2. C. IQN

  3. D. 发起者

  4. D. ACL

  5. C. targetcli

  6. A.iSCSI-target

  7. C. IQN

  8. B. 目标

iSCSI 块存储 – 手动配置和部署

我们将首先安装targetcli,并使用它设置 iSCSI,将基于块的存储提供给其他系统进行文件使用、引导系统等。这将展示在 RHEL 8.1 中实现的 iSCSI 块存储的广泛用途。然后我们将展示如何报废存储设备并在使用完资源后清理系统。

首先,我们将安装targetcli,以便在rhel1上使用 iSCSI 系统:

$ sudo dnf install targetcli -y

接下来,我们将启用系统启动 iSCSI 块存储。当系统启动或出现问题导致目标系统需要重启时,它将重新加载该服务,以确保存储持续运行:

$ sudo systemctl enable target

然后,我们将通过 firewalld 允许 iscsi-initiator,以确保其他服务器能够顺利访问块存储。我们还将重新加载防火墙,否则刚刚打开的端口将不会生效:

$ sudo firewall-cmd --permanent --add-service=iscsi-target
$ sudo firewall-cmd –reload

接下来,我们将使用刚刚安装的新服务——targetcli——创建网络块存储,以便与rhel2.example.com共享:

图 1.14 – targetcli 首次启动

图 1.14 – targetcli 首次启动

我们现在将为物理磁盘分区创建后端存储(backstores)。我们将创建类型为block的后端存储,以满足当前 iSCSI 系统的需求。这将允许持久文件系统,并且我们可以设置 LUN 的大小和安全性:

/> cd /backstores/block
/backstores/block> create blockstorage1 /dev/sdb
Created block storage object blockstorage1 using /dev/sdb.

接下来,我们将在 /iscsi 目录中创建一个 IQN,以便为块存储设备提供目标和目的地:

/backstores/block> cd /iscsi
/iscsi> create iqn.2022-05.com.example:rhel1
Created target iqn.2022-05.com.example:rhel1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> ls
o- iscsi ..................................... [Targets: 1]
  o- iqn.2022-05.com.example:rhel1 .............. [TPGs: 1]
    o- tpg1 ........................ [no-gen-acls, no-auth]
      o- acls ................................... [ACLs: 0]
      o- luns ................................... [LUNs: 0]
      o- portals ............................. [Portals: 1]
        o- 0.0.0.0:3260 .............................. [OK]

如前面的代码片段所示,已经为连接块存储后端存储创建了一个默认门户,并使用create命令为 IQN 创建。接下来,我们将为物理支持 iSCSI 块存储的存储需求创建一个 LUN:

/iscsi> cd /iscsi/iqn.2022-05.com.example:rhel1/tpg1/luns
/iscsi/iqn.20…sk1/tpg1/luns> create  /backstores/block/blockstorage1
Created LUN 0.

我们接下来需要的 iSCSI 组件是 ACL,以便允许流量成功到达我们的存储设备。我们需要暂时退出targetcli以查看发起者 IQN 的 Red Hat 名称。它可以在 /etc/iscsi/initiatorname.iscsi 中找到:

Global pref auto_save_on_exit=true
Configuration saved to /etc/
[emcleroy@rhel1 ~]$ vi /etc/iscsi/initiatorname.iscsi

以下是当前在下一张图片中使用的发起者名称示例:

图 1.15 – initiatorname.iscsi

图 1.15 – initiatorname.iscsi

我们将返回到 targetcli 并完成系统的准备工作,为使用块存储的系统设置我们选择的 ACL。

[emcleroy@rhel1 ~]$ sudo targetcli
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
> cd /iscsi/iqn.2022-05.com.example:rhel1/tpg1/acls
/iscsi/iqn.20...sk1/tpg1/acls> create iqn.2022-05.com.example:rhel2
Created Node ACL for iqn.2022-05.com.example:rhel2
Created mapped LUN 0.

接下来,我们将移除默认的门户,并在我们服务器的特定 IP 地址上创建一个新的门户:

> cd /iscsi/iqn.2022-05.com.example:rhel1/tpg1/portals
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20.../tpg1/portals> create 192.168.1.198 3260
Using default IP port 3260
Created network portal 192.168.1.198:3260.

最后,以下是您完成的块存储目标:

图 1.16 – iSCSI 块存储目标

图 1.16 – iSCSI 块存储目标

我们刚刚展示了如何配置 iSCSI 块存储以供使用。现在,我们将展示如何在您的系统中实际使用这些块存储。我们将从 rhel1.example.com 连接到 rhel2.example.com 并挂载、配置、使用它来移动和存储文件。因为我们可以通过这种方式增加远程服务器的存储容量,而不需要直接为服务器机架增加空间、电力或冷却。

我们首先需要做的是安装 iSCSI 工具,因为在考试中,您可能没有安装 带有图形界面的服务器

$ sudo dnf install iscsi-initiator-utils targetcli -y

这使我们能够接入之前创建的 iSCSI 块存储。接下来,我们将查找 rhel1192.168.1.198)上配置的目标(请注意:在您的实验室中,可能是不同的 IP 地址),并登录到它以确保连接性。从这里,我们需要在 /etc/iscsi/iscsid.conf 文件中设置登录信息,以便传递正确的登录信息,从而能够登录到存储设备:

$ sudo getent hosts rhel1

现在,我们将设置 InitiatorName 字段,以便使用以下命令向连接的服务器传递已知条目:

[emcleroy@rhel1 ~]$ sudo vi /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2022-05.com.example:rhel1
[emcleroy@rhel1 ~]$ sudo systemctl restart iscsid.service

请注意,您可以使用手册页面通过 man iscsiadm 命令深入了解 iscsiadm 命令集。在 rhel2 上,我们将使用 iscsiadm 命令进行可用块设备的发现。–m 标志指定模式,在本例中为 discovery–t 标志指定目标类型,在我们这里是 st,即 sendtargets,它告诉服务器发送 iSCSI 目标列表。–p 标志指定使用哪个门户,这是 IP 地址和端口的组合。如果没有提供端口,它将默认为 3260

[emcleroy@rhel2 ~]$ sudo iscsiadm -m discovery -t st -p 192.168.1.198:3260

请注意,前一个命令的输出将如下所示:

 192.168.1.198:3260,1 iqn.2022-05.com.example:rhel1

如您所见,我们有一个显示为可用的块设备。

我们将尝试登录到设备,您可以看到我们已经登录,并且设备已连接,如下所示:

[emcleroy@rhel2 ~]$ sudo iscsiadm -m node -T iqn.2022-05.com.example:rhel1  -p 192.168.1.198 -l

在上述代码中,我们使用 –m 标志选择 node 模式。我们使用 –T 标志指定目标名称。我们再次使用 –p 标志指定门户,默认端口为 3260。最后,我们使用 –l 标志告诉 iscsiadm 登录到目标。

接下来,我们将使用–m模式标志来检查会话,使用–P来打印信息级别为 3:

[emcleroy@rhel2 ~]$ sudo iscsiadm -m session -P 3
iSCSI Transport Class version 2.0-870
version 6.2.1.4-1
Target: iqn.2022-05.com.example:rhel1 (non-flash)
     Current Portal: 192.168.1.198:3260,1
     Persistent Portal: 192.168.1.198:3260,1

你可以看到我们有sdb,这是rhel2上的第二个驱动器,现在我们也有sdc

图 1.17 – sdc 驱动器现在已显示

图 1.17 – sdc 驱动器现在已显示

接下来,我们将对驱动器进行分区并用xfs格式化。这将使我们能够在启动时挂载系统,并保存持久文件。它可以用于从文件存储到操作系统或数据库的许多用途。首先,我们将把驱动器格式化为xfs

[emcleroy@rhel2 ~]$ sudo mkfs.xfs /dev/sdc
meta-data=/dev/sdc               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

然后,我们将使用以下命令获取 UUID,以便在fstab中使用,使其成为持久挂载,并在启动时自动挂载:

[emcleroy@rhel2 ~]$ lsblk -f /dev/sdc
NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sdc  xfs          38505868-00de-4269-88d8-3357a22f2101
[emcleroy@rhel2 ~]$ sudo vi /etc/fstab

这里,我们可以看到在fstab中添加的值的示例,已被高亮显示:

图 1.18 – 添加 iSCSI 块存储设备后的更新 fstab

图 1.18 – 添加 iSCSI 块存储设备后的更新 fstab

这是我们将新添加的 iSCSI 驱动器写入fstab的行。请注意,对于网络设备,我们传递了_netdev选项。接下来,我们将挂载系统以便于移动文件:

[emcleroy@rhel2 ~]$ sudo mkdir -p /data
[emcleroy@rhel2 ~]$ sudo mount /data
[emcleroy@rhel2 ~]$ df /data
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/sdc         5232640 69616   5163024   2% /home/emcleroy/data
[emcleroy@rhel2 ~]$ cd /data

挂载后,我们将进入新驱动器,创建一个文件夹和一个测试的.txt文件,并确保它能够保存,以下命令将会实现:

[emcleroy@rhel2 ~]$ sudo mkdir test
[emcleroy@rhel2 ~]$ cd test/
[emcleroy@rhel2 ~]$ sudo vi test.txt

接下来,我们将移除挂载,退出连接,并删除剩余的文件:

[emcleroy@rhel2 ~]$ cd
[emcleroy@rhel2 ~]$ sudo umount /data
[emcleroy@rhel2 ~]$ sudo iscsiadm -m node -T iqn.2022-05.com.example:rhel1 -p 192.168.1.198 -u
Logging out of session [sid: 8, target: iqn.2022-05.com.example:rhel1, portal: 192.168.1.198,3260]
Logout of [sid: 8, target: iqn.2022-05.com.example:rhel1, portal: 192.168.1.198,3260] successful.
[emcleroy@rhel2 ~]$ sudo iscsiadm -m node -T iqn.2022-05.com.example:rhel1 -p 192.168.1.198 -o delete

这部分关于手动设置 iSCSI 的内容到此为止。接下来是自动化部分。我们将在动手操作和书籍结尾的测验中详细讨论。我希望你和我一样享受这段旅程。

iSCSI 块存储 – Ansible 自动化剧本创建与使用

我们将通过首先安装和配置使用 Ansible 核心 2.9 来开始 iSCSI 块存储的自动化部分,因为这是 EX358 考试中使用的版本。我不会使用完全限定的集合名称FQCN),因为在 2.9 环境中它有时会导致错误,这可能会在考试过程中引发问题。我们希望尽一切可能避免这种情况,因此我们将使用经典的模块名称,并会在一定程度上解释它们的差异,以便你能够理解未来版本的 Ansible 中需要使用的内容。

首先,我们从服务器rhel3开始安装 Ansible 2.9,因为它将作为我们从yum 仓库中获取的工作站服务器。根据个人偏好,你可以将rhel1设为课堂服务器,rhel2rhel3设为测试服务器,但在我们的案例中,我们已经将rhel1设置为 iSCSI 服务器,并使用了rhel2

首先,我们将启用所需的仓库:

[emcleroy@rhel3 ~]$ sudo subscription-manager repos --enable ansible-2.9-for-rhel-8-x86_64-rpms
Repository 'ansible-2.9-for-rhel-8-x86_64-rpms' is enabled for this system.

接下来,我们将安装 Python 3:

[emcleroy@rhel3 ~]$ sudo dnf install python3 -y

然后,我们将安装 Ansible 2.9:

[emcleroy@rhel3 ~]$ sudo dnf install ansible -y

让我们检查并确保安装了正确版本的 Ansible:

[emcleroy@rhel3 ~]$ ansible --version
ansible 2.9.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/emcleroy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Oct 11 2019, 15:04:54) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)]

接下来,我们将开始使用Yet Another Markup LanguageYAML)Ansible 语言编写 playbook。这是一个简单的基于模块的功能,可以让您快速有效地编写 playbook,以完成您的任务。在编写这些 playbook 时,我建议使用一个好的编辑器。JetBrains 的 PyCharm 是我的首选,也是您看到我在其中编写 playbook 完成结果示例屏幕截图的编辑器。还请注意,完成的 playbook 可以在本书的 GitHub 存储库中找到,如每章节的技术要求部分所述。

首先,您将想要创建一个目录,用于运行 playbooks:

[emcleroy@rhel3 ~]$ mkdir iscsi_mount

一旦进入目录,我们将创建一个包含rhel1rhel2服务器的默认组的清单文件:

[emcleroy@rhel3 ~]$ cd iscsi_mount
[emcleroy@rhel3 ~]$ vi inventory
[defaults]
rhel1 ansible_host=192.168.1.198
rhel2 ansible_host=192.168.1.133
[iscsi_block]
rhel1 ansible_host=192.168.1.198
[iscsi_user]
rhel2 ansible_host=192.168.1.133

正如您所见,我添加了ansible_host和 IP 地址。这是为了在没有设置主机文件或名称不可 DNS 路由的情况下。我添加了包含所有主机的默认组,并有两个额外的组,允许我限制我的 playbook 所做的更改。这样,我可以告诉我的 playbook 使用iscsi_user组在rhel2上挂载存储。

接下来,我们将编写名为mount_iscsi.yml的块存储 playbook,并在展示该 playbook 后详细解释:

---
- name: Ensure /data is mounted from rhel1 iSCSI target that was created manually onto rhel2
  hosts: iscsi_user
  become: true
  become_method: sudo
  tasks:
    - name: the targetcli package is installed
      yum:
        name: targetcli
        state: present
    - name: the IQN is set for the initiator
      template:
        dest: /etc/iscsi/initiatorname.iscsi
        src: templates/initiatorname.iscsi.j2
        mode: '644'
        owner: root
        group: root
    - name: Create mount directory for /data
      file:
        path: /data
        state: directory
        mode: '0755'
    - name: Restart iscsiadm
      command:
        cmd: systemctl restart iscsid.service
    - name: Mount new drive
      command:
  cmd: iscsiadm -m node –T iqn.2022-05.com.example:rhel1  -p 192.168.1.198 -l

此实例的模块名称为yum,用于安装iscsi-initiator-utils包,该包将安装实用程序。接下来,我们有模块的不同标志,如dest:用于您 playbook 的templates文件夹中源文件的目标位置。在 playbook 目录中的模板文件夹位置,您将拥有文件/templates/initiatorname.iscsi.j2,其中包含传递给 playbook 的初始化程序名称的代码:

InitiatorName=iqn.2022-05.com.example:rhel1

您可以通过查看类似于 man 页的等效内容来了解您使用的每个模块的更多信息,如下所示:

[emcleroy@rhel3 ~]$ ansible-doc yum

您还可以使用以下命令列出文件,但请记住有数千个模块,因此请尽可能使用 grep 命令筛选名称:

[emcleroy@rhel3 ~]$ ansible-doc –-list

以下截图展示了不同模块的正常ansible-doc页面的外观:

图 1.19 – yum 模块文档页面示例

图 1.19 – yum 模块文档页面示例

我们将使用以下命令来运行ansible-playbook -i inventory mount_iscsi.yml -u emcleroy -k --ask-become –v剧本。这将从rhel3服务器执行,并对rhel2服务器进行更改。这结束了我们自动化挂载 iSCSI 块存储的方法。我们学到了一些关于 Ansible 的知识,从模块到模板的工作方式。在接下来的章节中,我们将更详细地了解 Ansible 及其所有内部工作原理,敬请期待。

摘要

这标志着第一章的结束,在这一章中,我们详细介绍了 RHEL 块存储、为测试目的设置实践环境,以及初步体验了 Ansible。在接下来的章节中,我们将深入探讨如何使用 Ansible,提供更多实例和实践练习,帮助你提升系统管理员的能力,并确保你通过EX358考试。在下一章,我们将继续深入探讨网络存储,讨论网络文件存储以及如何利用它在组织内部共享信息,从而提高工作效率。请继续与我一同前行,迈向你希望获得的EX358认证,这是我希望帮助你实现的目标。

第二章:网络文件存储 – 拓展你对如何共享数据的理解

在本章中,我们将介绍网络文件存储NFS)和通过服务器消息块SMB)存储的 Samba。它们是两种基于网络的文件共享选项。一种(NFS)在 Linux 中广泛使用,而另一种(SMB)则是 Windows 的主流,在我们的案例中是 Samba。我们将学习如何设置这两个目标文件夹,并与外界共享它们。我们还将确保这些共享文件夹仅对我们希望共享访问权限的人可用。我们会展示如何确保不发生未授权的访问——尽管我们会尽最大努力;毕竟,人们总是能找到一些巧妙的方法。

在我们手动设置好这些环境后,我们将通过自动化工具 Ansible 来设置它们。这可以极大地方便新服务器的配置,使其能够以自动化的方式访问每个新服务器所需的文件共享。这样可以确保每个新服务器都能获得必要的访问权限,而不必担心是否遗漏了某个文件夹。自动化帮助减少了系统管理员工作的头痛,使用 Ansible 后,操作变得更加简便。让我们一起进入 NFS 的世界,它只会让我们的生活更轻松。

本章将涵盖以下主题:

  • NFS 和 SMB 网络存储 – 它们的工作方式以及何时选择一个而非另一个

  • NFS 手动配置与部署

  • NFS Ansible 自动化剧本创建与使用

  • SMB 存储的手动配置与部署

  • SMB 存储 Ansible 自动化剧本创建与使用

技术要求

本节涵盖本章的技术要求。

设置 GitHub 访问权限

请参考第一章块存储 – 学习如何在 Red Hat Enterprise Linux 上配置块存储,以获取 GitHub 访问权限。你可以在以下链接中找到本章的 Ansible 自动化剧本:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter02。记住,这些是推荐的剧本,并不是唯一能够让剧本起作用的方法。

你可以使用 rawshellcmd 来改变配置以实现相同的结果,但我们展示的是实现目标的最佳方法。同时请注意,我们没有使用将来版本的 Ansible 所需的完全限定集合名称FQCN),因为该功能在考试中并不支持,考试所用的是 Ansible 2.9 版本。

设置 NFS 和 SMB 的实验环境

如果尚未完成,请参考第一章的实验环境设置,块存储 – 在 Red Hat Enterprise Linux 上学习如何配置块存储。你还可以利用这个机会创建你环境的快照,这样你就可以恢复到这些快照并一遍又一遍地进行实际操作练习。可以按以下步骤进行:

在 VirtualBox 中创建快照非常简单:只需点击下方按钮并用鼠标光标选中即可创建快照:

图 2.1 – VirtualBox 打开快照创建的选项按钮

图 2.1 – VirtualBox 打开快照创建的选项按钮

点击顶部的按钮进行拍摄,然后为你的快照命名。这将让你能够确定拍摄快照时机器镜像的状态。可以在下图中看到:

图 2.2 – VirtualBox 快照保存功能

图 2.2 – VirtualBox 快照保存功能

这将总结如何拍摄快照以便恢复到先前的状态,进行反复的实际操作。接下来,让我们进入存储战争。

NFS 和 SMB 网络存储 – 它们的工作方式以及何时选择其中之一而非另一个

NFS 是在 Linux 系统之间共享文件的一个好方法。它是基于机器的认证方式,因此系统可以让所有用户访问文件。这对于 Linux 系统共享小文件非常有用,因为它提高了速度,并且系统共享获取更高效。另一方面,SMB 是基于用户认证的,更适合与 Windows 计算机进行交互。所以,如果你有一个多厂商环境,设置 SMB 可能是值得的,因为它还支持打印机共享。这既允许文件共享,也允许打印机共享,从而在系统上增加了一些多功能性,弥补了略微的速度损失。

认证方式的差异带来了一些设置上的不同,也可能导致一些麻烦,特别是在确保正确锁定权限时。使用基于用户认证的 SMB 更好一些,因为在 NFS 中,任何拥有访问权限的机器都可以访问共享的文件。所以,实际上,在选择实现这两者中的任何一个时,更多的是取决于你所需要的,比如安全性或多厂商支持。在大多数情况下,实际上会为不同的系统使用需求实现两者。

让我们更深入地了解 NFS 以及它如何通过动手设置帮助 RHEL 8.1 用户和 Linux 系统整体。这将展示如何手动设置 NFS 以及通过自动化来设置。RHEL 8.1 支持 NFSv3 和 NFSv4。NFSv3 可以使用 UDP 和 TCP,而 NFSv4 只使用 TCP。旧版本不再受支持。让我们开始在系统上设置 NFS。

首先,如果还没有安装相关软件包,我们需要安装必需的软件包。这个软件包是 nfs-utils,它是客户端和目标机器所需的。它提供了所有访问文件夹和挂载所需的工具。通过在服务器和客户端上都安装它,你可以确保启用所有运行该服务所需的依赖项。

让我们安装如以下图所示的 nfs-utils

图 2.3 – 安装 nfs-utils 包

图 2.3 – 安装 nfs-utils 包

现在,有一个小陷阱可能会让人感到沮丧——相信我,在写这段内容并遇到问题时,我差点炸了!经过大量故障排除后,当前版本 2.3.3-51.el8 存在一个 bug,无法正确共享 exports 以及连接时的适当权限。所以,在安装 NFS 后,我们需要将其降级到 2.3.3-46.el8,该版本没有此问题。以下图所示,演示了如何降级:

图 2.4 – 降级 nfs-utils

图 2.4 – 降级 nfs-utils

这样我们就可以顺利进行实践操作了。之前,如果你尝试做这些操作,可能会像我一样对着键盘发愁。

安装正确版本后,我们将启用守护进程:

[emcleroy@rhel1 ~]$ sudo systemctl enable --now nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

然后,我们需要打开防火墙以确保连接畅通:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service=nfs
success
[emcleroy@rhel1 ~]$ sudo firewall-cmd --reload
Success

接下来,我们将配置 exports,exports 告诉 NFS 服务器哪些内容可以对外共享。设置非常细致,允许进行充分的控制。通过 exports,你可以告诉系统哪些内容可以被哪些机器读取。你可以通过 DNS、IP、IP 范围等方式指定允许访问的机器。

首先,让我们创建一个共享目录作为根目录:

[emcleroy@rhel1 ~]$ sudo su -
[root@rhel1 ~]# cd
[root@rhel1 ~]# mkdir -p /share/folder

这是我们要共享给外界的文件夹。其他用户将访问该文件夹来读取和写入文件。我们将编辑 /etc/exports 文件来共享该文件夹。

这里是一些正确格式化的exports文件的示例。我们将详细讨论以下截图中显示的设置,例如(rw):

图 2.5 – /etc/exports 示例文件用于 NFS 共享文件夹

图 2.5 – /etc/exports 示例文件用于 NFS 共享文件夹

如你所见,你可以通过 DNS 导出 NFS 共享。你也可以通过 IP 和 IP 范围进行导出。如果你不想堆叠多个共享位置,也可以使用空格分隔来指定多个共享位置。你还可以设置访问限制,例如只读或读写。no_root_squash 功能允许根用户访问目录,而不是选择 nobody 用户。默认情况下,如果根用户创建文件,nobody 用户将拥有该文件。这可能会导致访问文件时出现问题,因此建议使用 no_root_squash。这会为文件提供完全的 root 访问权限。请注意,以上是一个示例,NFS 会忽略类似的重复项。

图 2.6 – 正确的 NFS /etc/exports 文件

图 2.6 – 正确的 NFS /etc/exports 文件

然后,您需要运行exportfs -r以更新导出,使它们能够被端点提供服务:

[root@rhel1 ~]# exportfs -r
[root@rhel1 ~]#

然后,您可以检查您的导出,确保它们通过exportfs命令被提供服务:

[root@rhel1 ~]# exportfs
/share/folder   rhel2
/share/folder   rhel3
/share/folder   192.168.1.0/24
/share/folder   *example.com

接下来,我们将把文件夹挂载到另一台系统上,以便共享文件。

在 RHEL3 上,我们将运行mount命令来挂载文件系统。您也可以将其添加到fstab中以使其永久生效:

[root@rhel3 ~]# mkdir –p /share
[root@rhel3 ~]# mount -t nfs 192.168.1.198:/share/folder /share

这里也有一个 NFS 的fstab示例:

图 2.7 – fstab 的示例

图 2.7 – fstab 的示例

之后,您应该能够进入文件夹并添加共享文件。其他具有访问权限的系统也能看到这些文件。

这就是对 NFS 的讲解,以及如何手动将其导出到系统中。考试中将会考察这个内容。系统挂载的附加内容是为了帮助您理解,希望未来对您有所帮助。接下来,我们将讨论 NFS 服务器配置过程的自动化。

NFS Ansible 自动化 playbook 的创建和使用

我们将深入分析 Ansible 自动化 playbook,完全拆解 NFS 导出的过程。我们将展示 playbook 的每个步骤以及每个项的作用。这里所说的是指在 Ansible playbook 中设置的变量和命令:

---
- hosts: exports
  become: true
  become_method: sudo

这里是 playbook 的开头。主机是 playbook 的目标。这些通常是您希望进行更改的服务器,列在清单文件中。在这种情况下,我们的目标是exports组。become告诉 Ansible 您希望提升用户权限,而become_method则告诉它您希望使用sudo来提升权限:

  tasks:
  - name: Make sure Directory exists
    file:
      path: /share/folder
      owner: root
      state: directory

现在我们将进入任务部分。这些是我们希望 Ansible 执行的操作。我们在这里看到的第一个任务是使用文件模块创建一个目录。name字段就像是注释,帮助其他工程师更好地理解代码。从这里我们可以看到设置的其他项,接下来是默认值。如在第一章中提到的,块存储 – 学习如何在 Red Hat Enterprise Linux 上配置块存储,您可以使用ansible-doc文件查看用法和示例:

  - name: Install nfs utilities
    package:
      name: nfs-utils
      state: "2.3.3-46.el8"

通常,您会使用最新的状态;然而,在我们的情况下,这会导致系统遇到连接失败的 bug。不过在考试中使用最新状态应该没问题。

在此任务中,我们使用 Ansible 的通用包安装程序安装了nfs-utilities包。它使用 Ansible 收集的事实。通过使用这些事实,它知道使用dnf来安装软件:

  - name: the directory is shared
    copy:
      content: "/share/folder *(rw,no_root_squash)\n"
      dest: /etc/exports

使用copy模块,我们正在替换当前的exports文件。如果这是一个多行的 exports 文件,它将需要作为模板、lineinfile,或者所有行都需要包含在任务中。在这里,我们使用service模块来启用并启动nfs-server服务。这样可以确保服务被启动,并且在启动时服务会启用。服务也会加载 exports 文件,因为nfs-server是在更新exports文件后启动的:

  - name: Enable and Start NFS Service
    service:
      name: nfs-server
      state: started
      enabled: yes

使用firewalld模块,我们将为 NFS 文件服务永久开放。这样可以连接到我们选择共享的资源。完成后,exports剧本就完成了,接下来是clients剧本:

  - name: Open firewall for NFS-Server
    firewalld:
      service: nfs
      immediate: yes
      permanent: yes
      state: enabled

在完成创建剧本后,我们将使用ansible-playbook -i inventory nfs_server.yml -u emcleroy -k --ask-become -v命令来执行剧本。-i标志表示使用的清单名称。-u标志表示执行剧本时使用的用户名。–k标志表示要求输入用户密码。--ask-become标志表示您希望为剧本运行提供sudo密码。最后,–v显示更多详细信息,以便您可以看到剧本运行时发生的更多日志。

在这里,我们将展示一个快速查看用于支持客户端设置的剧本,该设置是利用已经为我们设置好的共享:

---
- hosts: clients
  become: true
  become_method: sudo
  tasks:
  - name: Install nfs utilities
    package:
      name: nfs-utils
      state: present
  - name: Add the NFS share and mount it with fstab
    mount:
      path: /share
      src: 192.168.1.198:/share/folder
      state: mounted
      fstype: nfs

这将安装nfs-utilities,然后将文件挂载到/share文件夹。

要运行剧本,我们将使用以下命令:ansible-playbook -i inventory nfs_client.yml -u emcleroy -k --ask-become -v。这标志着我们对 NFS 的初步探索的结束。接下来,我们将转向更多基于网络的文件存储。我们将讨论 SMB,它最常用于 Windows 系统。我们将介绍如何手动和通过自动化设置它。

SMB 存储手动配置与部署

当涉及到 SMB 时,主要的区别在于它是 Windows 系统与 Linux 系统之间的共享标准。学习 Samba(SMB 的另一个名称)最好的方式就是亲自操作,这正是我们今天要做的。我们将一步步介绍如何安装和配置 SMB。

首先,我们将通过dnf安装 SMB:

[emcleroy@rhel1 ~]$ sudo dnf install samba -y

然后,创建 SMB 的共享:

[emcleroy@rhel1 ~]$ sudo mkdir -p /share/smbfolder

接下来,我们将启动并启用 smb 服务:

[emcleroy@rhel1 ~]$ sudo systemctl enable --now smb
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.

然后,我们将打开 Samba 的防火墙服务:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service=samba
success
[emcleroy@rhel1 ~]$ sudo firewall-cmd  --reload
success

现在 SMB 已安装且防火墙已开放,我们可以继续设置我们创建的文件夹。这将允许我们设置所需的 SELinux 权限。我们将为管理员提供访问权限:

[emcleroy@rhel1 ~]$ sudo groupadd admins
[emcleroy@rhel1 ~]$ sudo chgrp admins /share/smbfolder/

这将允许我们仅将文件夹的访问权限限制为admins组。

在 SELinux 强制模式下,它需要正确的上下文。如这些命令所示,正确的上下文已添加回文件夹:

[emcleroy@rhel1 ~]$ sudo semanage fcontext -a -t samba_share_t "/share/smbfolder(/.*)?"
[emcleroy@rhel1 ~]$ sudo restorecon -Rv /share/smbfolder

这允许标签在 SELinux 重标记事件期间保持不变。SELinux 上下文超出了本课程的范围,可以通过在线研究或其他 Packt 书籍进一步了解。

接下来,我们将着手配置 smb.conf 文件,提供正确的信息以允许访问 share 文件夹:

[emcleroy@rhel1 ~]$sudo vi /etc/samba/smb.conf

从这里,你可以看到以下截图中展示的全局 Samba 配置部分和 Samba 共享配置部分示例:

图 2.8 – 允许访客的 SMB 全局配置

图 2.8 – 允许访客的 SMB 全局配置

接下来,我们有共享的访客允许设置,如下所示:

图 2.9 – 如“仅限访客”声明所示,允许访客访问

图 2.9 – 如“仅限访客”声明所示,允许访客访问

最后,下面是一个需要密码才能访问文件夹的示例:

图 2.10 – 如这里所示,guest only 设置为 no,因此你需要拥有一个用户和密码

图 2.10 – 如这里所示,guest only 设置为 no,因此你需要拥有一个用户和密码

这些设置可以控制你的smb共享。

接下来,我们将启动服务并创建一些用户。这些用户和密码仅适用于smb共享,不会影响登录信息:

[emcleroy@rhel1 ~]$ sudo adduser -M sambauser -s /sbin/nologin
[emcleroy@rhel1 ~]$ sudo smbpasswd -a sambauser
New SMB password:
Retype new SMB password:
Added user sambauser.

最后,我们将启动 smb,以便为我们新创建的 sambauser 提供服务:

[emcleroy@rhel1 ~]$ sudo systemctl start smb

在以下截图中,我们可以看到 smb 正在运行:

图 2.11 – SMB 在系统上成功运行

图 2.11 – SMB 在系统上成功运行

要挂载系统,我们需要在客户端机器上安装 samba-client。如以下截图所示,我们正在 rhel2 上安装 samba-client

图 2.12 – 在 rhel2 上安装 samba-client

图 2.12 – 在 rhel2 上安装 samba-client

这将允许我们在 rhel2 上挂载共享。我们需要安装 cifs-utils,然后可以使用以下命令挂载:

[root@rhel2 ~]# dnf install cifs-utils
[root@rhel2 ~]# mkdir –p /share/folder
[root@rhel2 ~]# mount -t cifs -o username=sambauser //192.168.1.198/smbshareconfig /share/folder

注意

这些代码和过程都可以通过由 Packt 提供的Code in ActionCiA)视频获取。

接下来,我们将介绍如何为特定域上的客户端设置受限共享。然后,我们将展示如何定义哪些用户/组具有只读或写入访问权限。最后,我们将展示如何使用特定的用户凭证永久挂载。

让我们从如何为特定域上的客户端设置受限共享开始。可以通过将安全性设置为 domain 级别而不是 user 级别来实现。这可以在以下代码片段中看到:

[global]
workgroup = SAMBA
security = domain

接下来,为了设置特定的组拥有读写权限,并允许其他用户仅具有只读权限,你需要设置 smb 文件,使共享的内容类似于以下内容,当 security 设置为 user 时:

[smbshareconfig]
path = /smb/smbfolder
valid users = systemadmin1, @engineers
write list = @engineers

前面的文件设置将允许systemadmin1具有只读权限,并允许engineers组具有读写权限,其他所有人将无法查看共享。

接下来,我们将了解如何使用 CIFS 凭据和fstab设置永久挂载,以便在启动时挂载共享。

我们将从创建一个 CIFS 凭据文件开始,如下所示:

[emcleroy@rhel1 ~]$ vi /tmp/creds.txt

这将包含以下内容:

username=smbuser
password=redhat

文件创建后,我们将使用它作为挂载的登录凭据,并将以下内容添加到fstab中,以使用这些凭据挂载共享:

//rhel1.example.com/smbshareconfig /mnt/shared cifs credentials=/tmp/creds.txt,multiuser 0 0

这就结束了 SMB 存储的手动配置部分。接下来,我们将处理自动化设置 SMB 存储所需的模板和其他内容。敬请期待更多关于如何通过自动化让它工作的重要信息。这也将帮助你完成 EX358 考试。

SMB 存储 Ansible 自动化剧本的创建和使用

在本节中,我们将探讨设置通过 Ansible 自动化配置 SMB 共享所需的内容。这将允许在多个服务器上更快速地设置。这样,你就可以将更多时间集中在真正想要学习的内容上,而不是键盘操作上。我们已经深入探讨了 Ansible 的各个方面,从注释到名称到模块。我们将再次回顾这些内容,讲解如何为 SMB 存储设置这些内容。这也是一种方法,Ansible 还有其他方法可以成功实现。

让我们像创建其他所有剧本一样开始。首先,我们将选择要使用的库存主机和升级点。我在前面章节中向你展示了如何设置库存,因此我们跳过这部分。不过,以下是库存的快照供你参考:

图 2.13 – smb_playbook 库存快照

图 2.13 – smb_playbook 库存快照

首先,让我们为剧本创建一个新目录:

[emcleroy@rhel3 ~]$ mkdir smb_playbook
[emcleroy@rhel3 ~]$ cd smb_playbook/
[emcleroy@rhel3 smb_playbook]$ vi smb_playbook.yml
---
- hosts: sambashare
  become: true
  become_method: sudo

接下来,我们将开始设置所有需要的 samba 任务。首先,彻底地安装它和客户端:

  tasks:
    - name: Install Samba and Samba-Client
      package:
        name:
          - samba
          - samba-client
          - cifs-utils
        state: latest

这部分代码创建了我们将用于在 SMB 上设置允许功能的组:

    - name: Create groups that are allowed
      group:
        name: "admins"
        system: yes

这部分代码为 SMB 创建带密码的用户。最终的复习中,我们将使用循环做不同的操作,这将使你能够管理密码和用户列表。由于所有内容都是明文的,这种方法不推荐使用。这个剧本是完成此更改的一种方法示例:

    - name: Add SMB user
      user:
        name: "smbuser"
        shell: "/sbin/nologin"
        create_home: no
        system: yes
    - name: Set SMB password for user
      command: smbpasswd -s -a smbuser
      args:
        stdin: "redhat\nredhat"

这部分代码将我们用于 SMB 的组添加到用户中:

    - name: Add SMB users to the groups that are allowed
      user:
        name: "smbuser"
        group: "admins"
        append: "true"

这里我们已经创建了目录并设置了正确的 SELinux 上下文:

    - name: Create the directory to share
      file:
        path: "/shared/smbfolder"
        owner: "root"
        group: "admins"
        mode: "2775"
        state: "directory"
        setype: "samba_share_t"

在这里,我们已将share文件夹的信息添加到smb.conf文件中:

    - name: Add the directory to the smb.conf file
      blockinfile:
        path: /etc/samba/smb.conf
        block: |
          [sambasharefolder]
                    path = /shared/smbfolder
                    writeable = yes
                    valid users = sambauser, @admins
                    write list = @admins

这部分代码启用 SMB 服务并重新启动它:

    - name: Start or restart SMB for changes and enable it
      service:
        name: "smb"
        state: "restarted"
        enabled: "true"

这部分代码开启了必要的防火墙规则:

    - name: Add firewall rules to allow connectivity out
      firewalld:
        service: "samba"
        state: "enabled"
        immediate: "true"
        permanent: "true"

然后,你可以使用以下命令在系统上运行 playbook:

[emcleroy@rhel3 smb_playbook]$ ansible-playbook -i inventory smb_playbook.yml -u emcleroy -k --ask-become-pass

这将要求你输入系统的 ssh 密码和 become 密码。请确保在 Ansible 控制节点(在我们的例子中是 rhel3)上安装了 sshpass,以避免密码失败。这些可以通过 Ansible Vault 处理,或者通过其他密码凭证系统处理,这些内容超出了本考试的范围。

接下来,我们将展示客户端侧的 playbook,以便挂载我们创建的新 SMB 共享。我们将按照以下方式创建一个新的 playbook:

---
- hosts: sambaclient
  become: true
  become_method: sudo
  tasks:
    - name: Install Samba and Samba-Client
      package:
        name:
          - samba
          - samba-client
          - cifs-utils
        state: latest
    - name: Create a credential txt file
      copy:
        content: "username=smbuser\npassword=redhat\n"
        dest: /tmp/creds.txt
        owner: "root"
        group: "root"
        mode: "0600"

这将创建一个包含你凭证的文件。你也可以将该文件加密,并使用变量:

    - name: mount directory created
      file:
        path: "/mnt/shared"
        state: directory
        owner: "root"
        group: "root"
    - name: Mount the SMB share.
      shell: "mount -t cifs //192.168.1.198/smbfolder/mnt/shared -o credentials=/tmp/creds.txt"

请注意,服务器的 IP 地址可能与您的实验室设置不同。

这将使用你提供的凭证挂载 SMB 共享。我们将在最终复习中探索其他方式来完成所有这些操作,复习视频将放在 Packt 网站上,视频将展示手动和自动化代码的运行。

总结

这将是本章和网络文件共享的结束。到目前为止,我们讨论了许多存储类型,从 iSCSI 到 SMB。它们都有一个共同点,那就是网络。接下来我们将介绍这些事物如何在网络方面互联。在下一章中,我们将确保大家了解 RHEL 网络的处理方式,了解它与传统网络(如 Cisco 等)的不同之处,以及它如何帮助你。我们还会回顾考试目标,确保你知道如何将这些服务器连接起来,以便通过我们讨论的存储部分。

第二部分:Red Hat Linux 8 – 使用自动化配置和维护网络

在这一部分,你将学习如何手动和自动设置和维护 Linux 网络功能。这将满足通过 Red Hat EX358 考试的目标。

这一部分包含以下章节:

  • 第三章使用自动化的网络服务 – Red Hat Linux 网络简介

  • 第三章链路聚合创建 – 创建你自己的链路并掌握网络领域

  • 第五章DNS、DHCP 和 IP 地址分配 – 深入了解 Red Hat Linux 网络

第三章:使用自动化进行网络服务 – 简介到 Red Hat Linux 网络

本章将向您介绍激动人心的 Red Hat 企业版 Linux 网络世界。我们将通过使用nmtui命令来设置网络接口的细节,这是打开视觉工具的主要选项。通过这些知识,您将开始理解您的服务器如何通过网络接口连接到外部世界。

后续章节将深入探讨其他可以用于自动设置的网络应用程序,例如域名系统DNS)和通过动态主机配置协议DHCP)获得 IP。在本章中,我们将展示如何设置静态和动态配置,并确保它们在服务器启动时启动。这将确保您在需要时始终有网络连接到世界各地。

在本章中,我们将涵盖以下主要内容:

  • 您 Linux 网络旅程的开端

  • 了解不同术语的含义及其如何应用于您所要达到的目标

  • 创建您的基本网络配置并上线,以便您可以启动应用程序

  • 使用 Ansible 自动化网络服务

技术要求

如果您希望获得系统的实际操作知识,请务必准备以下内容,以便跟随本章节。

设置 GitHub 访问权限

有关如何访问本书 GitHub 存储库的信息,请参阅第一章块存储 – 学习如何在 Red Hat 企业版 Linux 上提供块存储。您将在以下链接找到本章的 Ansible 自动化 playbook:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter03。请记住,这些是建议的 playbook,并不是唯一可以编写的方式,以使 playbook 适合您的方式。

你可以始终通过使用rawshellcmd来更改它们,以达到相同的结果,但我们正在展示实现目标的最佳方法。另外,请记住,在未来版本的 Ansible 中,我们不会使用需要的 FCQN,因为这不会成为考试的一部分,考试的内容是针对 Ansible 2.9 版本。

为网络设置您的实验室环境

如果尚未完成,请参考前几章的实验室环境设置。您也可以利用这个机会创建您环境的快照,以便可以重置环境并反复进行实际操作练习。这在第二章网络文件存储 – 扩展您分享数据知识的方式中有详细说明。

你的 Linux 网络之旅的开端!

在今天的世界中,没有比网络更重要的事情了。也许你没有意识到,但你无论走到哪里,总是连接着。这可以是你家里的互联网,也可以是你手机上的数据连接,或者是你当地咖啡店的 Wi-Fi。所有这些都运行在相互连接我们世界的网络上。这就是你能够访问 Google.com 或 Amazon.com 搜索或购买东西的原因。没有网络,所有这些都是不可能的,因为你无法到达你的目的地。在接下来的三章中,我们将深入讨论网络,但实际上,本书中所有内容都涉及到网络——从用于存储的 SAN 连接到连接数据库时。

了解不同术语的含义及其如何适用于你想要实现的目标!

我们将详细介绍许多不同的术语,首先是缩写,如ETH,代表以太网。这是将台式计算机连接到交换机或路由器的物理连接。这导致 ETH 用于连接到世界的方式,Internet ProtocolIP),或者可以将其视为通往世界的家庭地址的一部分。地址的另一部分是你的media access controlMAC)地址,这是你独特的硬件标识号,是物理 ETH 端口的一部分。将 IP 和 MAC 地址组合在一起,你能够以超过 1000 倍的速度像通过邮政服务发送和接收信息一样进行通信。首先,我们将手动和自动创建基本的互联网连接。

创建你的基本网络配置文件

在这里,我们将重点放在使你能够启动应用程序在线的过程上!首先,我们将通过网络脚本直接配置我们的接口。我们希望确定我们想要使用以下命令更改的接口名称:

[emcleroy@rhel1 ~]$ ip a

这完全展示在以下屏幕截图的命令输出中:

图 3.1 – IP 命令的输出显示接口

图 3.1 – IP 命令的输出显示接口

在我们的案例中,我们将操作 enp0s3 接口。这是主要接口,而其他的都是桥接接口,不是物理的。第一个接口是回环接口,用于本地服务器通信的本地主机连接。

接下来,我们可以进入 /etc/sysconfig/network-scripts/,在那里我们只会找到 ifcfg-enp0s3。这是 enp0s3 连接的接口配置。我们可以使用以下命令查看它:

[emcleroy@rhel1 network-scripts]$ vi ifcfg-enp0s3

命令的输出如下所示:

图 3.2 – /etc/sysconfig/network-scripts/ifcfg-enp0s3 配置

图 3.2 – /etc/sysconfig/network-scripts/ifcfg-enp0s3 配置

请注意,在进行任何更改之前,您应该先备份此文件。此外,注意您需要使用sudo命令提升权限,才能具有 root 权限来配置此文件:

[emcleroy@rhel1 network-scripts]$ sudo su
[root@rhel1 network-scripts]# cp ifcfg-enp0s3 ifcfg-enp0s3.old

在复制文件以进行备份后,您现在可以对接口配置进行更改:

[root@rhel1 network-scripts]# vi ifcfg-enp0s3

一个更改的例子是禁用 IPV6 DHCP,如下图所示:

图 3.3 – 对 ifcfg-enp0s3 配置文件所做的更改

图 3.3 – 对 ifcfg-enp0s3 配置文件所做的更改

这只是您可以更改的众多内容之一。您可以在测试过程中通过提供的文档了解您可以修改的所有内容。

其次,我们将使用/etc/sysconfig/network-scripts/ifcfg-enp0s3。请记住,nmcli 有一个文档齐全的手册man)页面,如下图所示:

图 3.4 – nmcli 命令的 man 页

图 3.4 – nmcli 命令的 man 页

本文档将为您提供控制接口所需的所有信息。让我们尝试更改我们的接口的 enp0s3 DNS,如上图所示。通过使用手册页面,我们可以看到需要使用的命令,正如下面截图所示的示例:

图 3.5 – 从 man 页中提取的必需的 nmcli 命令字符串示例

图 3.5 – 从 man 页中提取的必需的 nmcli 命令字符串示例

如您所见,我们可以使用以下命令将更改附加到 DNS:

[emcleroy@rhel1 ~]$ sudo nmcli con modify enp0s3 +ipv4.dns 4.4.4.4

此更改仅在接口的启动脚本中生效。现在,可以在网络脚本中看到此接口更改,如下图所示:

图 3.6 – nmcli 命令字符串添加 DNS3=4.4.4.4 的结果

图 3.6 – nmcli 命令字符串添加 DNS3=4.4.4.4 的结果

如果我们现在想进行接口更改,我们需要先关闭接口,然后再重新启动它。可以通过使用以下命令来完成,但请确保您通过带外管理OBM)连接到机器,因为如果这是您与服务器的 SSH 连接,您将失去连接:

[emcleroy@rhel1 ~]# sudo nmcli connection down enp0s3
[emcleroy@rhel1 ~]# sudo nmcli connection up enp0s3

接下来,我们将通过网络管理器文本用户界面nmtui)命令使用图形界面:

[emcleroy@rhel1 ~]# nmtui

运行nmtui命令的结果如下图所示:

图 3.7 – 调用的 nmtui 工具,首次展示的选项

图 3.7 – 调用的 nmtui 工具,首次展示的选项

选择编辑 连接

图 3.8 – 已存在且可以使用 nmtui 更改的接口

图 3.8 – 已存在且可以使用 nmtui 更改的接口

对于本练习,选择以太网 | enp0s3

如您所见,Profile name 与接口名称匹配。Device 字段通过 MAC 地址形式添加了另一个元素。Automatic 配置选项规定使用 DHCP 服务器自动获取 IP 地址。我们将在后续章节中详细讲解这一点:

图 3.9 – 使用 nmtui 显示网络接口和信息

图 3.9 – 使用 nmtui 显示网络接口和信息

在这里,您可以看到信息,我们的设置是手动配置的,以确保我们不会遇到 IP 地址更改,从而确保以下内容:

图 3.10 – 使用 nmtui 进行更改

图 3.10 – 使用 nmtui 进行更改

这里也是您设置网关或出站网络地址的地方,在我们的案例中是 192.168.1.1,以及 DNS 服务器。由于我们的路由器位于 192.168.1.1,并且也运行 AT&T 的 DNS,因此对我来说,首选 DNS 地址是它。我接着使用了一个知名的备份 DNS,例如 Google 的 8.8.8.8

在此,您可以设置其他内容,例如搜索域和特定路由。这些是一些更高级的内容,我们现在不需要覆盖。

在此界面中,您还可以设置 IPV6 信息,例如通过 DHCP 服务器自动获取或通过链路本地地址手动设置:

图 3.11 – 正确退出 nmtui 保存更改

图 3.11 – 正确退出 nmtui 保存更改

所有配置设置都符合我们的目的,如果发现不正确,稍后可以进行更改。只要确保按下 Num Lock 键(如有需要),否则将无法接受您的输入。

完成后,选择 OKCancel。我们将选择取消,因为这就是我们希望设置的界面配置。

接下来,如果您进行了更改,必须重置连接才能使更改生效。如果您有直接访问权限,可以返回到 nmtui 界面中的 Activate a connection 选项。此激活窗口在 nmtui GUI 截图中如下所示:

图 3.12 – 使用 nmtui 激活和停用已创建的网络接口

图 3.12 – 使用 nmtui 激活和停用已创建的网络接口

为此,选择 Deactivate 然后选择 Reactivate。只有在您有直接访问权限的情况下才能进行此操作;如果没有,您将失去与服务器的连接。如果您知道设置是正确的,或者希望它们正确(如果没有直接访问服务器的 OBM),还有另一种测试方法。就像使用 nmcli 时一样,我们可以重新利用之前学过的命令。必须以 root 用户身份运行此命令,以确保没有密码提示或其他问题阻止界面继续运行:

[emcleroy@rhel1 ~]$ sudo su –
[root@rhel1 ~]# nmcli networking off && nmcli networking on

请理解,建议始终提供远程现场支持或 OBM,在经历了不幸的遭遇并经过一段非常长的紧张车程后,您会明白这一点。

使用 Ansible 自动化网络服务

自动化设置接口的过程可以根据需要简单或复杂。我们的建议是从安装被称为 Red Hat 企业 Linux (RHEL) 系统角色的 ansible galaxy 系统角色开始,因为我们使用的是 RHEL 而不仅仅是任何 Linux 系统。这可以通过首先使用以下命令检查是否已经安装 ansible-galaxy 来实现:

[emcleroy@rhel3 ~]$ ansible-galaxy list
# /usr/share/ansible/roles
# /etc/ansible/roles

这确认网络角色丢失。运行以下命令安装角色:

[emcleroy@rhel3 ~]$ sudo dnf install rhel-system-roles

从此截图中可以看到,通过运行 $ ansible-galaxy list 命令,角色已成功安装:

图 3.13 – 安装系统角色后的屏幕界面

图 3.13 – 安装系统角色后的屏幕界面

您可以在以下位置找到关于不同系统角色或示例的说明:/usr/share/doc/rhel-system-roles-<version>/SUBSYSTEM/network 的命令如下所示:

[emcleroy@rhel3 network]$ cd /usr/share/doc/rhel-system-roles/network/

然后,您可以查看 README 或其他众多示例。README 如下所示:

图 3.14 – 您可以使用的 Playbooks 示例,以创建 Playbook 的骨架

图 3.14 – 您可以使用的 Playbooks 示例,以创建 Playbook 的骨架

现在我们可以为 Playbook 设置带有正确 IP 和 MAC 地址的清单。如果这些信息未知,我们可以设置其他内容。让我们从简单开始,仅仅添加 rhel1 的当前 IP,如下所示的步骤:

  1. 返回到主目录:

    [emcleroy@rhel3 network]$ cd
    
  2. 创建一个 Playbook 文件夹:

    [emcleroy@rhel3 ~]$ mkdir interface_playbook
    
  3. 进入 Playbook 文件夹的工作目录:

    [emcleroy@rhel3 ~]$ cd interface_playbook/
    
  4. 创建清单文件:

    [emcleroy@rhel3 interface_playbook]$ vi inventory
    

如下截图所示,我们拥有完整的清单,并且为 rhel1 创建了一个组:

图 3.15 – 为了精确定位变更,查看 Playbook 库

图 3.15 – 为了精确定位变更,查看 Playbook 库

接下来,让我们根据 /usr/share/doc/rhel-system-roles/network/ 目录中的一项内容编写一个 Playbook。让我们对 DNS 记录做一个更改。

首先,查看一个使用网络角色的 Playbook,因为这是我们首次接触这个内容,请展开查看 /usr/share/doc/rhel-system-roles/network/example-eth_simple_auto-playbook.yml。以下是相关的截图:

图 3.16 – 查看示例以了解如何设置 Playbook

图 3.16 – 查看示例以了解如何设置 Playbook

正如您在这里所看到的那样,它略有不同,因为我们正在布置变量,然后角色运行操作手册。 接受该结构并将其应用于您的操作手册。 您可以在以下屏幕截图中看到,我们已更改一些项目,例如主机和名称,以匹配我们的系统:

图 3.17 – 使用  中的示例启动操作手册

图 3.17 – 使用 /usr/share/doc/rhel-system-roles/network/ 中的示例启动操作手册

之后,继续查看 README.md 文件,以获取所需的变量。 通过探索 README.md 文件,您可以在底部获取示例,如以下持久连接的屏幕截图所示:

图 3.18 – 使用系统角色文档中的 README.md 文件获取更多信息

图 3.18 – 使用系统角色文档中的 README.md 文件获取更多信息

我们将获取该片段并放入我们的操作手册中,确保根据需要更改信息(如 MAC 和 IP 地址)。 我们将从系统中获取初始副本并对其进行调整,以满足我们的静态连接。 这将允许我们添加 DNS 值。 可以看到如下所示:

图 3.19 – 结合两个示例和服务器信息以创建完整的操作手册

图 3.19 – 结合两个示例和服务器信息以创建完整的操作手册

现在,所有的操作手册选项都已设置好,我们应该能够将界面更改合并,并且应该有新的 DNS 记录。 这是运行操作手册之前的记录:

图 3.20 – 验证更改未生效

图 3.20 – 验证更改未生效

接下来,我们将运行操作手册:

[emcleroy@rhel3 interface_playbook]$ ansible-playbook -i inventory dns_change.yml -u emcleroy -k --ask-become-pass

如您在以下屏幕截图中所看到的,它已成功完成且未出现任何问题,并显示了一个橙色的更改,这应该是我们的 DNS 条目:

图 3.21 – 运行操作手册

图 3.21 – 运行操作手册

现在我们可以检查 rhel1 的 DNS 记录,并查看它们是否已正确更改。 正如以下屏幕截图所示,更改已成功:

图 3.22 – 验证更改已生效

图 3.22 – 验证更改已生效

系统角色可以使用许多更改,不仅限于网络。 这些可以用于考试的其他部分,并提供可能需要的帮助。 因此,请记住我们之前安装的 /usr/share/doc/rhel-system-roles/,它作为一个包安装。

概要

这标志着我们迈入网络世界的第一步。我希望通过学习如何设置接口和改变你与世界的沟通方式,能在某种程度上帮助你成长。在本章中,你学会了如何手动和自动配置网络接口。这使你能够将你的服务器,进而你的应用程序,通过公共 IP 或私有 IP 连接到外部世界。使用像 nmtui 和 man 页这样的工具,使得配置这些值变得更加用户友好。我希望我们已经涵盖了你特别期待的内容。在下一章,我们将深入探讨如何使用链路聚合来工作。这种技术支持许多不同的流量行为,可以帮助你在日常工作中,或者像我在家庭实验室里那样设置故障转移。例如,如果我的主互联网连接断开,我的移动网络连接会自动接管,继续提供服务。接下来,我们将进入网络的更多令人兴奋的领域,学习很多新的东西。直到下章,记得深呼吸,并且要记住,这是一段旅程,需要一步一步走。同时,也不要忘记这些文档是考试的内容之一。不过,不要过于依赖它们,因为时间是关键,而且非常有限。

第四章:链路聚合创建 – 创建你自己的链路并掌握网络领域

网络团队技术对于高可用性HA)和提高吞吐量至关重要。HA 是通过正常的团队技术实现的,交换机不需要特殊配置。为了提高吞吐量,你需要在交换机上设置链路聚合控制协议LACP)。如果没有多个网络连接路径连接到互联网,你很容易就会遇到宕机问题。拥有多个连接路径,比如通过两个供应商分担电力,能大大增加你不会失去应用程序访问的机会,从而减轻一些担忧,避免应用程序因早期在 第三章 中学到的内容,使用自动化的网络服务 – Red Hat Linux 网络介绍,而掉线给你带来损失。

通过在高可用(HA)功能中利用网络团队技术,如果一个连接中断,连接性不会丧失。当正确设置时,例如让两个网络接口卡NICs)连接到不同的交换机,它可以提供容错能力。在交换机进行升级时,这也是必须的。如果没有冗余,当交换机进行维护时,你的连接就会中断。同样的情况也适用于将应用程序托管在单台服务器上的情况,但现在我们要讨论的是网络。

在本章中,我们将涵盖以下主要主题:

  • 了解链路聚合

  • 创建不同类型的链路聚合配置文件

  • 通过使用 Ansible 自动化简化链路聚合的设置

技术要求

本章的技术要求分为以下两部分。

设置 GitHub 访问权限

请参考 第一章块存储 – 学习如何在 Red Hat Enterprise Linux 上配置块存储,获取 GitHub 指令,你可以在以下链接找到本章的 Ansible 自动化剧本:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter04。请记住,这些是建议的剧本,并不是唯一的编写剧本的方式,你可以根据自己的需求来调整剧本。

你始终可以使用 raw、shell 或 cmd 来实现相同的结果,但我们将在此展示实现目标的最佳方法。同时请记住,我们并未使用将来版本的 Ansible 中需要的 FCQN,因为它在考试中不会被支持,考试是基于 Ansible 2.9 进行的。

为网络接口卡(NIC)团队设置实验环境

这至少需要在两个系统上完成,以便你可以测试不同的场景。我选择使用 Rhel1 和 Rhel2,因为 Rhel3 更像是我的工作站和 Ansible 控制站。这将在测试部分和本书的考试技巧部分变得更加明显。你可以在以下截图中找到设置 VirtualBox 接口的说明。

请确保先关闭你的虚拟机,如下所示:

图 4.1 – 关闭你的 VirtualBox 虚拟机

图 4.1 – 关闭你的 VirtualBox 虚拟机

然后,选择设置,如下所示:

图 4.2 – 修改 VirtualBox 虚拟机的设置

图 4.2 – 修改 VirtualBox 虚拟机的设置

然后,我们将选择网络并添加适配器 2,如下所示:

图 4.3 – 添加第二个网络适配器

图 4.3 – 添加第二个网络适配器

我们将确保新适配器的设置如下:

图 4.4 – 第二个网络适配器的设置

图 4.4 – 第二个网络适配器的设置

最后,我们将添加一个第三个适配器,如下所示:

图 4.5 – 添加带有正确配置的第三个和最后一个网络适配器

图 4.5 – 添加带有正确配置的第三个和最后一个网络适配器

增加两个适配器的原因是,在不使用虚拟机的正常启动(会打开 GUI)的情况下,保持 SSH 连接。如果使用的是无头虚拟机启动(不打开 GUI),则需要这种配置。

了解链路聚合

Teamd 负责网络团队的控制。它使用运行器来实现这一目的。teamd 运行器的列表可以在此处找到:access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/configuring-network-teaming_configuring-and-managing-networking。然而,我们将重点关注以下几种:

运行器类型 描述
lacp 该运行器使用 802.3ad LACP。
loadbalance 端口使用哈希函数来尝试在端口之间达到负载均衡。
activebackup 一个端口设置为活动,另一个端口作为故障转移的备份。
roundrobin 在这种状态下,端口以轮询方式使用。

表 4.1 – 一些链路聚合配置文件类型

对于此任务和创建网络团队,我们将再次使用nmcli工具,正如我们在第三章中所做的那样,网络服务自动化 - Red Hat Linux 网络

使用网络接口团队有许多理由——如冗余、额外的吞吐量等。根据公司需求和所设置的交换机,你甚至可以深入到多个团队。例如,将两个 LACP 对放入轮询模式,以增加带宽,同时引入容错。许多大公司需要确保他们的应用程序始终可用,以便从中获取收益,通过学习如何构建网络团队,你成功的机会将大大增加。

创建不同类型的链路聚合配置

请注意,实验室设置中的接口可能与我的不同——它们是 enp0s8 和 enp0s9。我们需要确保在设置团队时这些接口处于关闭状态。这将取决于你的实验室环境,并且不应选择在启动时连接这两个接口。我们将首先通过以下命令展示接口连接状态以及设备状态:

[emcleroy@rhel1 ~]$ nmcli connection show

输出结果可以在以下截图中看到:

图 4.6 – 网络接口连接,包括虚拟和物理接口

图 4.6 – 网络接口连接,包括虚拟和物理接口

接下来,我们将开始创建名称为bond1的团队。我们将使用以下命令:

[root@rhel1 emcleroy]# nmcli connection add type team con-name bond1 ifname bond1 team.runner activebackup

以下截图展示了这一点:

图 4.7 – 创建名称为 bond1 并使用 activebackup 的完整团队命令

图 4.7 – 创建名称为 bond1 并使用 activebackup 的完整团队命令

让我们进一步解析我们刚才看到的截图。首先,nmcli是用于创建团队的工具。connection add的代码片段显示我们正在添加一个新连接,type显示我们正在创建一个team。连接名称(con-name)是你为其指定的名称,可以自行选择。接口名称(ifname)——在此示例中为bond1——是你为接口指定的名称。team.runner是你创建的团队类型;在我们的例子中,我们使用的是activebackup,这意味着一个接口正在传输流量,另一个则在故障切换时待命。这可能是由于人工干预或接口失去连接所致。

然后需要物理接口来启动团队。我们正在使用附加命令,并在团队创建后对其进行修改。这使我们能够将接口作为从属设备添加到团队中。我们将使用以下命令:

[root@rhel1 emcleroy]# nmcli connection add type team-slave con-name bond1-enp0s8 ifname enp0s8 master bond1
[root@rhel1 emcleroy]# nmcli connection add type team-slave con-name bond1-enp0s9 ifname enp0s9 master bond1

以下截图展示了这些命令:

图 4.8 – 将物理接口添加到虚拟团队

图 4.8 – 将物理接口添加到虚拟团队

如我们在前几章所学,连接到外部世界还需要其他项目。我们将使用以下命令来完成此更改:

[root@rhel1 emcleroy]# nmcli connection modify bond1 ipv4.addresses 192.168.1.233/24
[root@rhel1 emcleroy]# nmcli connection modify bond1 ipv4.gateway 192.168.1.1
[root@rhel1 emcleroy]# nmcli connection modify bond1 ipv4.dns 192.168.1.1
[root@rhel1 emcleroy]# nmcli connection modify bond1 ipv4.method manual

这在以下截图中有所说明:

图 4.9 – 向团队添加所需的额外配置

图 4.9 – 向团队添加所需的额外配置

最后,我们希望确保在重启后,接口能够自动恢复,以便你在考试中不丢分。我们将使用这个命令来确保接口在重启后自动恢复:

[root@rhel1 emcleroy]# nmcli connection modify bond1 connection.autoconnect yes

以下截图展示了这一点:

图 4.10 – 确保连接在重启后持续存在

图 4.10 – 确保连接在重启后持续存在

你可以运行以下命令来启动连接,并确保你的团队正常运行:

[root@rhel1 emcleroy]# nmcli con up bond1
[root@rhel1 emcleroy]# nmcli device status

在以下截图中,我们可以看到设备状态:

图 4.11 – 显示团队设备状态和团队接口

图 4.11 – 显示团队设备状态和团队接口

以下命令展示了你的团队的外观、连接情况以及当前活跃的接口:

[root@rhel1 emcleroy]# teamdctl bond1 state

该命令的输出如以下截图所示:

图 4.12 – 团队信息以及当前活跃的端口

图 4.12 – 团队信息以及当前活跃的端口

请记住,如果你无法访问服务器的图形界面,在大多数情况下,你可以安装一个图形界面,但这将在后续章节中讨论。在考试期间,你可以使用nm-connection-editor命令启动配置工具。如下所示:

图 4.13 – 启动命令

图 4.13 – 启动命令

启动命令后,你将看到一个可以控制的图形界面。这允许你选择一个团队并创建所有所需的项目,而无需记住步骤。首先,选择一个团队,如下所示:

图 4.14 – 从下拉菜单中选择团队

图 4.14 – 从下拉菜单中选择团队

接下来,你将开始为团队设置正常信息。如以下截图所示,你将设置团队名称:

图 4.15 – 命名团队及团队接口

图 4.15 – 命名团队及团队接口

设置团队名称后,你将选择哪些物理接口或虚拟接口将成为新团队的一部分。如下所示:

图 4.16 – 选择要加入团队的接口

图 4.16 – 选择要加入团队的接口

你甚至可以为添加到团队的接口设置不同的选项。对于我们的目的,我们不做任何更改,只需将其添加。如下所示:

图 4.17 – 在从属接口级别设置接口设置

图 4.17 – 在从属接口级别设置接口的配置

你可以看到添加两个接口(或你希望添加到团队中的任意数量的接口)后的结果。如下所示:

图 4.18 – 两个接口被添加到团队后的状态

图 4.18 – 两个接口被添加到团队后的状态

最后,我们可以设置接口的 IP、网关、DNS 等。这使得我们能够确保该团队现在能够连接到外部世界。如下截图所示:

图 4.19 – 设置与外界通信所需的信息

图 4.19 – 设置与外界通信所需的信息

这就结束了手动配置的方式。接下来,我们将通过使用 Ansible 自动化来简化操作。通过自动化,我们可以反复实现相同的结果,同时降低人为错误的可能性。这在不断重复执行此类任务时特别有帮助。

使用 Ansible 自动化解除设置链路聚合的烦恼

现在,我们都知道自动化可以帮助我们节省时间和精力。它还可以确保我们的工作一致性,这在做网络工作时尤其重要。我们可以建立多个不同的剧本来设置不同的内容,或者我们可以使用变量。在这种情况下,我们将使用变量,因为它们是最容易修改的。有了变量,你可以轻松地更改不同的设置,同时只需一个剧本。一个例子是,当你需要在使用轮询(round-robin)和负载均衡(load balancing)之间进行选择时,这个变量可以确保一切设置正确。配合其他变量,如 IP 地址和网关,你可以只写一个剧本,剩余的部分则由变量填写。

让我们开始编写一个使用变量的网络团队配置剧本。这些是回答剧本中需要完成工作的系列项。

然后,我们会添加每个 Ansible 剧本开头的常规代码。这包括我们将在剧本中使用的来自清单的主机。它还包括我们如何提升权限,以便进行修改。这是个人偏好,你可以选择开启。下面是剧本开头的初始内容,和前几章中的示例相同:

---
- name: Automated Teaming Setup
  hosts: rhel1
  become: true
  become_method: sudo

完成初始设置后,我们将添加下一步,启动网络团队功能。这将包括为不同的接口选择一个变量。还将包含用于 IP 地址的变量,连同网关和 DNS 信息。它还将包括一个变量,用来设置我们将要进行的团队类型。这将包括使用一个角色,就像我们在 第三章 中所做的那样,网络服务自动化 – Red Hat Linux 网络介绍

  vars:
    network_connections:
      - name: bond1
        state: up
        type: team
        interface_name: bond1
  roles:
    - rhel-system-roles.network

安装 rhel-system-roles.yml 文件后,你可以通过访问 /usr/share/doc/rhel-system-roles/network/example-team_simple-playbook.yml 来查看该角色的手册页面以及它是如何工作的,安装方法是使用 dnf install rhel-system-roles -y。这将展示你需要在 playbook 中填写的变量,以确保系统角色正确运行:

图 4.20 – Rhel 系统角色网络团队示例

图 4.20 – Rhel 系统角色网络团队示例

从这里,我们可以使用从示例中收集的信息来构建剩余的 playbook。我们将输入额外的变量,这些变量将在 playbook 目录中的变量文件中被调用,而不是直接使用原始值。

这是剩余的 playbook 代码,以确保 playbook 能够成功运行,然后我们将在 playbook 代码后查看变量文件和层级结构,确保 playbook 能正确读取变量。以下是相应的代码片段:

  vars:
    network_connections:
      - name: "{{ team_name }}"
        state: up
        type: team
        interface_name: "{{ team_name }}"
        ip:
          address:
            - "{{ ipv4_team_address }}"
            - "{{ ipv6_team_address }}"
      - name: member1
        state: up
        type: ethernet
        interface_name: "{{ int1 }}"
        controller: "{{ team_name }}"
      - name: member2
        state: up
        type: ethernet
        interface_name: "{{ int2 }}"
        controller: "{{ team_name }}"
  roles:
    - rhel-system-roles.network

这个 playbook 现在将自动创建网络团队的构建。然后我们将创建变量文件,以回答我们创建的变量,比如 team_name

---
team_name: team1
ipv4_team_address: 192.168.1.233/24
ipv6_team_address:  fe80::9029:1a51:454:c2bd/64
int1: enp0s8
int2: enp0s9

这使我们能够回答变量,但保持 playbook 的模糊性,使其可以用于多种不同的用途,而不是一次性完成的方式。我们将把这个文件放在与 playbook 同一目录的 vars 文件夹中,并命名为 rhel1_team_vars.yml。我们还需要将其添加到 playbook 中的 vars list,这样 playbook 就知道从哪里获取信息:

  vars_files:
    - "{{ playbook_dir }}/vars/rhel1_team_vars.yml"
  vars:
    network_connections:
      - name: "{{ team_name }}"
        state: up
        type: team
        interface_name: "{{ team_name }}"
        ip:
          address:
            - "{{ ipv4_team_address }}"
            - "{{ ipv6_team_address }}"
      - name: member1
        state: up
        type: ethernet
        interface_name: "{{ int1 }}"
        controller: "{{ team_name }}"
      - name: member2
        state: up
        type: ethernet
        interface_name: "{{ int2 }}"
        controller: "{{ team_name }}"
  roles:
    - rhel-system-roles.network

现在,我们可以查看 playbook 文件夹的布局,其中包含清单、vars 文件和 playbook:

图 4.21 – 这显示了 playbook 目录的层级结构

图 4.21 – 这显示了 playbook 目录的层级结构

对于这个 playbook,清单将仅仅是 rhel1.example.com,位于 defaults 下,但在你的实验室设置中可能会有所不同。设置完成后,我们将查看接口设置,先是设置前,然后是 playbook 执行后的情况。

在这里,你可以看到在我们运行 playbook 之前,并没有配置任何团队:

图 4.22 – 当前配置的接口连接

图 4.22 – 当前配置的接口连接

在看过前面的连接后,我们接下来将运行命令ansible-playbook –i inventory team_network_interface.yml -u emcleroy -k --ask-become –v来执行 playbook,并查看已创建的团队:

图 4.22 – 在这里,你可以看到团队已被创建

图 4.22 – 在这里,你可以看到团队已被创建

正如你在本节中所学到的,Ansible 自动化可以使网络团队的设置变得轻而易举。除了为其他更重要的项目节省时间外,Ansible 自动化还降低了人为错误的风险。这使得用户可以放心,每台服务器上的配置将保持一致,从而加速故障排除并简化部署过程。

总结

在本章中,我们了解了网络团队。我们讨论了它如何用于高可用性(HA)和提高吞吐量的优势。我们致力于确保你理解使用网络团队的价值,以及它在生产环境中的重要性。当你有多个路径时,例如,你可以在不影响正在运行的应用程序的情况下,关闭交换机进行维护。这些只是网络团队的一些优势,实际上还有更多。在下一章中,我们将进一步探索 Rhel 8 的网络领域,讨论 DNS、DHCP 和 IP 的更多细节。我们将学习如何设置它们,并使服务器能够提供如 DNS 和 DHCP 等功能。休息一下,接下来我们将准备好进入更多有趣的网络内容。

第五章:DNS、DHCP 和 IP 地址配置 – 深入了解 Red Hat Linux 网络

在本章中,我们将深入探讨网络配置。我们将讨论 192.168.1.10,网关地址为 192.168.1.1,而在 DHCP 的情况下,IP 信息由 DHCP 服务器提供,系统通过握手机制获取连接子网的 IP、DNS 和网关信息。我们将在本章后面详细讨论静态地址配置和 DHCP 配置。我们还将设置一个 DHCP 服务器,通过手动和 Ansible 自动化提供 IP 配置信息。

接下来,我们将了解如何通过动态名称系统DNS)查找互联网上的其他地址,DNS 将完全限定域名FQDN)与 IP 地址关联。这将像 redhat.com 这样的地址转换为你的计算机可以通过 Web 浏览器或其他连接方式(如 Telnet 或 SSH)访问的 IP 地址。这一切都通过域名注册商来处理,DNS 将网站与 IP 地址(以及反向映射)关联。我们将手动并通过 Ansible 自动化设置一个 DNS 服务器。

在本章中,我们将覆盖以下主要内容:

  • 深入学习 Linux 网络配置,重点是 DNS、DHCP 和静态 IP 地址配置

  • 设置静态 IP 地址,以应对 DHCP 不可用时仍需确保服务可达的情况

  • 使用基本的开箱即用的 DHCP 配置,在网络上可用时快速联网

  • 了解 DNS 是什么以及为什么你需要了解它

本章的技术要求将在以下部分中介绍。

设置 GitHub 访问权限

请参考第一章块存储 – 学习如何在 Red Hat 企业版 Linux 上配置块存储,以获得 GitHub 的访问权限。你可以在以下链接找到本章的 Ansible 自动化剧本:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter05。记住,这些是建议的剧本,并不是唯一的写法,你可以根据需要调整剧本以适应你的情况。

你可以使用原始的、Shell 或 CMD 脚本来实现相同的结果,但我们展示的是实现目标的最佳方法。还要记住,我们没有使用未来版本 Ansible 所需的 FQCN,因为在考试中不会支持这一点,考试是针对 Ansible 2.9 版本进行的。

深入学习 Linux 网络配置,重点是 DNS、DHCP 和静态 IP 地址配置

到目前为止,我们简要地讨论了 Linux 网络及其对您的意义——为您的服务器、应用程序等提供访问权限,并在您和其他网络中获得访问。我们将基于接口的 IP 地址配置的初始设置,进一步扩展我们在本书中学到的内容。我们不仅会向您展示您的设备如何获取 IP、网关和 DNS 配置,还会展示如何将这些服务提供给您的服务器和应用程序。

首先,我们将讨论不同项的每个方面的重要性。您的 IP 地址就像您的家庭地址。您的网关就像通往世界的车道。DNS 就像您的 GPS,因为它显示了如何到达您的在线目的地。无论是通过 DHCP 自动配置,还是通过静态地址手动配置,所有这些内容的配置都是联网并到达目标所需的最低配置。

我们之前讨论过 IP 地址配置,以及如何通过接口配置手动进行静态地址配置。DHCP 也是如此;不过,您的系统会与另一个设备通信,以自动获取所需的上网信息。这些信息包括 DNS,它是您在互联网上寻找不同内容(如电子商务网站、新闻等)的 GPS。我们将在本章接下来的内容中深入探讨这些类别。

在没有 DHCP 的情况下,仍需设置静态 IP 地址以确保该服务可访问

这适用于您没有 DHCP 时,或需要始终确保使用相同地址的情况。此设置将提供 IP 地址、网关、DNS 和路由等信息;有时,您需要通过静态配置来启用系统。您会注意到,在以下截图中,系统确实获得了 DHCP 地址,但为了我们的目的,我们假设它获得了一个不正确的地址,而这个地址对于应用程序来说是必需的。我们将使用以下命令显示服务器的当前 IP 地址:

[emcleroy@rhel2 ~]$ ip a | grep enp0s3

以下截图显示了当前在服务器上配置的 IP 地址信息:

图 5.1 – 当前基于 DHCP 的 IP 地址配置

图 5.1 – 当前基于 DHCP 的 IP 地址配置

因此,为了解决这个问题,我们将使用nmtui命令将系统设置为静态配置,以获得一个图形用户界面(GUI)风格的界面,如下图所示:

图 5.2 – 使用 nmtui 命令启动的 GUI 界面

图 5.2 – 使用 nmtui 命令启动的 GUI 界面

在图形用户界面(GUI)中,我们将选择编辑连接选项。这将允许我们选择接口并手动设置适当的配置。选择该选项后选择正确的接口,详情请见下图:

图 5.3 – 选择“编辑连接”选项,并高亮显示正确的接口

图 5.3 – 选择“编辑连接”选项,并高亮显示正确的接口

选择正确的接口后,我们将选择手动(Manual)设置,以便打开所需的字段进行操作,如下图所示:

图 5.4 – 选择手动以打开以太网设置进行配置

图 5.4 – 选择手动(Manual)以打开以太网设置进行配置

然后,我们将为接口设置正确的配置。在某些情况下,这些信息可能需要从网络团队处获得。原因是你需要知道你的 DNS、网关和子网范围。作为服务器管理员,你可能不了解这些信息,这也是为什么在桌面使用时,DHCP 更受欢迎,因为它会自动填充这些字段。以下截图显示了将此接口启动并连接到网络所需的配置:

图 5.5 – 包含子网范围、网关和 DNS 的 IP 地址,用于所需的连接选项

图 5.5 – 包含子网范围、网关和 DNS 的 IP 地址,用于所需的连接选项

然后,你需要保存这些信息,退出nmtui图形界面,并运行以下命令:

[emcleroy@rhel2 ~]$ sudo ifdown enp0s3 && sudo ifup enp0s3

从命令的输出中,以下是来自服务器的截图:

图 5.6 – 重新加载接口的命令,以便获取你指定的新设置

图 5.6 – 重新加载接口的命令,以便获取你指定的新设置

如果你没有直接访问服务器的权限,可以通过 SSH 运行以下命令:

[emcleroy@rhel2 ~]$ sudo systemctl restart NetworkManager.service

在以下截图中,你可以看到命令的输出:

图 5.7 – 重新加载网络管理器的命令,以便获得新的静态设置

图 5.7 – 重新加载网络管理器的命令,以便获得新的静态设置

使用默认的 DHCP 配置,在网络中有可用的情况下快速连接

开箱即用的 DHCP 寻址将为你提供所需的 IP 地址,当物理连接到一个有路由器和 DHCP 服务器运行的网络时,系统会自动获取 IP 并连接到网络。这样你可以快速上线,而无需知道子网、网关或路由信息等连接设置。

使用 DHCP 来提供由外部源提供的初始接口连接

当您首次启动计算机并将其连接到网络时,默认情况下,大多数系统都配置为尝试使用 DHCP。此握手方法可以使互联网连接更快速且无需直接干预。例如,在 RHEL 中,当您安装时启动接口,系统会自动将配置设置为 DHCP。这是因为大多数用户都有一个提供服务的 DHCP 服务器。这意味着 DHCP 服务器与 RHEL 计算机之间会进行握手,以提供连接信息。此过程通过 DHCP Discover 消息或计算机或客户端服务器请求连接的方式进行。服务器回复 DHCP Offer 提供信息。客户端然后通过 DHCP Request 请求连接信息。最后,DHCP 服务器通过 DHCP Acknowledgement 响应,包含连接信息。以下图示展示了这一过程:

图 5.8 – DHCP 握手

图 5.8 – DHCP 握手

一旦从 DHCP 服务器获取信息,您的计算机将配置一个 IP 地址、网关和 DNS。这使您能够更快地在线,并且无需自己设置这些信息。在某些情况下,这种方式是必要的,因为您既没有所需的信息(例如,网络上哪些 IP 地址是空闲的),也不知道网关或 DNS 地址是什么。通过使用 DHCP,您可以可靠地连接到网络,避免冲突,并访问您的本地网络。

然而,在大多数企业环境中,您不会为应用服务器使用 DHCP 服务器,但在大多数情况下,您会为员工提供连接。大多数应用生产服务器通过静态配置或通过自动化使用下一个可用的应用 IP 设置。这就是为什么能够设置 DHCP 服务器如此重要,因为您希望员工能够轻松连接、登录并立即开始工作。知道有设置 DHCP 服务器的需求后,我们将以此为动力,设置一个 DHCP 服务器,以便为您的公司内部员工或您家中的家庭成员提供连接。

在 DHCP 服务器运行并具备连接能力的情况下,无论是通过物理以太网还是 Wi-Fi,您都可以按照以下步骤为设备设置 DHCP IP 地址。为此,您需要通过控制台或虚拟机管理器直接访问服务器。使用以下命令,您可以检查设备的 IP 地址:

[emcleroy@rhel2 ~]$ ip a | grep enp0s3

如以下截图所示,您的设备当前没有 IP 地址:

图 5.9 – 当前没有与连接的 enp0s3 接口关联的 IP 地址

图 5.9 – 当前没有与连接的 enp0s3 接口关联的 IP 地址

我们将再次使用nmtui,就像我们处理静态地址时一样,但这次我们将选择自动,即使用 DHCP,如下图所示:

图 5.10 – 在 nmtui 界面设置中选择自动选项

图 5.10 – 在 nmtui 界面设置中选择自动选项

选择nmtui后:

图 5.11 – 在 nmtui 中激活连接

图 5.11 – 在 nmtui 中激活连接

选择激活连接后,你需要选择物理连接的接口,如下图所示:

图 5.12 – 选择你之前设置的正确接口以启用连接

图 5.12 – 选择你之前设置的正确接口以启用连接

激活后,接口应该会启动并完成之前概述的 DHCP 握手,以获取建立网络连接所需的信息。使用以下命令,你可以查看自动获取的 IP 地址:

[emcleroy@rhel2 ~]$ ip a | grep enp0s3

自动获取的连接信息如下图所示:

图 5.13 – 网关的 IP 地址和路由

图 5.13 – 网关的 IP 地址和路由

我们刚刚设置了你的服务器或客户端机器,通过 DHCP 获取网络连接。通过自动化系统,你将能够快速在线,而无需担心手动配置任何设置。这对于那些不总是需要相同 IP 地址但只需要网络连接的设备来说是一个很大的优势。接下来,我们将讨论如何创建一个 DHCP 服务器来提供这种功能。

手动设置 DHCP 服务器配置以提供 DHCP 服务

在某些情况下,网络上可能没有设置 DHCP 服务器。作为系统管理员,可能需要你来设置一个。这是因为在许多情况下,桌面支持需要 DHCP 服务器,并且需要快速且尽可能少的工作量让工作人员上线。这可能意味着他们通过 Wi-Fi 或虚拟私人网络VPN)连接到网络。无论他们是如何连接的,只要他们在授权的连接范围内,我们就需要为他们提供正确的地址信息。这不仅允许他们访问互联网,还能让他们访问公司内部网络中的系统。让我们开始手动设置 DHCP 服务器。

你首先需要做的是使用以下命令安装dhcp-server软件包:

[emcleroy@rhel1 ~]$ sudo dnf install dhcp-server

该输出可以在以下截图中看到的命令中查看:

图 5.14 – 安装所需的 dhcp-server 软件包

图 5.14 – 安装所需的 dhcp-server 软件包

从那里,我们需要在正确的配置文件中设置参数,以便dhcp-server知道应向客户端机器提供哪些信息。使用以下命令,我们可以打开并编辑dhcpd.conf文件:

[emcleroy@rhel1 ~]$ sudo vi /etc/dhcp/dhcpd.conf

命令显示在以下截图中:

图 5.15 – 编辑 dhcpd.conf 文件以设置所需的网络设置

图 5.15 – 编辑 dhcpd.conf 文件以设置所需的网络设置

为了省去一些麻烦,有一个技巧可以利用。这个技巧是查看配置文件的示例并复制粘贴选项。完成后,您需要编辑选项以匹配您的网络要求,从而让服务器向客户端提供正确的信息。使用以下命令,我们可以查看正在运行的 DHCP 服务器的示例:

[emcleroy@rhel1 ~]$ cat /usr/share/doc/dhcp-server/dhcpd.conf.example

该示例可以在以下截图中找到:

图 5.16 – 配置的 dhcpd.conf 文件示例

图 5.16 – 配置的 dhcpd.conf 文件示例

在该示例中,您将看到设置内部 DHCP 服务器所需的主要部分,以便为您的客户端提供服务。该部分在以下截图中显示:

图 5.17 – 必要项位于“稍微不同的配置”部分下

图 5.17 – 必要项位于“稍微不同的配置”部分下

通过复制子网部分并将其粘贴到dhcpd.conf文件中,您可以轻松地编辑为所需的值,而无需担心是否遗漏了任何项。此配置文件在以下截图中显示:

图 5.18 – 为 dhcp-server 提供 192.168.1.0/24 网络的配置

图 5.18 – 为 dhcp-server 提供 192.168.1.0/24 网络的配置

dhcpd.conf文件中设置了所有正确的设置后,您可以启动并启用dhcp-server守护进程,以确保服务器正在运行。我们将使用以下命令来启用并启动dhcpd服务:

[emcleroy@rhel1 ~]$ sudo systemctl enable dhcpd
[emcleroy@rhel1 ~]$ sudo systemctl start dhcpd

命令的执行结果显示在以下截图中:

图 5.19 – 启动并启用服务,以便它在启动时自动启动

图 5.19 – 启动并启用服务,以便它在启动时自动启动

启动并启用服务后,最好检查并确保系统已成功启动。我们可以使用以下命令查看服务的状态:

[emcleroy@rhel1 ~]$ sudo systemctl status dhcpd

running的状态在以下截图中显示,用于dhcp-server

图 5.20 – 显示 dhcp-server 运行状态,从而确认它已正确设置

图 5.20 – 显示 dhcp-server 运行状态,从而确认它已正确设置

与其他所有服务一样,我们希望连接到外部世界,为此我们需要打开防火墙以允许 DHCP 租约的传入广播请求。我们将使用以下命令打开并重新加载防火墙:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service-dhcp
[emcleroy@rhel1 ~]$ sudo firewall-cmd --reload

打开防火墙命令的输出如以下截图所示:

图 5.21 – 为 DHCP 打开防火墙端口并重新加载防火墙以允许连接

图 5.21 – 为 DHCP 打开防火墙端口并重新加载防火墙以允许连接

之前,我们跳过了双重检查,以确保防火墙规则已实际生效。这一次,我想展示如何检查并查看一个服务是否被允许通过防火墙。我们将使用以下命令查看当前防火墙允许的服务:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --list-services

在下图中,命令显示 DHCP 服务已列出:

图 5.22 – 使用  命令;你可以看到它包括 DHCP

图 5.22 – 使用 firewall-cmd --list-services 命令;你可以看到它包括 DHCP

我们已经设置了一个 DHCP 服务器,以提供连接到子网的客户端设备的连接。这使你能够控制设备从静态 DHCP 地址分配到下一个 IP 地址池所接收的 IP 地址。我们简要展示了一些选项,如 default-lease-time,它表示机器在发出新请求之前将保持 IP 地址的时间。例如,静态 MAC 地址映射使你提前知道你的设备将从 DHCP 服务器获取哪个 IP 地址。这对于设置 Ansible playbooks 以便运行特定 IP 地址时非常有用。接下来,我们将讨论如何通过 Ansible 自动化设置此服务,以确保它容易重复并降低人为错误的可能性。

自动化 DHCP 服务器配置以提供 DHCP 服务

我们将从设置 Ansible 系统的清单开始,在我们的例子中,目标设备是 rhel1.example.com,用于配置 DHCP 服务器。这将允许我们仅针对我们要运行的设备进行操作;同时,我们将在 playbook 中调用该服务器,以确保仅配置 rhel1。为你的 playbook 创建一个目录,或者你也可以将所有 playbook 放在同一个目录中,但它将使用相同的清单,所以请记住这一点。在我们的例子中,我们将在 Documents 文件夹中创建一个名为 dhcp_server_playbook 的目录,以存放 playbook 和清单文件:

[emcleroy@rhel3 Documents]$ mkdir dhcp_server_playbook
[emcleroy@rhel3 Documents]$ cd dhcp_server_playbook/
[emcleroy@rhel3 dhcp_server_playbook]$ ls
[emcleroy@rhel3 dhcp_server_playbook]$ vi inventory

清单文件应类似于以下截图:

图 5.23 – 用于创建 DHCP 服务器的 playbook 的 DHCP 服务器清单文件

图 5.23 – 用于创建 DHCP 服务器的 playbook 的 DHCP 服务器清单文件

然后,我们将进入剧本本身,创建任务以安装 DHCP 服务器。首先,我们需要指向我们创建的库存组,以确保不会更新其他主机。我们还将把 become 状态设置为 true,以提升我们的权限,并将 become_method 设置为 sudo,这样 Ansible 就知道如何提升权限:

---
- name: Install and Configure DHCP Server
  hosts: dhcp_servers
  become: true
  become_method: sudo

然后我们需要添加一些任务来开始构建 DHCP 服务器本身。我们将首先使用 package 模块安装 dhcp-server 包。我们还将设置任务以安装该包的最新版本:

  tasks:
    - name: Install dhcp-server package
      package:
        name: dhcp-server
        state: latest

在我们安装完服务器后,我们将使用模板模块通过 Jinja 模板设置配置文件。

首先,让我们查看剧本的布局,然后讨论模板。我们将使用 template 模块将我们构建的模板复制到系统中以配置 dhcp-server。您会注意到我们使用了一个预定义的变量 playbook_dir,以便指向文件的正确位置。这个变量是 Ansible 内置的,您无需自己配置:

    - name: Set subnet configuration of DHCP-Server
      template:
        src: "{{ playbook_dir }}/templates/dhcpd.conf.j2"
        dest: /etc/dhcp/dhcpd.conf

现在,让我们看看 jinja2 模板,它展示了我们想要创建的子网的正常 dhcpd.conf 布局,如以下截图所示:

图 5.24 – 用于 Ansible 剧本的 dhcpd.conf.j2 文件

图 5.24 – 用于 Ansible 剧本的 dhcpd.conf.j2 文件

完成此步骤后,我们将启动并启用服务。打开 dhcp 的防火墙规则并重新加载防火墙:

    - name: Enable and start dhcp-server service
      service:
        name: dhcpd
        enabled: true
        state: restarted
    - name: Open firewall rules
      firewalld:
        permanent: true
        immediate: true
        service: dhcp
        state: enabled

然后,我们将运行剧本以设置 DHCP 服务器。我们将使用以下命令;如果您已完全设置密钥,则不需要此步骤,但我想向您展示如何使用密码执行此操作:

[emcleroy@rhel3 dhcp_server_playbook]$ ansible-playbook -i inventory dhcp_server_playbook.yml -u emcleroy -k --ask-become

运行剧本时的输出显示在以下截图中:

图 5.25 – dhcp_server_playbook.yml 成功运行

图 5.25 – dhcp_server_playbook.yml 成功运行

在此成功运行后,您可以将服务器指向系统以查找 DNS 服务器。由于我的系统当前正在使用 DHCP 服务器,这使得测试变得更加困难,因为我正在桥接连接,但您可以更改配置,使用 VirtualBox 中的非桥接连接,如内部网络,并能够测试 DHCP 以查看其提供的内容。

在本节中,我们学习了如何自动化设置 DHCP 服务器。这使我们能够自动为系统提供 DHCP 服务。在企业环境中运行时,这让客户端计算机连接到新网络变得更加轻松。接下来,我们将讨论 DNS 以及它与网络连接的关系。

了解 DNS 以及为什么需要了解它

学习 DNS 很重要,因为它简化了我们如何查找互联网上联网设备的地址。如果没有 DNS 将 FQDN 转换为 IP 地址,我们所有人都必须通过 IP 搜索网站。这将变得非常混乱,因为今天有这么多网站可供使用,记住所有这些网站的 IP 地址会非常繁琐且难以管理。这最终会导致需要一个数据库,每次访问网站时都得查看。因此,DNS 应运而生,提供了这一功能,让你可以记住网站的友好名称,以便访问它们,如 google.com

手动设置 DNS 服务器配置以提供 DNS 服务

我们首先需要做的是安装 bind 包,以便 DNS 可以运行。这将允许为系统提供 DNS 条目的守护进程。我们将使用 sudo dnf install bind -y 命令开始安装,输出结果如下图所示:

图 5.26 – 通过软件包管理器安装 bind

图 5.26 – 通过软件包管理器安装 bind

在安装了 bind 之后,我们需要查看文档,以清楚了解需要设置的项目。我们可以在截图中看到以下路径的 named.conf 文件示例:

图 5.27 – bind 设置的文档位置

图 5.27 – bind 设置的文档位置

安装完 bind 之后,我们需要配置 /etc/named.conf 文件,以设置所需的参数。该文件的位置在下图中显示,并通过 sudo vi /etc/named.conf 命令进行编辑:

图 5.28 – 编辑 /etc/named.conf 文件以配置 DNS 的命令

图 5.28 – 编辑 /etc/named.conf 文件以配置 DNS 的命令

你会注意到,首先需要设置的是监听端口和接口。DNS 在端口 53 上监听,因为这是在网络世界中设置的 DNS 的知名(默认)端口。我们将调整设置,使其在连接到网络的任何接口上的端口 53 上监听传入请求。这个配置在下图中显示:

图 5.29 – DNS 端口 53 的接口设置

图 5.29 – DNS 端口 53 的接口设置

配置文件的下一部分是我们关注的区域文件位置。区域文件告诉 DNS 应该为某个 FQDN 提供哪些 IP 地址(这些文件是当你搜索网站时,如 www.google.com,DNS 查找的内容),然后通过 DNS 返回一个 IP 地址到你的计算机,以便它可以到达目标网站。在此案例中,正如下图所示,这些文件的位置是 /var/named 目录:

图 5.30 – 区域文件目录位置

图 5.30 – 区域文件目录位置

当设置权威 DNS 服务器,或者所谓的顶级 DNS 服务器时,在像实验环境或考试等场合中,你可能希望将 recursion 设置为 no,这样 DNS 就不会从其他 DNS 服务器获取上游信息。然后,为了保存这些信息,比如 DNS 记录,你会将 recursion 设置为 yes。在本例中,我们将其设置为 no,因为我们希望成为顶级服务器,具体设置见以下截图:

图 5.31 – 权威 DNS 服务器的递归设置为否

图 5.31 – 权威 DNS 服务器的递归设置为否

接下来,我们将设置主转发查找区域的区域文件位置。转发查找区域用于查找给定的 DNS FQDN 的 IP 地址。这使得计算机或服务器能够在互联网上或局域网上查找它想要访问的内容。example.com 区域示例如下图所示:

图 5.32 – 提供给 named.conf 文件的 example.com 区域文件位置

图 5.32 – 提供给 named.conf 文件的 example.com 区域文件位置

接下来,我们将在 named.conf 文件中设置反向区域查找文件的位置。这样,如果你在系统中查找 IP 地址时,它将返回该 IP 地址对应的 FQDN。这个 192.168.1.0 的 PTR 记录,在我们的例子中,将指向 example.com

图 5.33 – 为 192.168.1.0 区域提供给 named.conf 文件的 PTR 记录位置

图 5.33 – 为 192.168.1.0 区域提供给 named.conf 文件的 PTR 记录位置

现在,我们已经将所需的区域文件位置添加到 named.conf 中,接下来需要为 DNS 创建区域文件,以便 DNS 可以查找与 DNS 记录相关的信息。我们可以使用 /var/named/named.localhost 中提供的本地主机示例来展示区域文件中所需的内容。该区域文件的示例如下图所示:

图 5.34 – DNS 记录的示例区域文件

图 5.34 – DNS 记录的示例区域文件

如前所述截图所示,我们需要详细了解几个不同的项目。首先是 DNS 服务器管理员的@.符号。接下来是文件中列出的几个重要项,它们包括A记录(即 IPV4 DNS 记录)、AAAA记录(即 IPV6 记录)和NS记录(即名称服务器记录,决定了使用的 DNS 服务器设置,所有区域文件都需要这些记录)。序列号非常重要,因为它有助于识别从主机检索到的 DNS 记录是否是最新的。末尾的.(点)用于 FQDN(完全限定域名),这些域名可以被访问。在下面的截图中,您将看到我们如何为example.com设置一个简单的区域文件:

图 5.35 – 为 example.com 配置的区域文件,设置了 A 记录和 NS 记录

图 5.35 – 为 example.com 配置的区域文件,设置了 A 记录和 NS 记录

在配置好该区域后,我们将设置 PTR 区域以进行反向 DNS 查询。这是以相同的格式完成的,但 IP 地址的反向 DNS 布局与记录相反,这使得服务器可以通过 IP 地址而非名称被发现。此记录类型和设置将在下图中展示:

图 5.36 – 为 example.com 配置的 PTR 反向 DNS 查询区域文件,针对 192.168.1.0 子网

图 5.36 – 为 example.com 配置的 PTR 反向 DNS 查询区域文件,针对 192.168.1.0 子网

在我们的配置文件设置好并且区域文件填充完成后,我们接下来需要启用并启动由bind软件包提供的 named 服务,以便为指向它的系统提供 DNS 记录。通过下面截图中的命令可以完成此操作:

图 5.37 – 启动并启用 named 服务以提供 DNS

图 5.37 – 启动并启用 named 服务以提供 DNS

为了确保 DNS 正常运行,我们将使用以下命令:

[emcleroy@rhel1 ~]$ sudo systemctl status named

现在我们可以查看 named 服务的输出状态,如下截图所示,显示其正在积极运行且没有失败:

图 5.38 – DNS 的 named 服务状态

图 5.38 – DNS 的 named 服务状态

为了确保外部系统能够访问 DNS 服务,我们需要在防火墙中允许它。我们将使用以下命令来启动、启用并应用防火墙规则:

[emcleroy@rhel1 ~]$ sudo systemctl start named
[emcleroy@rhel1 ~]$ sudo systemctl enable named
[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service-dns
[emcleroy@rhel1 ~]$ sudo firewall-cmd --reload

firewalld的设置、启动、启用输出及命令如下截图所示:

图 5.39 – 允许 DNS 并重新加载防火墙以确保连通性

图 5.39 – 允许 DNS 并重新加载防火墙以确保连通性

为确保系统提供我们在区域文件中设置的 DNS 记录,我们将在特定的 DNS 服务器上进行dig查询,查询我们在区域文件中传播的系统。请记住,每次更新区域文件时,都需要重新加载named.service。我们将使用dig命令进行 DNS 查询:

[emcleroy@rhel1 ~]$ dig rhel2.example.com @192.168.1.198

以下截图显示了我们为rhel2.example.com创建的 DNS 服务器上的dig 或查询记录

图 5.40 – DNS dig 查询 rhel2.example.com 服务器

图 5.40 – DNS dig 查询 rhel2.example.com 服务器

在这一节中,我们学习了如何手动设置 DNS 服务器。这对于加深你对 DNS 如何工作以及为何使用它的理解至关重要。我们展示了如何设置正向和反向区域,以便实现连接,并安装所需的服务。接下来,我们将深入探讨如何使用 Ansible 自动化 DNS 服务器的创建。

自动化 DNS 服务器配置以提供 DNS 服务

接下来,我们将学习如何通过 Jinja 模板使用 Ansible 自动化设置 DNS 服务器,就像我们之前在 DHCP 设置中做的一样。这些文件可能需要根据您的设置进行修改,但您将理解如何完成 Ansible playbook 的原理。

我们将从使用以下命令创建 playbook 目录开始:

[emcleroy@rhel1 ~]$ ls
[emcleroy@rhel1 ~]$ cd Documents/
[emcleroy@rhel1 ~]$ mkdir dns_server

这些命令的输出可以在以下截图中看到:

图 5.41 – 创建 playbook 目录

图 5.41 – 创建 playbook 目录

然后,我们将在新目录中创建库存文件。该库存示例可以在以下截图中看到:

图 5.42 – 库存示例

图 5.42 – 库存示例

首先,我们将开始编写我们的 playbook,然后继续创建 Jinja2 模板。像往常一样,我们将以如下方式开始我们的 playbook:

---
- name: DNS server playbook
  hosts: rhel1.example.com
  become: true
  become_method: sudo

接下来,我们将进行安装bind的任务,这会安装named.service,并启动 DNS 服务器。然后,我们将复制named.conf和区域的配置文件。接着,更新防火墙并测试域名解析。请记住,在这个 playbook 中,您需要替换为您系统和 DNS 服务器的 IP 地址。任务如下:

  tasks:
    - name: Install dns service
      package:
        name: bind
        state: latest
    - name: Copy dns main config
      template:
        src: "{{ playbook_dir }}/named.conf.j2"
        dest: /etc/named.conf
    - name: Copy dns forward zone configs
      template:
        src: "{{ playbook_dir }}/example.com.zone.j2"
        dest: /var/named/example.com.zone
    - name: Copy dns reverse zone configs
      template:
        src: "{{ playbook_dir }}/1.168.192.zone.j2"
        dest: /var/named/1.168.192.zone
    - name: Start and enable DNS
      service:
        name: named
        state: restarted
        enabled: true
    - name: Enable DNS firewall rule
      command:
        cmd: firewall-cmd --permanent --add-service=dns
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Install DIG to check configuration
      package:
        name: bind-utils
        state: latest
    - name: Run dig to test configuration
      command:
        cmd: "dig rhel2.example.com @192.168.1.198"

完成后,我们将创建named.conf和区域文件作为.j2模板。

可以在以下截图中看到named.conf文件:

图 5.43 – 截断以便阅读的 named.conf 文件

图 5.43 – 截断以便阅读的 named.conf 文件

以下截图显示了正向区域文件:

图 5.44 – 正向区域文件 example.com.zone.j2

图 5.44 – 正向区域文件 example.com.zone.j2

最后,我们有反向区域文件 PTR 记录,截图如下:

图 5.45 – 反向区域文件 1.168.192.zone.j2

图 5.45 – 反向区域文件 1.168.192.zone.j2

在创建完毕后,我们将再次运行以下命令,展示如果没有设置 SSH 密钥时需要运行的命令。如果你已设置了 SSH 密钥,可以省略 -k -ask-become。此外,我们将添加详细模式,以便查看更多标准输出类型的日志,通过添加 -v;此命令如下:

$ ansible-playbook -i inventory dns_server_playbook.yml --ask-become -u emcleroy -k -v

以下截图显示了成功运行的 playbook:

图 5.46 – Playbook 输出

图 5.46 – Playbook 输出

这部分总结了如何使用 Ansible 自动化管理 DNS 服务器。使用 Ansible 自动化可以轻松创建这些服务器,并且当你需要因为任何原因(例如灾难恢复DR))复制它们时,你可以快速完成。这使得你能够确保每次复制的配置都正确无误,避免了人工干预时可能出现的错误。

总结

在本章中,我们学习了 IP 地址、DHCP 和 DNS。我们了解了如何开始连接互联网,并且这些内容如何适用于你和你的公司。我们成功设置了这些程序,通过你自己的服务器建立自动的 DNS 和 DHCP。这使得你能够控制网络的设置以及如何连接到内联网或互联网。在下一章,我们将学习打印机和电子邮件。设置这些服务对于正常的企业基础设施至关重要,是每个公司中不可或缺的一部分。电子邮件服务器和打印服务器非常重要,它们使得公司能够不间断地进行日常业务。我期待在下一章与大家见面。

第三部分:Red Hat Linux 8 – 使用自动化配置和维护应用程序,并进行全面复习和考试技巧

在这一部分,你将学习如何手动和自动设置和维护应用程序,我们还将提供全面的复习和通过 EX358 考试的技巧和窍门。

本部分包含以下章节:

  • 第六章打印机和电子邮件 – 在 Linux 服务器上设置打印机和电子邮件服务

  • 第七章数据库 – 设置和使用 MariaDB SQL 数据库

  • 第八章Web 服务器和 Web 流量 – 学习如何创建和控制流量

  • 第九章全面复习和模拟考试题

  • 第十章帮助考试的技巧和窍门

第六章:打印机和电子邮件 – 在 Linux 服务器上设置打印机和电子邮件服务

在本章中,我们将设置打印机和电子邮件服务。这些服务对任何公司,无论大小,都是至关重要的。打印文档的能力是许多工作所需的,这可能包括文档和手册。除了打印,我们还将为服务器设置电子邮件服务。这将允许邮件服务器根据我们设置的报告类型或使用电子邮件完成任务的程序(例如,向用户发送警报或提供配置合规性报告)发送报告。通过使用电子邮件服务,我们可以确保在管理系统时没有任何遗漏。

本章将涵盖以下主要内容:

  • 了解打印机服务并手动设置它们

  • 通过 Ansible 自动化设置打印机服务

  • 了解电子邮件服务并手动设置它们

  • 通过 Ansible 自动化设置电子邮件服务

技术要求

你需要先应用第一章中的配置,块存储 – 了解如何在 Red Hat Enterprise Linux 上配置块存储,才能进行本章的动手操作部分。相关的示例文件和剧本可以在 GitHub 仓库github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter06中找到。

设置 GitHub 访问权限

请参考第一章中的说明,块存储 – 了解如何在 Red Hat Enterprise Linux 上配置块存储,以便访问 GitHub。你可以在github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-/tree/main/ch6找到本章的 Ansible 自动化剧本。请记住,这些只是建议的剧本,它们并不是解决方案唯一的编写方式。

你总是可以使用 raw、shell 或 cmd 来修改它们,以实现相同的结果,但我们旨在展示达成目标的最佳方法。还请记住,我们没有使用将来版本的 Ansible 中要求的 FCQN,因为该功能在考试中不被支持,考试是基于 Ansible 2.9 版本进行的。

了解打印机服务并手动设置它们

在许多情况下,系统需要打印能力。这可能是为了输出一些需要在演示中传递的数据,或者是为了打印后续参考的材料。通过打印服务的使用,我们可以设置和配置打印队列,使我们能够做到这一点。我们可以控制打印机何时以及如何打印,以及哪个打印机被设置为默认打印机。掌握了这些知识,你可以在 RHEL 桌面和服务器上设置打印机。在练习的实际操作部分,你需要一个与服务器位于同一网络的网络打印机。

让我们开始吧。首先,我们将安装 cups 包,以提供我们需要聚合的依赖项。我们将使用以下截图中的命令来执行此操作:

图 6.1 – 安装 cups 包

图 6.1 – 安装 cups 包

通过安装 cups 包,我们安装了创建打印队列和直接查询连接到其他服务器或打印服务器的打印机所需的所有包。我们需要启用并启动服务,如以下截图所示:

图 6.2 – 启动和启用 cups 进行打印机设置

图 6.2 – 启动和启用 cups 进行打印机设置

接下来,我们将启用防火墙规则以允许 631/tcp,这是打印机通常提供服务的端口。我们还启用 mDNS,通过互联网打印协议IPP)进行动态发现。所需的命令如下截图所示:

图 6.3 – 添加所需的防火墙规则以发现打印机和打印

图 6.3 – 添加所需的防火墙规则以发现打印机和打印

设置打印系统的下一步是查找网络打印机。我们将使用 ippfind 工具执行此操作,命令如下截图所示:

图 6.4 – 使用 ippfind 工具查找网络打印机

图 6.4 – 使用 ippfind 工具查找网络打印机

在我们定位到打印机后,我们将选择我们希望目标的打印机并为其创建一个打印队列。这将允许我们将打印任务排队并发送到打印机。这提供了启用和禁用打印机打印功能的能力,同时在打印机离线或禁用时保持打印队列(除非你手动干预或通过 Ansible 自动化)。我们可以通过lpadmin命令看到创建的打印队列。(注意lpadmin前有一个L字母。)我们将使用以下标志:-p-v-m,和-E。这些的含义如下:-p queue名称,-v device URL,而-m everywhere是 IPP 定义,-E用于立即启用打印机队列。请首先确保打印机的 DNS 名称是可路由的,或者将其添加到/etc/hosts中以确保可访问性。完整的命令可以在以下截图中看到:

图 6.5 – 配置打印队列

图 6.5 – 配置打印队列

接下来,我们将设置默认打印机,以便当你创建打印任务时,它将发送到正确的打印机。这通常在你有多台打印机时使用,并且需要确保打印到正确的打印机,可能是在大楼中的特定位置,或者因为需要使用某种类型的打印机。设置默认打印机的命令可以在以下截图中看到:

图 6.6 – 设置默认打印机

图 6.6 – 设置默认打印机

接下来,我们将创建一个简单的文本文件来进行打印,并测试我们的打印队列是否已正确设置。在我的例子中,文件如下所示:

图 6.7 – 创建一个测试文档进行打印

图 6.7 – 创建一个测试文档进行打印

在我们创建了文本文件进行打印后,我们将实际打印它。这可以通过以下截图中的命令完成:

图 6.8 – 打印测试文档

图 6.8 – 打印测试文档

如果打印机成功打印了你的页面,那么你就可以在rhel1.example.com上创建和控制打印任务。

接下来,让我们看看如何禁用和启用打印队列。当你禁用打印机时,它将排队打印任务,而不是将它们发送到打印机。这可以从以下截图中看到:

图 6.9 – 禁用打印机然后尝试打印

图 6.9 – 禁用打印机然后尝试打印

然后我们将检查当前的打印队列,并查看它如何因为打印机被禁用而无法前进。之后,我们将取消打印任务,以防在重新启用打印机时它们继续打印。进入主目录并使用以下截图中的命令将显示打印队列并取消打印任务:

图 6.10 – 打印队列显示由于打印机禁用而导致的暂停任务

图 6.10 – 打印队列显示由于打印机禁用而导致的暂停任务

为确保我们仍然能够打印,接下来我们将重新启用打印队列。这将使任何打印任务都能够发送到我们的默认打印机。这是通过下图所示的命令完成的:

图 6.11 – 清除打印队列后重新启用打印队列

图 6.11 – 清除打印队列后重新启用打印队列

在本节中,我们设置了一个打印队列,使 Linux 设备能够打印到网络打印机。这些信息在你需要创建纸质文档时至关重要。这可能是公司活动的宣传资料或内部会议的文件。能够打印是必需的,而了解如何设置打印队列则使这一能力得以实现。接下来,我们将通过 Ansible 自动化设置打印队列。

通过 Ansible 自动化设置打印服务

我们将通过创建一个用于启用 cups 打印服务的 playbook 开始本节内容。然后,我们将创建 playbook 来启用和禁用打印队列,并处理任何可能排队等待打印的任务。这将使我们能够通过自动化在多个设备上设置打印机,从而大大缩短完成时间。

首先,我们将从一个 playbook 目录开始,目录内将包含一个清单文件,列出我们希望在其上设置服务的服务器。在我们的例子中,我们将在 rhel1.example.comrhel2.example.com 上设置打印队列。这将使我们能够展示如何在多个 playbook 中使用 Ansible 自动化。我们将创建一个 cups_playbook 目录,并在其中首先创建下图所示的清单文件:

图 6.12 – playbook 的清单文件

图 6.12 – playbook 的清单文件

接下来,我们将像往常一样开始 playbook,首先创建 playbook 的顶层结构。以下是使用 Ansible 自动化时,所有 playbook 开始时需要的格式。playbook 的开始可以在以下代码中看到:

---
- name: Cups printer queue setup
  hosts: cups_servers
  become: true
  become_method: sudo

接下来,让我们继续处理任务。这些任务包括安装 cups、配置防火墙规则以及设置打印队列。为此,你需要提前知道打印机的 URL,因此你可能需要通过以下代码从服务器上收集该信息:

[emcleroy@rhel1 ~]$ ippfind -T 20
ipp://HPE070EA601518.local:631/ipp/print
ipp://EPSON04046D.local:631/ipp/print
ipp://BRW9C305BC2B044.local:631/ipp/print

在我的例子中,我将使用在前面代码片段的打印机查找命令输出底部显示的 Brother 打印机。

有了这些信息,我们可以编写出我们之前学到的命令来设置打印队列。你可以在以下代码中看到安装 cups、配置防火墙和设置打印队列的任务:

  tasks:
    - name: Install cups
      package:
        name: cups
        state: latest
    - name: Start and enable cups service
      service:
        name: cups
        state: started
        enabled: true
    - name: Enable firewall rules
      firewalld:
        service: mdns
        permanent: true
        state: enabled
    - name: Enable firewall rules
      firewalld:
        port: 631/tcp
        permanent: true
        state: enabled
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Setup print queue
      command:
        cmd: lpadmin -p printer-queue -v ipp://BRW9C305BC2B044.local:631/ipp/print -m everywhere -E
    - name: Set default print queue
      command:
        cmd: lpadmin -d printer-queue
    - name: Test to ensure print queue is setup correctly
      command:
        cmd: lpstat -p printer-queue

我们将使用以下命令运行 playbook,并包括-v标志以获得详细输出,比如显示打印队列已启用时:

[emcleroy@rhel3 cups_playbook]$ ansible-playbook -i inventory cups_playbook.yml -u emcleroy –k –-ask-become -v

该 playbook 运行成功后的输出被截断,但你可以在以下截图中看到打印队列被启用的地方:

图 6.13 – cups 创建 playbook 的成功运行

图 6.13 – cups 创建 playbook 的成功运行

接下来,我们将编写一个 playbook 来禁用打印队列,然后编写另一个 playbook 来启用它。这里你可以看到禁用打印队列的 playbook 代码:

---
- name: Cups printer queue setup
  hosts: cups_servers
  become: true
  become_method: sudo
  tasks:
    - name: Disable print queue
      command:
        cmd: cupsdisable printer-queue

该 playbook 运行成功后禁用打印队列的输出可以在以下截图中看到:

图 6.14 – cups 禁用 playbook 的成功运行

图 6.14 – cups 禁用 playbook 的成功运行

以下代码中显示的 playbook 启用打印队列:

---
- name: Cups printer queue setup
  hosts: cups_servers
  become: true
  become_method: sudo
  tasks:
    - name: Enable print queue
      command:
        cmd: cupsenable printer-queue

启用打印队列的输出可以在以下截图中看到:

图 6.15 – cups 启用 playbook 的成功运行

图 6.15 – cups 启用 playbook 的成功运行

在本节中,我们学习了如何通过 Ansible 自动化设置打印队列。这在企业环境中非常有用,在这种环境中,你可能需要为许多需要打印到同一台打印机的服务器设置打印队列。通过设置 Ansible 自动化 playbook 来完成这项工作,你可以腾出时间来做其他更有意义的工作。

了解电子邮件服务并手动设置

电子邮件服务是任何基础设施中不可或缺的一部分。能够将电子邮件报告或警报发送到专用邮件列表是电子邮件如此有用的原因之一。使用postfix包,你可以设置完整的邮件中继或空客户端,将邮件转发到其他中继。这使你能够控制邮件在网络中的路由方式。在本节中,我们将看到如何为这些目的设置空客户端。我们将安装postfix来控制来自服务器的电子邮件,设置防火墙规则,并最终手动和通过 Ansible 自动化设置空客户端。

我们首先需要做的是安装postfix。安装postfix的命令可以在以下截图中看到:

图 6.16 – 安装 postfix

图 6.16 – 安装 postfix

然后,我们将查看postfix的配置文件。这并不是设置postfix的最佳方式,因为postconf命令通常用于更改所需的设置。配置文件可以在以下截图中看到,并位于/etc/postfix/main.cf

图 6.17 – Postfix main.cf 截断

图 6.17 – Postfix main.cf 截断

使用postconf命令,你可以看到相同的配置,但没有注释,如以下截图所示:

图 6.18 – 截断的 postconf 命令输出

图 6.18 – 截断的 postconf 命令输出

接下来,我们将对系统进行必要的更改,以设置postfix作为空客户端所需的内容,如下截图所示:

图 6.19 – 使用 postconf 命令更改配置值

图 6.19 – 使用 postconf 命令更改配置值

这使得你能够根据 Red Hat 在考试中设置的要求,对postfix配置进行更改。

让我们来看一个设置空客户端的示例。空客户端只是一个将电子邮件转发到另一个服务器的服务器,自己不接收任何电子邮件。

第一个要更改的设置是inet_interfaces,将其设置为loopback-only,如以下命令所示:

[emcleroy@rhel1 ~]$ sudo postconf -e "inet_interfaces = loopback-only"
[sudo] password for emcleroy:
[emcleroy@rhel1 ~]$ sudo postconf inet_interfaces
inet_interfaces = loopback-only

然后,我们将设置myorigin参数,使用域名,在我们的例子中是example.com,如下代码所示:

[emcleroy@rhel1 ~]$ sudo postconf -e "myorigin = example.com"
[emcleroy@rhel1 ~]$ sudo postconf myorigin
myorigin = example.com

接下来,我们将inet_protocols设置为ipv4,纯粹是为了简化,如下代码所示:

[emcleroy@rhel1 ~]$ sudo postconf -e "inet_protocols = ipv4"
[emcleroy@rhel1 ~]$ sudo postconf inet_protocols
inet_protocols = ipv4

接下来,我们要更改的是mydestination参数,因为如果该值被填充,postfix会允许投递邮件。为了确保没有任何邮件会在本地投递到此服务器,我们将删除所有设置。我们将把mydestination设置为空,如下代码所示:

[emcleroy@rhel1 ~]$ sudo postconf -e "mydestination ="
[emcleroy@rhel1 ~]$ sudo postconf mydestination
mydestination =

接下来,让我们修改mynetworks参数,以便将消息提交到邮件中继供任何网络主机使用。我们将其设置为我们的回环 IP 地址,以便生效,如下代码所示:

[emcleroy@rhel1 ~]$ sudo postconf -e "mynetworks = 127.0.0.0/8"
[emcleroy@rhel1 ~]$ sudo postconf mynetworks
mynetworks = 127.0.0.0/8

接下来我们要设置的是本地投递的错误消息。这有助于我们确认本地投递已被禁用。通过以下代码实现:

[emcleroy@rhel1 ~]$ sudo postconf -e "local_transport = error: no local delivery"
[emcleroy@rhel1 ~]$ sudo postconf local_transport
local_transport = error: no local delivery

最后,我们将指向一个能够本地投递电子邮件并发送到公司邮件服务器的活动邮件中继。通过以下代码实现:

[emcleroy@rhel1 ~]$ sudo postconf -e "relayhost = [rhel2.example.com]"
[emcleroy@rhel1 ~]$ sudo postconf relayhost
relayhost = [rhel2.example.com]

我们现在已经设置好了postfix邮件服务。接下来,让我们打开防火墙,启动服务并启用它。以下截图展示了这些命令:

图 6.20 – 启用并启动服务,添加防火墙规则,重新加载防火墙

图 6.20 – 启用并启动服务,添加防火墙规则,重新加载防火墙

如果在配置之前启动并启用postfix服务,你需要确保重新加载服务,以确保更改已被接受,并检查状态,如下截图所示:

图 6.21 – 检查 postfix 状态

图 6.21 – 检查 postfix 状态

在本节中,我们学习了如何设置空客户端邮件服务器。这对于从服务器发送电子邮件通知、报告或警报非常有用。我们学习了如何使用 postconf 命令操作 postfix,以及需要更改哪些变量来创建一个空客户端。

通过 Ansible 自动化设置邮件服务

我们将使用 Ansible 自动化与一组变量和循环一起设置 postfix。这将允许我们创建与手动操作相同的设置,但在这里通过使用循环以迭代方式完成。首先,我们将设置我们的 playbook 目录,然后是我们的清单文件。清单文件如下截图所示:

图 6.22 – 邮件 playbook 的清单

图 6.22 – 邮件 playbook 的清单

我们将从正常的起始格式开始我们的 playbook,代码如下所示:

---
- name: Setup null client email server
  hosts: email_servers
  become: true
  become_method: sudo

在我们设置好 playbook 的开头部分后,接下来创建使 playbook 成功配置空客户端所需的任务。我们将使用循环,并对提供给 playbook 的变量进行循环。我们可以在以下代码中看到这个 playbook:

  tasks:
    - name: Install postfix
      package:
        name: postfix
        state: latest
    - name: Open firewall rules for postfix
      firewalld:
        service: smtp
        state: enabled
        permanent: true
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Set configuration settings using a loop
      command:
        cmd: postconf -e "{{ item.name }} = {{ item.value }}"
      loop:
        - { name: 'inet_interfaces', value: 'loopback-only' }
        - { name: 'myorigin', value: 'example.com' }
        - { name: 'inet_protocols', value: 'ipv4' }
        - { name: 'mydestination', value: '' }
        - { name: 'mynetworks', value: '127.0.0.0/8' }
        - { name: 'local_transport', value: 'error: no local delivery' }
        - { name: 'relayhost', value: '[smtp.example.com]' }
    - name: Restart and enable postfix to refresh config
      service:
        name: postfix
        state: restarted
        enabled: true

完成后,使用以下命令运行 playbook:

[emcleroy@rhel3 email_playbook]$ ansible-playbook -i inventory email_playbook.yml -u emcleroy -k --ask-become -v

成功运行 playbook 后的截断输出可以在以下截图中看到:

图 6.23 – 成功的邮件设置 playbook 执行

图 6.23 – 成功的邮件设置 playbook 执行

最后,让我们检查并确认 mynetworks 的配置,以确保它仅使用 127.0.0.0/8,如以下截图所示:

图 6.24 – 确认在 postfix 配置中更改的设置

图 6.24 – 确认在 postfix 配置中更改的设置

在本节中,我们学习了如何使用 Ansible 自动化设置 postfix 空客户端。这是一种通过预设值轻松设置邮件服务器的好方法,这些值可以跨多个主机使用。这样,你可以快速设置这些服务器,而无需在每台服务器上单独安装并输入配置命令。

小结

在本章中,我们介绍了如何从服务器打印以及如何设置邮件主机以正确地将邮件转发到使用空服务器的中继。这样,你可以将从属系统设置为其他主服务器。通过这些知识,你可以成功地从你的服务器或 Linux 客户端打印,同时发送和接收邮件传输。在下一章中,我们将学习 MariaDB 和可用的 MySQL 命令。数据库是一个强大的工具,可以为 Web 服务器和需要数据库支持的程序创建后台。这将使你能够轻松控制数据点。我们将通过手动操作和 Ansible 自动化来完成此任务,让你在整个职业生涯中设置多个数据库时更加轻松。

第七章:数据库 – 设置和使用 MariaDB SQL 数据库

本章将讨论数据库。在我们的案例中,这将详细介绍 MariaDB 的操作。MariaDB 是一个强大的工具,允许我们存储和访问应用程序以及 Web 服务器使用的数据。有了一个功能完善的数据库支撑你的项目,你将能够通过添加多种可以被这些产品保存和访问的项目,来增强应用程序或 Web 服务器的功能。从购物车到会员信息,所有这些都可以使用 MariaDB 保存。让我们开始了解更多关于数据库和 MariaDB 的内容,特别是针对 Red Hat Enterprise Linux 8.1 的使用。

本章将涉及以下主要内容:

  • 开始使用 MariaDB 进行数据收集存储

  • 在 RHEL 8 上手动安装和配置 MariaDB

  • 使用 Ansible 自动化在 RHEL 8 上安装和配置 MariaDB

技术要求

本章的技术要求将在以下子节中介绍。

设置 GitHub 访问

请参考 第一章《块存储 – 学习如何在 Red Hat Enterprise Linux 上配置块存储》中的说明,以访问 GitHub。你可以在以下链接找到本章的 Ansible 自动化 playbook:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter07。记住,这些是建议的 playbook,并不是你编写它们的唯一方式——你可以根据需要调整 playbook。

你可以始终使用 rawshellcmd 来实现相同的结果,但我们展示的是完成目标的最佳方式。同时请记住,我们没有使用 FCQN,这是 Ansible 的未来版本所需的,因为该版本将在考试中不被支持,考试内容基于 Ansible 2.9。

开始使用 MariaDB 进行数据收集存储

MariaDB 是一个允许对象关系存储的数据库。这使得可以使用 MySQL 命令存储和访问键值对。保存和访问这些信息的能力对于像论坛这样的平台至关重要,在这些平台上,用户名和密码需要关联在一起进行身份验证。例如,我们还在许多场景中使用 MariaDB 进行库存跟踪,适用于大大小小的企业。这些数据库的强大功能是每个公司都依赖的必要条件。

结构化查询语言 (SQL) 是关系型数据库管理系统 (RDBMS) 通常使用的语言,用于控制数据库的配置和访问方式。该系统提供了配置数据库所需的手段,以确保其正常运行,无论是供应用程序还是 Web 服务器使用。你使用关系型数据库的时间越长,你就越能理解它们在商业策略中的重要性。

首先,我们将查看如何手动安装 MariaDB,然后再介绍自动安装和管理这些数据库的方法。

手动在 RHEL 8 上安装和配置 MariaDB

首先,我们将开始安装 MariaDB,以便开始使用这个强大的工具包。我们将通过以下截图中的命令查找 MariaDB 包,以获取默认版本和可用的配置文件:

图 7.1 – 服务器包的模块列表,而不是客户端包

图 7.1 – 服务器包的模块列表,而不是客户端包

如前面的截图所示,我们可以看到 MariaDB 10.3 是默认版本,我们还可以看到服务器配置文件,这是我们要安装的内容。我们将按照以下截图安装 MariaDB 服务器:

图 7.2 – 安装 MariaDB 服务器

图 7.2 – 安装 MariaDB 服务器

然后,我们将启动并启用 MariaDB 服务,如下图所示:

图 7.3 – 启动并启用 MariaDB 服务

图 7.3 – 启动并启用 MariaDB 服务

然后,我们将打开 MySQL 的端口,如前所述,这是我们与 MariaDB 交互的方式。可以通过以下截图查看打开防火墙规则的过程:

图 7.4 – 打开 MariaDB 的防火墙规则

图 7.4 – 打开 MariaDB 的防火墙规则

一旦我们启用了包并启动了 MariaDB 服务,并且防火墙规则已打开,我们就可以开始使用数据库服务器进行数据收集或应用程序备份。

接下来,我们来看一下配置文件中控制网络连接的选项。我们在前几章中已经了解到,控制网络连接对于许多目的来说至关重要。我们将查看 /etc/my.cnf.d/mariadb-server.cnf 文件,并特别注意其中的一些项目,首先可以看到该文件的一个示例,见下图:

图 7.5 – 截断的 mariadb-server.cnf 文件

图 7.5 – 截断的 mariadb-server.cnf 文件

如果你查看与 Galera 相关的设置,你将看到我们需要关注的一些项目,如下图所示:

图 7.6 – mariadb-server.cnf 文件(续)

图 7.6 – mariadb-server.cnf 文件(续)

这里我们可以看到 bind-address,我们希望将其移动到 [mysqld] 部分。接下来,我们希望添加 skip-networking=1,使得仅允许在服务器上进行连接。如果将 skip-networking 设置为 0,则会监听来自 localhost 以外的连接。

对于我们的使用,我们将把绑定地址限制为 IPv4,并通过添加一行代码设置 skip-networking=1,以便锁定所有来自服务器外部的连接。这些配置项可以在以下截图中看到:

图 7.7 – 更新后的 mariadb-server.cnf 文件,包含 skip-networking

图 7.7 – 更新后的 mariadb-server.cnf 文件,包含 skip-networking

添加设置后,确保通过以下命令重启 MariaDB 服务:

[emcleroy@rhel1 ~]$ sudo systemctl restart mysql

接下来,我们将处理数据库中的数据操作。我们将使用 MySQL 工具执行这些操作。首先,我们将通过以下截图所示的命令登录到数据库:

图 7.8 – 第一次登录 mysql 数据库

图 7.8 – 第一次登录 mysql 数据库

现在我们将通过运行以下命令来确保 MySQL 数据库的安全:

[emcleroy@rhel2 ~]$ sudo mysql_secure_installation

该命令移除一些内容,例如测试数据库和匿名用户,并为 root 账户设置密码等。我们可以通过以下截图看到设置的实际操作:

图 7.9 – 安全化 MariaDB 安装

图 7.9 – 安全化 MariaDB 安装

接下来,我们将查看数据库,您会注意到有一些默认的数据库。这些数据库用于处理 MySQL 在 MariaDB 中的运行方式,如下图所示:

图 7.10 – 使用新设置的密码登录并显示数据库

图 7.10 – 使用新设置的密码登录并显示数据库

为了使用数据库,我们将使用 USE 命令,例如 USE information_schema;,以访问和操作该数据库。接下来,我们将使用数据库创建命令,并使用该数据库进行数据操作。我们将创建一个新的人员数据库,并准备好如下面截图所示进行使用:

图 7.11 – 使用人员数据库

图 7.11 – 使用人员数据库

之后,我们将检查数据库,看看其中是否有内容。为此,我们将切换到人员数据库。从以下截图中可以看到该数据库当前为空:

图 7.12 – 显示人员数据库中的表为空

图 7.12 – 显示人员数据库中的表为空

在我们创建了数据库之后,我们将使用以下截图中的命令为数据库创建一个表:

图 7.13 – 在人员数据库中创建表

图 7.13 – 在人员数据库中创建表

接下来,我们将向姓名和电话号码列中添加信息,以便我们有内容可以进行搜索。我们可以在下图中看到添加到数据库表的命令:

图 7.14 – 在人员数据库的表中创建数据

图 7.14 – 在人员数据库的表中创建数据

你也可以使用以下截图中的命令在表中搜索项目:

图 7.15 – 使用已知信息搜索数据库

图 7.15 – 使用已知信息搜索数据库

SELECT 命令可以与 WHERE 变量一起使用,如以下命令所示,以在数据库中查找特定列:

SELECT * FROM users WHERE phone_number = '(901)678-5887';

接下来,我们将讨论如何备份数据库。这将允许你恢复最近通过 mysqldump 命令备份的信息。更多关于 mysqldump 命令的信息可以在手册页中找到,如下图所示:

图 7.16 – mysqldump 手册页

图 7.16 – mysqldump 手册页

我们将使用以下命令来备份数据库:

[emcleroy@rhel2 ~]$ mysqldump -u root -p personnel >/tmp/mariadb.dump

该命令执行过程可以在下图中看到:

图 7.17 – 创建人员数据库的备份

图 7.17 – 创建人员数据库的备份

接下来,我们将从备份中恢复。我们将使用以下命令选择要恢复的备份文件,并将其恢复到我们的数据库:

[emcleroy@rhel2 ~]$ mysql -u root -p personnel < /tmp/mariadb.dump

让我们通过删除 users 表来测试此操作,如下图所示,然后恢复数据库:

图 7.18 – 删除表并在恢复之前检查它们是否丢失

图 7.18 – 删除表并在恢复之前检查它们是否丢失

现在,我们将恢复数据库并显示表已重新创建,如下图所示:

图 7.19 – 恢复数据库并显示表格已恢复

图 7.19 – 恢复数据库并显示表格已恢复

一旦你将这些信息重新加载到数据库中,你可以使用 show 命令来收集所需的任何信息。

最后,我们将展示如何控制用户对系统的访问。我们将向数据库中添加具有不同权限的用户。可以使用以下命令来添加这些用户,如下图所示:

图 7.20 – 为数据库创建用户

图 7.20 – 为数据库创建用户

在之前的截图中,您可以看到我们创建了danny@localhost,指定这是一个本地用户,并且使用identified by,指的是用户的密码,在我们的案例中是redhat。接下来,我们将为danny添加权限,以便他可以对人员数据库进行更改。添加权限的命令可以在下面截图中的命令中看到:

图 7.21 – 为新创建的用户设置权限

图 7.21 – 为新创建的用户设置权限

我们还创建了jennifer作为一个用户,并为她提供了修改数据库的权限。这使得jennifer能够在人员数据库中插入、删除和选择条目。现在,我们可以使用jennifer向数据库中添加条目。

使用 Ansible 自动化在 RHEL 8 上安装和配置 MariaDB

我们将从库存文件开始,设置 MariaDB 服务器并配置用户。然后,我们将进入使用循环操作在创建的 MariaDB 系统中添加数据,例如表格和数据库条目。接着,我们将使用 Ansible 自动化展示如何从 MariaDB 数据库中获取信息,以便您可以将数据库中的信息提供给最终用户。请确保运行此剧本的服务器之前未安装过 MariaDB,否则在设置 root 密码时会收到错误信息。

首先,我们将从一个库存文件开始,可以在以下截图中看到:

图 7.22 – Ansible 自动化库存文件

图 7.22 – Ansible 自动化库存文件

从这里开始,我们将创建ansible.cfg文件,放置在我们的目录中,以便跳过host_key_checking,因为它会导致连接问题。我们可以在以下截图中看到 Ansible 文件:

图 7.23 – Ansible 自动化 ansible.cfg 文件

图 7.23 – Ansible 自动化 ansible.cfg 文件

在我们有了这些文件后,我们将创建mariadb_server.yml的剧本文件并正常启动,代码如下所示:

---
- name: MariaDB install and configuration
  hosts: mariadb_servers
  become: true
  become_method: sudo

接下来,我们将安装 MariaDB 并设置防火墙规则。安装软件包、启动并启用服务,以及设置防火墙规则的过程可以在以下代码中看到:

  tasks:
    - name: Install MariaDB server
      package:
        name: '@mariadb:10.3/server'
        state: present
    - name: Install MariaDB client
      package:
        name: mariadb
        state: latest
    - name: Start and enable MariaDB
      service:
        name: mariadb
        state: started
        enabled: true
    - name: Open firewall rules for MariaDB
      firewalld:
        service: mysql
        permanent: true
        state: enabled
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload

在我们拥有了安装服务器的代码之后,我们将继续对 MariaDB 安装进行安全配置,启用它并开放防火墙规则。我们将从配置 root 密码开始。我们可以看到我们在以下代码中已配置此密码,并使用no_log: true标记它,以防止系统在日志文件中输出该信息:

    - name: Install PyMySQL
      package:
        name: python3-PyMySQL
        state: present
    - name: Set root password for MariaDB
      mysql_user:
        name: root
        host_all: true
        update_password: always
        password: redhat
      no_log: true
      ignore_errors: true

接下来,我们将把一个配置文件复制到 root,以便我们可以登录并进行数据库更改,而无需显示用户和密码。我们也可以将这个文件加密,但在我们的案例中,我们只是简单地复制它。该文件可以在以下截图中看到:

图 7.24 – my.cnf 文件提供数据库配置访问权限

图 7.24 – my.cnf 文件提供数据库配置访问权限

以下代码将用于将文件移动到服务器上的需要位置,以便后续与模块一起使用,进行系统的添加和更改:

    - name: Copy user and password to home
      copy:
        src: "{{ playbook_dir }}/my.cnf"
        dest: /root/.my.cnf

之后,我们将删除匿名用户,以便只有经过认证的用户才能访问数据库。我们可以在以下代码中看到删除匿名用户的过程:

    - name: Delete anonymous user
      mysql_user:
        name: ''
        host_all: yes
        state: absent

接下来,我们将创建一个名为 employees 的数据库。我们将使用循环更新该数据库,以便在数据库中配置多个员工。我们可以在以下代码中看到如何创建数据库和表格,并填充数据:

    - name: Add employees database
      mysql_db:
        name: employees
        state: present
        config_file: /root/.my.cnf

接下来,我们将创建 insert.sql 文件,用于导入所需的数据库项。这可以在以下截图中看到:

图 7.25 – insert.sql 文件将数据导入到员工数据库

图 7.25 – insert.sql 文件将数据导入到员工数据库

创建数据库后,我们将会在数据库中创建一个名为 people 的表格,如以下代码所示,使用 insert.sql 文件提供表格和数据的相关信息:

    - name: Copy insert.sql file to tmp
      copy:
        src: "{{ playbook_dir }}/insert.sql"
        dest: /tmp/insert.sql
    - name: Import the insert.sql information into the database
      mysql_db:
        name: employees
        state: import
        target: /tmp/insert.sql
        config_file: /root/.my.cnf

接下来,我们将为数据库创建一个用户,并为他们提供对新创建数据库的权限。我们可以在以下代码中看到如何创建带有权限的用户:

    - name: Add user
      mysql_user:
        name: david
        password: redhat
        update_password: on_create
        state: present
      no_log: true
    - name: Provide user with privileges
      mysql_user:
        name: david
        host: localhost
        priv: 'people.*:INSERT,UPDATE,SELECT'
        state: present

现在我们已经设置好了所有内容,接下来我们将运行 playbook。假设你没有设置密钥,我们将使用以下命令再次运行 playbook:

[emcleroy@rhel3 mariadb_server]$ ansible-playbook -i inventory mariadb_server.yml -u emcleroy -k --ask-become -v

以下截图显示了成功运行的 Ansible Automation playbook:

图 7.26 – playbook 成功运行

图 7.26 – playbook 成功运行

在 playbook 成功运行后,你可以看到信息已经添加,如以下截图所示:

图 7.27 – 数据现已填充到系统中

图 7.27 – 数据现已填充到系统中

在这一部分中,我们学习了如何自动化安装和配置 MariaDB。有了这些信息,你可以更快速、更自信地成功部署数据库。较低的人为错误门槛使得部署时更加可靠,这个过程可以在几秒钟内完成,而不像手动操作多个数据库那样需要几个小时。这就是使用 Ansible Automation 的一个优势。

总结

在这一章中,我们学习了 MariaDB SQL 数据库,以及如何配置和更新它。我们学习了如何自动化数据库,使其能够根据我们需要的信息轻松部署。这使我们能够快速部署数据库,而无需太多人工干预。我们还能够备份数据库并恢复它,这是处理数据库时必须具备的一项重要技能。在下一章中,我们将讨论 Web 服务器,它们在某些情况下使用数据库作为后台。我们将深入讲解如何手动和通过 Ansible 自动化安装和设置这些数据库。期待在下一章与大家一起继续我们的 EX358 考试准备之旅。

第八章:Web 服务器和 Web 流量 – 学习如何创建和控制流量

本章中,我们将概述什么是 web 服务器并安装它。我们将深入讨论如何保护 web 服务器,以确保在客户访问时数据的安全。我们还将讨论如何使用 Ansible 自动化来实现这一过程。如果没有良好的 web 服务器设置,可能会限制公司增长。提供访问您产品的能力至关重要,保护客户信息同样重要。让我们一起进入 web 服务器的世界吧。

本章中,我们将讨论以下主要内容:

  • 开始了解 web 服务器和流量控制

  • 学习手动设置 web 服务器并控制流量

  • 学习使用 Ansible 自动化来自动化 web 服务器和流量控制

技术要求

本章中的技术要求在以下章节中进行介绍。

设置 GitHub 访问

请参考第一章中的说明,块存储 – 学习如何在 Red Hat Enterprise Linux 上配置块存储,以获得 GitHub 访问权限,您还可以通过以下链接找到本章的 Ansible 自动化剧本:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter08。请记住,这些是建议的剧本,并不是唯一的写法,您可以根据需要编写剧本使其适合您。

你始终可以使用原始的 shell 或 cmd 来更改它们,达到相同的结果,但我们展示的是实现目标的最佳方式。此外,请记住,我们没有使用未来版本 Ansible 中所需的 FCQN,因为该版本在考试中不会被支持,因为它是基于 Ansible 2.9 测试的。

开始了解 web 服务器和流量控制

设置和运行自己 web 服务器的能力对大多数公司来说都很重要。在这个数字时代,你必须跟上快速发展的世界需求。如果没有一个强大的网站向客户提供你的产品或服务,你将大大阻碍销售潜力。尤其是要在国际市场上发展业务,这是大多数创业者的梦想。在 RHEL 8 上设置 web 服务器非常简单,使用 Apache httpd 或 NGINX 可以轻松完成,但在实施规则保护自己的时候可能会变得复杂。

保持这些资源的安全对于任何企业来说都是必须的。能够阻止恶意流量或欺骗攻击对于确保公司与客户之间的良好关系至关重要。例如,作为 web 服务器管理员,您需要做好应对分布式拒绝服务攻击DDoS)等威胁的准备。在未来的章节中,我们将深入探讨如何防止来自第三方的不必要访问,这些第三方可能试图为恶意目的获取您的信息。

我们将展示如何使用 Apache httpd 和 NGINX 安装 web 服务器,并配置它以确保系统的安全性。我们还将展示如何在一台物理服务器上托管多个 web 服务器端点。接下来,我们将演示如何在服务器启动并运行后访问它。我们将使用配置文件来定制从 web 服务器显示的内容。最后,我们将使用 Ansible 自动化来自动执行所有这些操作,从而消除需要反复进行的部署工作带来的困扰。

学习手动设置 web 服务器并控制流量

我们将从 Apache httpd 开始。我们将首先安装服务并配置文件。在以下截图中,我们可以看到 Apache httpd 的安装过程:

图 8.1 – 安装 Apache httpd web 服务

图 8.1 – 安装 Apache httpd web 服务

我们将查看默认的 httpd.conf 文件,以展示 Apache httpd 的开箱即用设置。我们可以在以下截图中看到 /etc/httpd/conf/httpd.conf 文件的布局:

图 8.2 – 截断的 /etc/httpd/conf/httpd.conf 文件

图 8.2 – 截断的 /etc/httpd/conf/httpd.conf 文件

如前面截图所示,关于如何设置 web 服务器的信息可以在 Apache httpd 的 /etc/httpd/conf/httpd.conf 文件中找到,该文件也是查找帮助和提醒的好地方,但不要仅仅依赖它。

接下来,我们将利用从 man 页面和 httpd.conf 文件中学到的知识,在 /etc/httpd/conf.d/ 目录中创建一个 .conf 文件。这将允许我们创建一个满足我们需求的 web 服务器。我们将设置 Apache httpd 中的虚拟主机,并使用 /etc/httpd/conf.d/ 目录来存储我们的网站。在此之前,我们必须确保在默认的 httpd.conf 文件中设置了 web 服务器,我们需要检查以下代码:

ServerRoot "/etc/httpd"
Listen 80
User apache
Group apache

上面的代码指出 ServerRoot/etc/httpd/,web 服务器的 Listen 端口为 80,并且 web 服务器的 User 设置为 apache。这些设置确保了当将 web 服务器提供给公众时,文件的所有权是正确的,并告诉服务器监听哪个端口,在此情况下为 80 端口,或者我们通常使用的 HTTP,或更安全的 HTTPS。目前,我们将保持这个基本配置。

接下来,我们将使用 website.conf 文件来构建虚拟服务器的配置,文件将保存到 /etc/httpd/conf.d/website.conf。我们可以在下图中看到 website.conf 文件的内容,它展示了设置 Web 服务器所需的最小参数:

图 8.3 – 用于配置虚拟 Web 服务器的 website.conf 文件

图 8.3 – 用于配置虚拟 Web 服务器的 website.conf 文件

在前面的截图中,我们可以看到我们正在为文件定义一个目录,服务器的 IP 地址以及监听端口 80,并指定了网站名称。这将允许我们在 /srv/website/www 中创建诸如 index.html 之类的文件,以便控制 Web 服务器的内容。我们需要创建一个 index.html 文件,然后启动并启用该服务。在下图中,你可以看到我已经在 /srv/website/www/ 中创建了一个简单的 index.html 文件:

图 8.4 – Apache httpd Web 服务器的 index.html 文件

图 8.4 – Apache httpd Web 服务器的 index.html 文件

接下来,我们将启动并启用 httpd,如下图所示:

图 8.5 – 启动、启用和 Apache httpd 的状态

图 8.5 – 启动、启用和 Apache httpd 的状态

现在,我们需要打开防火墙规则。作为一个建议,我建议你养成这个习惯,我们将为 HTTP 和 HTTPS 开放端口,这样如果需要访问我们的 Web 服务器,可以使用 80443 端口。在下图中,我们可以看到我们正在打开防火墙规则,并将其设为永久生效,然后重新加载防火墙:

图 8.6 – 为 Apache httpd 开放防火墙规则

图 8.6 – 为 Apache httpd 开放防火墙规则

接下来,我们将恢复 SELinux 策略,以便 Web 服务器能够展示正确的信息,具体内容可以在下图中看到:

图 8.7 – 恢复目录权限的 SELinux 命令

图 8.7 – 恢复目录权限的 SELinux 命令

最后,我们将浏览该网站,如下图所示:

图 8.8 – 成功浏览 Web 服务器的 index.html 文件

图 8.8 – 成功浏览 Web 服务器的 index.html 文件

到目前为止,我们已经成功地将 Web 服务器对外开放。通过在负载均衡器后面部署多个服务器,你可以通过负载均衡器的配置来改变流量的去向。

接下来,我们将故障排除 Apache httpd 中的虚拟主机。我们将向您展示如何缩小设置虚拟主机时的常见问题,并如何轻松识别和解决它们。首先,让我们创建一个 Apache httpd 虚拟主机。需要注意的一点是 SELinux 结构以及如何恢复它。了解这一点的关键在于,如果您看到正常的 Apache httpd 资源页面,如下截图所示,那么您就能明确问题的根源:

图 8.9 – 默认的 Apache httpd 页面

图 8.9 – 默认的 Apache httpd 页面

在使用以下命令操作您作为服务器根目录的目录后,您应该会看到Testing for EX358book!!! 消息:

[emcleroy@rhel1 html]$ sudo restorecon -rv /var/

接下来,您需要查看 /etc/httpd/conf.d/<服务器名称>.conf 中的 VirtualHost 信息,了解虚拟主机的默认文件所在位置,以防它们不在默认的 /var/www/html 中。这样,您就知道在哪里恢复 SELinux 上下文以解决问题。

接下来,确保在目录中包含 Required all granted 命令行;否则,您将无法看到任何内容,因为默认情况下它们对外界隐藏。可以在以下虚拟主机截图中观察到这一点:

图 8.10 – httpd 虚拟主机示例

图 8.10 – httpd 虚拟主机示例

我们可以利用这些信息来了解恢复 SELinux 上下文的位置。

最后,检查防火墙规则,确保此实例中的 443 已被允许,如下截图所示:

图 8.11 – 防火墙规则显示 HTTP (80) 和 HTTPS (443) 都已打开

图 8.11 – 防火墙规则显示 HTTP (80) 和 HTTPS (443) 都已打开

在确保防火墙规则到位后,Web 服务器应该能够正常工作。您可以通过状态检查确保 httpd 正在运行,如下截图所示:

图 8.12 – Apache httpd 状态显示它已启用并正在运行

图 8.12 – Apache httpd 状态显示它已启用并正在运行

在检查并根据需要修正系统状态、防火墙规则和 SELinux 后,您的 Web 服务器应该能够正常工作。

接下来,我们将设置一个带有 TLS 证书的 Apache Web 服务器。为此,我们将使用 mod_ssl。我们将首先通过以下命令安装 mod_ssl

[emcleroy@rhel1 ~]$ sudo dnf install mod_ssl -y

安装完 mod_ssl 后,您需要修改证书的存储位置,以使其与您保存证书的位置匹配。这可以在 /etc/httpd/conf.d/ssl.conf 配置文件中设置。需要修改的部分可以在以下截图中看到:

图 8.13 – mod_ssl HTTP Web 服务器的关键位置

图 8.13 – mod_ssl HTTP Web 服务器的关键位置

这将使 Web 服务器默认使用 TLS HTTPS。

我们现在将使用 NGINX 来搭建 Web 服务器。这是配置 Web 服务器的一种略有不同的方法,我们将详细讲解如何完成此操作。

首先,让我们移除 httpd 和防火墙规则,以便我们可以使用一个全新的服务器进行操作,以下截图展示了这一过程:

图 8.14 – 移除 Apache httpd 和防火墙规则

图 8.14 – 移除 Apache httpd 和防火墙规则

现在 Apache httpd 已经被移除,我们可以从全新的 NGINX 安装开始。我们将使用以下截图中的命令来安装 NGINX:

图 8.15 – 安装 NGINX Web 服务器

图 8.15 – 安装 NGINX Web 服务器

接下来,我们将使用以下文件来配置 NGINX Web 服务器,这些文件的配置方式与 Apache httpd 类似。我们将分别查看主配置文件和服务器配置文件。主配置文件位于/etc/nginx/nginx.conf,服务器配置文件位于/etc/nginx/conf.d目录中,并且使用.conf命名约定。这些文件的配置与 Apache httpd 的配置略有不同,正如下面截图所示:

图 8.16 – NGINX Web 服务器配置示例

图 8.16 – NGINX Web 服务器的配置示例

如你所见,布局有所不同,我们需要相应地进行调整。接下来,我们将创建一个website.conf文件并将其保存在/etc/nginx/conf.d目录中。以下截图展示了 NGINX 的 Web 服务器设置示例:

图 8.17 – NGINX Web 服务器配置文件示例(适用于 rhel1)

图 8.17 – NGINX Web 服务器配置文件示例(适用于 rhel1)

在保存了website.conf文件之后,我们将按之前指定的路径,在/var/www/html目录中创建index.html文件,如下图所示:

图 8.18 – NGINX Web 服务器的 index.html 文件

图 8.18 – NGINX Web 服务器的 index.html 文件

接下来,我们将在/var/目录下运行以下命令,以修复任何 SELinux 问题:

[emcleroy@rhel1 ~]$ sudo restorecon -Rv /var/
Relabeled /var/log/dnf.librepo.log from system_u:object_r:rpm_log_t:s0 to system_u:object_r:var_log_t:s0
Relabeled /var/log/dnf.rpm.log from system_u:object_r:rpm_log_t:s0 to system_u:object_r:var_log_t:s0
Relabeled /var/log/Xorg.9.log.old from system_u:object_r:var_log_t:s0 to system_u:object_r:xserver_log_t:s0
Relabeled /var/log/Xorg.9.log from system_u:object_r:var_log_t:s0 to system_u:object_r:xserver_log_t:s0
Relabeled /var/log/dnf.log.1 from system_u:object_r:rpm_log_t:s0 to system_u:object_r:var_log_t:s0
Relabeled /var/log/dnf.log from system_u:object_r:rpm_log_t:s0 to system_u:object_r:var_log_t:s0

接下来,我们将启动、启用并根据需要打开防火墙规则,就像这是一个全新服务器一样,以下截图展示了相关步骤:

图 8.19 – 启动、启用并打开 NGINX Web 服务器的防火墙规则

图 8.19 – 启动、启用并打开 NGINX Web 服务器的防火墙规则

现在,我们可以成功地访问新的 Web 服务器,如下图所示:

图 8.20 – 成功浏览到 NGINX Web 服务器

图 8.20 – 成功浏览到 NGINX Web 服务器

在我们设置好 Web 服务器后,我们将使用 HAProxy 来控制流量。HAProxy 提供了负载均衡功能,使我们能够确定当前轮换中的服务器,用于 roundrobin,这使得每个新连接会随机分配给不同的 Web 主机。例如,使用 HAProxy 可以减少维护期间的停机时间,并确保在服务器故障时仍然具有高可用性。

我们将首先安装 HAProxy,如下图所示:

图 8.21 – 安装 HAProxy

图 8.21 – 安装 HAProxy

安装完成后,我们将启用并启动服务,如下图所示:

图 8.22 – 启动并启用 HAProxy

图 8.22 – 启动并启用 HAProxy

当服务启动并运行后,我们将配置控制 HAProxy 的主文件,即 /etc/haproxy/haproxy.cfg 文件,如下图所示:

图 8.23 – /etc/haproxy/haproxy.cfg 文件

图 8.23 – /etc/haproxy/haproxy.cfg 文件

通过对配置文件的回顾,可以得出一个结论:前端的监听端口已经更改为 80,这是 HTTP 流量的正常端口。后端服务器是我们应该放置我们想要控制访问的 Web 服务器的位置。最后,轮询负载均衡设置为 roundrobin,这将轮流选择每次用户尝试访问 Web 服务器时所连接的后端服务器。

从 HAProxy 中可以学到的一点是,默认情况下,SELinux 允许许多端口直接使用,例如 80443。但是,如果你想更改为不是常见的 HTTP 或 HTTPS 端口,你需要确保运行以下命令,以通过 SELinux 允许 HAProxy 使用其他端口:

[emcleroy@rhel1 ~]$ sudo setsebool -P haproxy_connect_any on

在本节中,我们学习了如何设置 Apache httpd、NGINX 以及如何使用 HAProxy 作为负载均衡器。接下来,我们将致力于自动化这些部分,无论你选择部署 Apache 还是 NGINX,HAProxy 都能够将它们作为后端服务器。

学习如何使用 Ansible 自动化来自动化 Web 服务器并控制流量

我们将设置一个多任务的 playbook,允许在服务器 rhel1 上安装 Apache httpd,并在 rhel2 上安装 NGINX。之后,我们将安装 HAProxy,并将这两台服务器设置为 roundrobin 负载均衡,所有这些都通过 Ansible 自动化完成。

让我们从库存文件开始,其中将包括 httpd Web 服务器、NGINX Web 服务器和 HAProxy 服务器,如下图所示:

图 8.24 – Ansible 自动化库存文件

图 8.24 – Ansible 自动化库存文件

接下来,我们将编写实现这一目标所需的剧本和文件。为此,首先我们将编写如下所示的第一个服务器的剧本的开始部分:

---
- name: Install and configure Apache httpd
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install Apache httpd
      package:
        name: httpd
        state: latest
    - name: Copy Apache httpd web server configuration
      template:
        src: httpd.j2
        dest: /etc/httpd/conf.d/website.conf
    - name: Copy Apache httpd web server index.html
      template:
        src: httpd_html.j2
        dest: /var/www/html/index.html
    - name: Restore SELinux
      command:
        cmd: restorecon -rv /var/
    - name: Add firewall rules
      firewalld:
        service: http
        state: enabled
        permanent: true
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable Apache httpd
      service:
        name: httpd
        state: started
        enabled: true

用于复制的文件在以下截图中显示:

图 8.25 – httpd.j2

图 8.25 – httpd.j2

在以下截图中,我们可以看到用于配置 Web 主机时进行 httpd_html 转换的 .j2 模板文件:

图 8.26 – httpd_html.j2

图 8.26 – httpd_html.j2

接下来,我们将在同一个剧本中配置 NGINX Web 服务器,具体见以下代码:

        state: started
        enabled: true
- name: Install and configure nginx
  hosts: rhel2.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install Nginx
      package:
        name: nginx
        state: latest
    - name: Create web server directory
      file:
        path: /srv/website/www
        state: directory
        mode: '0755'
    - name: Copy Nginx web server configuration
      template:
        src: nginx.j2
        dest: /etc/nginx/conf.d/website.conf
    - name: Copy Nginx web server index.html
      template:
        src: nginx_html.j2
        dest: /srv/website/www/index.html
    - name: Restore SELinux
      command:
        cmd: restorecon -rv /srv/
    - name: Add firewall rules
      firewalld:
        service: http
        state: enabled
        permanent: true
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable Nginx
      service:
        name: nginx
        state: started
        enabled: true

在这一部分剧本中使用的文件可以在以下截图中找到:

图 8.27 – nginx.j2

图 8.27 – nginx.j2

在以下截图中,我们可以看到 .j2 文件,它允许我们复制 NGINX Web 服务器的配置:

图 8.28 – nginx_html.j2

图 8.28 – nginx_html.j2

在这些 Web 服务器配置完成后,我们还需要设置 HAProxy,正如剧本剩余部分所示:

    - name: Start and enable Nginx
      service:
        name: nginx
        state: started
        enabled: true
- name: Install and configure haproxy
  hosts: rhel3.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install haproxy
      package:
        name: haproxy
        state: latest
    - name: Copy configuration file for haproxy
      template:
        src: haproxy.j2
        dest: /etc/haproxy/haproxy.cfg
    - name: Add firewall rules
      firewalld:
        service: http
        state: enabled
        permanent: true
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable haproxy
      service:
        name: haproxy
        state: started
        enabled: true

用于配置 HAProxy 的文件可以在以下截图中找到:

图 8.29 – haproxy.j2

图 8.29 – haproxy.j2

在创建好剧本和支持文件后,我们按如下方式运行剧本:

ansible-playbook -i inventory web_servers.yml -u emcleroy -k --ask-become

如以下截图所示,我们已成功运行剧本:

图 8.30 – Ansible 自动化剧本成功运行

图 8.30 – Ansible 自动化剧本成功运行

在剧本成功运行后,我们可以浏览到 rhel3.example.com,它将通过两个后端服务器进行轮询。

在本节中,我们学习了如何创建 Apache httpd Web 服务器和 NGINX Web 服务器。我们还学习了如何配置 HAProxy 以实现负载均衡和为 Web 服务器提供高可用性。这使得我们能够在不让客户察觉的情况下将服务器从轮询中移除,所有这些都是通过 Ansible 自动化剧本实现的。

摘要

在本章中,我们学习了 Web 服务器以及如何创建不同版本的 Apache 和 NGINX。我们学习了如何控制服务器访问,并解决了在配置过程中遇到的问题。通过 HAProxy,我们学习了如何通过负载均衡引导流量,确保我们始终有服务器为最终用户提供服务。在下一章中,我们将总结本书所学的内容,并进行概览,之后是实践考试题。这将帮助你为考试做好准备,并巩固你在学习本书过程中所学的信息。在下一章中,我们将通过模拟考试题为考试日做准备。我期待着在那儿见到你们,并帮助你们成功通过 EX358 认证考试。

第九章:综合复习与模拟考试问题

在本章中,我们将回顾整个书籍中所学的内容。我们将通过模拟考试题目,帮助你熟悉考试中可能遇到的题型格式。我们将尽量覆盖根据 Red Hat 公开的考试目标可能出现在考试中的所有内容,详情请见:www.redhat.com/en/services/training/ex358-red-hat-certified-specialist-services-management-automation-exam?section=Objectives

本章的目标是帮助你充分准备考试,增强信心,并提供你通过考试所需的信息。我们将讨论一些直到现在本书中未涉及的内容,并在进行每个主题时进行详细解释。我们还将讨论如何手动完成每个问题的请求,并使用 Ansible 自动化完成这些任务。我们开始吧。

在本章中,我们将涵盖以下内容:

  • 对所有考试目标的综合复习,以及模拟考试,帮助你测试新学到的技能

技术要求

我们将使用第一章中所用的系统配置,块存储——学习如何在 Red Hat Enterprise Linux 上配置块存储。我们将结合第三章中的附加网络接口控制器NICs)配置,用于团队合作练习。该内容可以在第三章中找到,链路聚合创建——创建你自己的链路并掌握网络领域。这将使你能够像在考试环境中一样使用所有即将出现的问题。

设置 GitHub 访问权限

请参考第一章的说明,块存储——学习如何在 Red Hat Enterprise Linux 上配置块存储,以便访问本书的 GitHub 仓库。你可以在以下链接找到本章的 Ansible 自动化剧本:github.com/PacktPublishing/Red-Hat-Certified-Specialist-in-Services-Management-and-Automation-EX358-Exam-Guide/tree/main/Chapter09。记住,这些是建议的剧本,并不是你实现目标的唯一方法。

你可以随时使用rawshellcmd来改变它们,以实现相同的结果,但我们演示的是完成目标的最佳方法。此外,请记住,我们没有使用 Ansible 未来版本中所需的 FCQN,因为在考试中不会支持它,考试是基于 Ansible 2.9 版本的。

对所有考试目标和模拟考试的全面复习,帮助你测试新学到的技能

我们将呈现一个结合了你在整本书中学到的技能的模拟考试。我们将根据你在考试中可能遇到的项目深入讨论细节。这将帮助你准备参加 EX358 考试。这些不是官方问题;否则,它们不会出现在本书中。相反,它们是你可能遇到的理论场景,具有不同的信息。请按照章节开头所述设置你的配置,然后记录下你的 IP 地址、系统名称等信息。这样,在考试时你可以快速获取所需的信息,以免被拖慢速度,因为你只有 4 个小时。

让我们开始考试吧。我们将从我的实验室的信息开始,给你一个如何为你的设置编写文档的概念:

Username: emcleroy
Password: redhat
Admin username: root
Admin password: redhat
Node1: rhel1.example.com 192.168.1.198
Node2: rhel2.example.com 192.168.1.133
Node3: rhel3.example.com 192.168.1.53   Ansible control node

你可以看到我已经获得了所需的信息。如果你配置了 DNS 或主机文件来使用主机名,那么你可以轻松连接到你的设备。这也使得在 Ansible 清单中使用清单文件变得稍微简单一些,因为你不需要添加 ansible_host 参数。为了我们的目的,我仍将在我的清单文件中使用 ansible_host

另一个让一切变得更简单的方法是设置 RSA 密钥并在系统间共享它们,而不是使用密码。这个过程在第一章块存储—学习如何在红帽企业 Linux 上配置块存储中也有展示。这样做使得运行 playbooks 更加容易,因为它们不需要使用 -u emcleroy -k --ask-become 这一命令部分来传递 SSH 和提升权限的密码。我们将使用带有额外参数的命令,以确保你理解如何在考试中使用完整命令(如果需要的话)。

在你按照要求设置好系统后,我们将开始模拟考试,并通过每个主题复习我们所学的内容。问题将按照红帽在目标页面上列出的顺序呈现,页面地址是:www.redhat.com/en/services/training/ex358-red-hat-certified-specialist-services-management-automation-exam?section=Objectives

问题如下。答案将直接跟在问题后面,但请尝试在不查看答案的情况下回答问题。我建议在查看答案之前先自己尝试回答这些问题。如果你感到卡住了,可以随时查看答案并阅读解决方案以刷新记忆。

管理网络服务

管理网络服务是我们考试的第一个目标,正如红帽所指出的那样。

首先,我们将设置网络接口的 IP 连通性。

问题 1 – 对于这个问题,我们希望你为服务器上的网卡配置静态地址。使用 DHCP 分配的 IP 地址时,我们希望你更改为开始时所注明的静态 IP 地址。(这些地址会根据你的网络而有所不同):

Rhel1 DHCP IP: 192.168.1.81
Rhel2 DHCP IP: 192.168.1.65
Rhel1 Static IP: 192.168.1.198
Rhel2 Static IP: 192.168.1.133
The subnet is 192.168.1.0/24

一旦这些设置为静态,你应该能够在这两者之间进行路由。

答案 1 – 要手动设置静态 IP,我们需要通过 SSH 使用 DHCP 分配的 IP 地址连接到设备,然后将其修改为静态地址。

首先,我们将使用nmtui命令:

图 9.1 – NetworkManager TUI 初始显示

图 9.1 – NetworkManager TUI 初始显示

然后,我们将选择编辑连接,从那里你将看到可用的接口,如下图所示:

图 9.2 – NMTUI 接口选择

图 9.2 – NMTUI 接口选择

选择要更改的接口后,我们将继续进行设置,启用静态 IP,如下图所示:

图 9.3 – 为选定接口选择手动设置

图 9.3 – 为选定接口选择手动设置

然后,我们将配置所需的设置,例如静态 IP、网关和 DNS 服务器,如下图所示:

图 9.4 – 静态 IP、网关和 DNS 设置

图 9.4 – 静态 IP、网关和 DNS 设置

保存这些设置后,我们需要重新启动网络接口,以便它切换到新配置的 IP。我们将使用以下命令来完成此操作:

[emcleroy@rhel1 ~]$ sudo systemctl restart NetworkManager

接下来,我们将测试以确保新地址可达,如下图所示,使用ping测试:

图 9.5 – IP ping 测试以确保连通性

图 9.5 – IP ping 测试以确保连通性

接下来,我们将深入了解为之前配置的网络接口设置 IPv6 地址的配置。

问题 2 – 对于这个问题,我们希望你为已经配置的网卡设置 IPv6 地址,同时保持 IPv4 连接:

Rhel1 IPv6: fc65:8956:7254:6321::a7/64
Rhel2 IPv6: fc65:8956:7254:6321::a8/64
Subnet: fc65:8956:7254:6321::/64

这些应该是可路由的,并且一旦更改完成,你应该也能保持 IPv4 的可路由连通性。

答案 2 – 我们将使用nmtui命令来设置此项:

图 9.6 – NMTUI 网络菜单

图 9.6 – NMTUI 网络菜单

在启动nmtui菜单后,我们将选择编辑连接,这会将你带到以下截图所示的菜单:

图 9.7 – NMTUI 接口选择界面

图 9.7 – NMTUI 接口选择界面

在选择正确的接口后——在我们的情况下是enp0s3,但在你的设置中,可能会有所不同——我们将能够进行配置更改,如下图所示:

图 9.8 – NMTUI 接口配置设置

图 9.8 – NMTUI 接口配置设置

选择手动配置IPv6 配置后,我们可以编辑 IPv6 地址和网关的值,具体如下截图所示:

图 9.9 – IPv6 接口设置

图 9.9 – IPv6 接口设置

配置设置完成后,我们将保存配置。为了使更改生效,我们需要运行以下命令来刷新连接:

[emcleroy@rhel1 ~]$ sudo systemctl restart NetworkManager

在两个服务器配置完成后,我们可以运行 IPv6 ping 测试,检查两端接口的连通性,具体如下截图所示:

图 9.10 – IPv6 ping 测试

图 9.10 – IPv6 ping 测试

我们已经展示了解决配置网络问题的一种方法。接下来,我们将处理防火墙服务。

管理防火墙服务

在本节中,我们将讨论如何设置防火墙规则。我们将讨论 rich 规则以及其他可能阻止特定连接并允许尚未允许的网络流量的项。

问题 1 – 对于此问题,我们希望您允许通过防火墙访问服务和端口。这将允许连接到可能在您的生产服务器上运行的 Web 服务。请打开以下访问权限:

Services: http and https

请手动执行此操作,并在 Ansible 自动化剧本中进行设置。

答案 1 – 我们将使用以下命令设置防火墙,允许连接到这些服务:

图 9.11 – 用于允许服务连接的防火墙命令

图 9.11 – 用于允许服务连接的防火墙命令

设置firewalld服务的 Ansible 剧本如下:

- name: firewalld configuration
  hosts: all
  become: true
  become_method: sudo
  tasks:
    - name: Enable Firewalld services
      firewalld:
        permanent: yes
        immediate: yes
        service: "{{ item }}"
        state: enabled
      loop:
        - http
        - https
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Show open services and ports
      command:
        cmd: firewall-cmd --list-all

请参见以下截图,参考您的清单:

图 9.12 – 所有实验室的剧本清单

图 9.12 – 所有实验室的剧本清单

在我们使用ansible-playbook -i inventory firewalld.yml -u emcleroy -k --ask-become -v设置并运行剧本后,屏幕截图中将显示以下输出:

图 9.13 – 成功完成 Ansible 剧本

图 9.13 – 成功完成 Ansible 剧本

问题 2 – 对于这个问题,我们希望您通过192.168.1.0/24网络域提供 HTTP 访问,但阻止通过172.16.1.0/24网络域的访问。

请手动执行此操作,并在 Ansible 自动化剧本中进行设置。

答案 2 – 我们将使用firewall-cmd的 rich 规则来完成这一更改。我们将使用以下命令成功完成此操作:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 service name=http accept'
success
[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=http reject'
success
[emcleroy@rhel1 ~]$ sudo firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.1.0/24" service name="http" accept
rule family="ipv4" source address="172.16.1.0/24" service name="http" reject
[emcleroy@rhel1 ~]$ sudo firewall-cmd --reload
success

现在,让我们创建一个 Ansible 剧本,执行相同的防火墙规则更改,见以下剧本:

- name: Firewalld Rich Rule
  hosts: all
  become: true
  become_method: sudo
  tasks:
    - name: Set rich rules up on firewall
      firewalld:
        permanent: yes
        immediate: yes
        rich_rule: "{{ item }}"
        state: enabled
      loop:
       - 'rule family=ipv4 source address=192.168.1.0/24 service name="http"  accept'
       - 'rule family=ipv4 source address=172.16.1.0/24 service name="http" reject'
    - name: Show rich rules
      command:
        cmd: firewall-cmd --list-rich-rules
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload

在我们使用ansible-playbook -i inventory richrule.yml -u emcleroy -k –ask-become -v运行 playbook 后,我们将看到以下截图中的输出:

图 9.14 – 成功完成 Ansible playbook 的输出

图 9.14 – 成功完成 Ansible playbook 的输出

管理 SELinux

在本节中,我们将致力于解决在创建文件和文件夹时的 SELinux 问题,以确保没有权限问题。

问题 1 – 对于这个问题,我们希望你在根目录创建一个文件夹和一个文本文件,然后修复 SELinux 上下文,确保权限正确:

Folder: /srv/test
File: /srv/test/text.txt
File body: Testing SELinux contexts.

请手动执行此操作,并且将其设置在 Ansible 自动化 playbook 中。

答案 1 – 我们将使用以下命令成功创建并解决任何 SELinux 上下文问题:

[emcleroy@rhel1 ~]$ sudo mkdir /srv/test
[emcleroy@rhel1 ~]$ sudo vi /srv/test/text.txt
[emcleroy@rhel1 ~]$ restorecon -Rv /srv/test
[emcleroy@rhel1 ~]$ ls -lZ /srv/test
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:var_t:s0 33 Oct  8 09:16 text.txt

接下来,我们将使用 Ansible playbook 完成此操作,如下所示:

- name: SELinux training
  hosts: all
  become: true
  become_method: sudo
  tasks:
    - name: Create directory
      file:
        path: /srv/test
        state: directory
        mode: '0755'
    - name: Create a file in the directory
      copy:
        dest: "/srv/test/text.txt"
        content: |
          Thank you for reading my book!!!
    - name: Restore any SELinux issues if they exist
      command:
        cmd: restorecon -Rv /srv/test
    - name: View attributes
      command:
        cmd: ls -lZ /srv/test

创建完 Ansible playbook 后,我们将使用以下命令运行它:ansible-playbook -i inventory selinux.yml -u emcleroy -k --ask-become -v。你可以在以下截图中看到运行结果:

图 9.15 – 成功运行 Ansible 自动化 playbook 的输出

图 9.15 – 成功运行 Ansible 自动化 playbook 的输出

本节中我们学习了如何通过简单易记的命令解决 SELinux 在处理文件和文件夹时的问题,这些命令应该可以解决你在考试中遇到的问题。接下来,我们将展示如何控制在服务器上运行的系统进程。

管理系统进程

在本节中,我们将启动并启用服务。我们还将安装所需的包,以便启动和启用尚未运行的服务。我们以postgresql为例,但这适用于所有你安装的服务,如 DHCP、DNS 和 SMB。

问题 1 – 对于这个问题,我们希望你在rhel1上安装postgresql并启动和启用它。

请手动执行此操作,并且将其设置在 Ansible 自动化 playbook 中。

答案 1 – 我们将使用以下命令在rhel1上安装、启用并启动postgresql

[emcleroy@rhel1 ~]$ sudo dnf install @postgresql
[emcleroy@rhel1 ~]$ sudo systemctl enable postgresql
[emcleroy@rhel1 ~]$ sudo postgresql-setup --initdb
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
[emcleroy@rhel1 ~]$ sudo systemctl start postgresql

在我们手动完成postgresql的安装和启动后,需要卸载postgresql,以便 Ansible 可以重新安装它。我们将使用以下命令从rhel1中删除postgresql

sudo dnf remove @postgresql

一旦postgresql被移除,我们将设置一个 Ansible playbook,按照以下步骤安装、启用并启动postgresql服务:

- name: Install package, enable and start it.
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install postgresql
      command:
        cmd: "dnf install @postgresql -y"
    - name: Initialize the database
      command:
        cmd: postgresql-setup --initdb
      ignore_errors: true
    - name: Enable and start postgresql service
      service:
        name: postgresql
        state: started
        enabled: true
    - name: Check to ensure service is started
      command:
        cmd: systemctl status postgresql

我们在初始化步骤中添加了ignore_errors,这是因为可能出现一些不影响启动或启用服务的失败。

完成 playbook 编写后,我们将使用ansible-playbook -i inventory postgresql.yml -u emcleroy -k --ask-become -v命令运行它。运行 playbook 的结果如下面的截图所示:

图 9.16 – 成功运行 postgresql playbook

图 9.16 – 成功运行 postgresql playbook

在本节中,我们学习了如何使用postgresql服务为例安装、启动和启用服务。这些命令可以用于你在 RHEL 8.1 系统上安装的所有服务。在下一节中,我们将深入探讨网络团队配置。

管理链路聚合

在本节中,我们将设置网络团队:

问题 1 —— 对于这个问题,我们希望你在设置过程中为额外的网卡配置网络团队:

Rhel1 IPv4: 192.168.1.225
Rhel2 IPv4: 192.168.1.226

我的设置中,网卡是enp0s8enp0s9——你的设置可能会有所不同,具体取决于你的配置。将连接设置为循环轮询(round-robin)方式。设置完成后,你应该能够通过这些 IP 连接到每台服务器。无论两个网卡都正常工作,还是其中一个网卡发生故障,你都应该能与网络团队保持连接。你的主 SSH IP 应该始终保持连接。

请手动完成此操作,并将其也设置为 Ansible 自动化的 playbook。

答案 1 —— 我们将使用以下命令在两台系统上设置团队。请确保为每台服务器使用正确的 IPv4 地址:

[emcleroy@rhel1 ~]$ sudo nmcli con add type team con-name team1 ifname team1 team.runner roundrobin
Connection 'team1' (58770e3c-89bf-4a87-9b26-e9ad581ef978) successfully added.
[emcleroy@rhel1 ~]$ sudo nmcli con add type ethernet slave-type team con-name team1-enp0s8 ifname enp0s8 master team1
Connection 'team1-enp0s8' (3886d9f8-2db6-4269-9d9b-2973b24f74ce) successfully added.
[emcleroy@rhel1 ~]$ sudo nmcli con add type ethernet slave-type team con-name team1-enp0s9 ifname enp0s9 master team1
Connection 'team1-enp0s9' (d845c4e1-b354-4c58-904d-f9cf0c3d1e59) successfully added.
[emcleroy@rhel1 ~]$ sudo nmcli con mod team1 ipv4.addresses 192.168.1.225/24
[emcleroy@rhel1 ~]$ sudo nmcli con mod team1 ipv4.method manual
[emcleroy@rhel1 ~]$ sudo ifdown team1
Connection 'team1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[emcleroy@rhel1 ~]$ sudo ifup team1
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
[emcleroy@rhel1 ~]$ ifconfig
team1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.225  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::4036:4e32:d1af:fd0a  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:ad:b3:d8  txqueuelen 1000  (Ethernet)
        RX packets 159  bytes 8184 (7.9 KiB)
        RX errors 0  dropped 30  overruns 0  frame 0
        TX packets 8  bytes 688 (688.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

现在,重复相同的过程为Rhel2。完成后,你应该有一个正常运行的team1接口,并且使用roundrobin方式进行连接。你可以使用ping命令测试接口,如下图所示:

图 9.17 – ping 测试,确保连接到新设置的团队

图 9.17 – ping 测试,确保连接到新设置的团队

手动完成团队创建后,我们将设置一个 Ansible playbook,如下所示,用于创建团队:

- name: Create a network team
  hosts: rhel1.example.com, rhel2.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Create network team
      command:
        cmd: nmcli con add type team con-name team1 ifname team1 team.runner roundrobin
    - name: Add slave interfaces
      command:
        cmd: 'nmcli con add type ethernet slave-type team con-name team1-"{{ item }}" ifname "{{ item }}" master team1'
      loop:
        - enp0s8
        - enp0s9
    - name: Add Static IP to team1
      command:
        cmd: nmcli con mod team1 ipv4.addresses "{{ team_ip }}"
    - name: Add interface method
      command:
        cmd: nmcli con mod team1 ipv4.method manual

然后,我们将向库存中添加主机变量,以便每台服务器都能获得正确的 IP,如下图所示:

图 9.18 – 更新后的库存文件,包含主机变量

图 9.18 – 更新后的库存文件,包含主机变量

创建完 playbook 后,我们可以使用ansible-playbook -i inventory networkteam.yml -u emcleroy -k --ask-become -v命令运行它——部分输出如下图所示:

图 9.19 – 成功的网络团队 playbook 运行

图 9.19 – 成功的网络团队 playbook 运行

在本节中,我们学习了如何将网络接口组合在一起,以提供多个网卡的冗余。接下来的章节中,我们将设置和管理 DNS 服务。

管理 DNS

在本节中,我们将设置一个 DNS 服务器。

问题 1 —— 对于这个问题,我们希望你设置一个 DNS 服务器。我们希望你为 IPv4 添加正向和反向记录。我们将在rhel1.example.com上设置 DNS 服务器。

正向和反向(即 PTR)记录将使用以下信息:

rhel1.example.com – 192.168.1.198
rhel2.example.com – 192.168.1.133
rhel3.example.com – 192.168.1.53

答案 1 —— 我们将首先安装bind包:

[emcleroy@rhel1 ~]$ sudo dnf install bind -y

接下来,我们将设置防火墙规则,以允许连接并传递 DNS 记录:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service=dns
success
[emcleroy@rhel1 ~]$ sudo firewall-cmd --reload
Success

从安装软件包到设置防火墙规则,我们现在将配置 DNS 文件/etc/named.conf。该文件应该像以下截图所示:

图 9.20 – 配置示例设置

图 9.20 – 配置示例设置

确保在配置文件中包含新的区域,如下截图所示:

图 9.21 – 配置文件中的区域信息

图 9.21 – 配置文件中的区域信息

接下来,我们需要在/var/named目录中创建区域文件。这些文件将包括192.168.1.zoneexample.com.zone的正向和反向区域记录。我们可以在以下截图中看到每个文件的示例:

图 9.22 – DNS 区域文件设置

图 9.22 – DNS 区域文件设置

在设置完正向区域后,我们将设置反向区域,如以下截图所示:

图 9.23 – 反向区域文件

图 9.23 – 反向区域文件

接下来,我们将启动并启用bind包安装的named服务,用于运行 DNS 服务器:

[root@rhel1 named]# systemctl enable named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.
[root@rhel1 named]# systemctl start named

然后,我们将进行查找,以确保获取到正确的地址:

[root@rhel1 named]# nslookup rhel2.example.com 192.168.1.198
Server:          192.168.1.198
Address:  192.168.1.198#53
Name: rhel2.example.com
Address: 192.168.1.133

接下来,我们将使用 Ansible 自动化通过以下剧本和模板进行安装:

---
- name: Install and configure DNS
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install DNS server
      package:
        name: bind
        state: latest
    - name: Move bind configuration to named.conf
      template:
        src: "{{ playbook_dir }}/named.conf.j2"
        dest: "/etc/named.conf"
    - name: Move example.com.zone and 192.168.1.zone to /var/named
      template:
        src: "{{ playbook_dir}}/{{ item }}.j2"
        dest: "/var/named/{{ item }}"
      loop:
        - 'example.com.zone'
        - '192.168.1.zone'
    - name: Set firewall rules
      firewalld:
        service: dns
        permanent: true
        state: enabled
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable the DNS service
      service:
        name: named
        state: restarted
        enabled: true

以下是需要在剧本执行过程中成功修改配置文件的模板。首先是named.conf.j2配置文件:

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
     listen-on port 53 { 127.0.0.1; 192.168.1.198; };
     listen-on-v6 port 53 { ::1; };
     directory  "/var/named";
     dump-file  "/var/named/data/cache_dump.db";
     statistics-file "/var/named/data/named_stats.txt";
     memstatistics-file "/var/named/data/named_mem_stats.txt";
     secroots-file   "/var/named/data/named.secroots";
     recursing-file  "/var/named/data/named.recursing";
     allow-query     { localhost; 192.168.1.198; };
     recursion no;
     dnssec-enable yes;
     dnssec-validation yes;
     managed-keys-directory "/var/named/dynamic";
     pid-file "/run/named/named.pid";
     session-keyfile "/run/named/session.key";
     /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
     include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "example.com" IN {
        type master;
        file "example.com.zone";
        forwarders {};
};
zone "192.168.1.in-addr.arpa" IN {
        type master;
        file "192.168.1.zone";
        forwarders {};
};
zone "." IN {
     type hint;
     file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

然后,我们需要提供 DNS 记录的区域文件。首先是example.com.zone.j2文件:

$TTL 3H
@       IN SOA rhel1.example.com. admin.example.com (
2; serial
65; refresh
75; retry
8000; expire
60) ; minimum
        NS      rhel1
        A       127.0.0.1
        AAAA    ::1
rhel1        IN  A 192.168.1.198
rhel2        IN  A 192.168.1.133
rhel3        IN  A 192.168.1.53

最后,我们将为指针记录PTR)记录添加192.168.1.zone.j2,也就是反向查找区域文件:

$TTL 3H
@       IN SOA rhel1.example.com. admin.example.com. (
                                        2       ; serial
                                        8000      ; refresh
                                        9000      ; retry
                                        10000      ; expire
                                        5000)    ; minimum
        NS      rhel1.example.com.
198        IN  PTR  rhel1.example.com.
133        IN  PTR  rhel2.example.com.
53         IN  PTR  rhel3.example.com.

在创建完剧本后,我们运行命令ansible-playbook -i /home/emcleroy/playbooks/inventory dns.yml -u emcleroy -k --ask-become -v,并可以在以下截图中看到成功的输出:

图 9.24 – 通过 Ansible 自动化成功部署 DNS 服务器

图 9.24 – 通过 Ansible 自动化成功部署 DNS 服务器

管理 DHCP

在本节中,我们将设置一个 DHCP 服务器。

问题 1 – 对于这个问题,我们希望你在rhel1.example.com上设置一个 DHCP 服务器,服务192.168.1.0/24子网,提供可用的 IP 范围192.168.1.100192.168.1.220。DNS 服务器是192.168.1.198或你的rhel1.example.com IP 地址。我们希望以下静态条目:

rhel4.example.com MAC Address: 08:00:27:AB:81:10 IP: 192.168.1.120
rhel5.example.com MAC Address: 08:00:27:AB:81:11 IP: 192.168.1.121

答案 1 – 我们将首先安装dhcp-server软件包,如下所示:

[emcleroy@rhel1 ~]$ sudo dnf install dhcp-server -y

接下来,我们将设置dhcp文件,以便在/etc/dhcp/dhcpd.conf中提供 IP 范围,如以下截图所示:

图 9.25 – DHCP 服务器配置文件

图 9.25 – DHCP 服务器配置文件

请记住,无需记住所有行,因为安装后提供了一个示例,您可以在此找到:/usr/share/doc/dhcp-server/dhcpd.conf.example。设置完 DHCP 配置文件后,我们将开放防火墙规则,并启动和启用服务器上的dhcp服务:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service=dhcp
[emcleroy@rhel1 ~]$ firewall-cmd –reload
[emcleroy@rhel1 ~]$ sudo systemctl start dhcpd
[emcleroy@rhel1 ~]$ sudo systemctl enable dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.

现在,让我们使用 Ansible 自动化设置 DHCP 服务器。我们将从以下 playbook 开始:

---
- name: Install and configure DHCP
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install dhcp server
      package:
        name: dhcp-server
        state: latest
    - name: Copy the dhcpd.conf file to the server
      template:
        src: "{{ playbook_dir }}/dhcpd.conf.j2"
        dest: /etc/dhcp/dhcpd.conf
    - name: Open firewall rules
      firewalld:
        service: dhcp
        permanent: true
        state: enabled
    - name: Reload firewall rules
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable dhcp server
      service:
        name: dhcpd
        enabled: true
        state: restarted

以下代码显示dhcpd.conf.j2文件的内容:

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.220;
  option broadcast-address 192.168.1.255;
  option domain-name-servers 192.168.1.198;
}
host rhel4 {
  hardware ethernet 08:00:27:AB:81:10;
  fixed-address 192.168.1.120;
}
host rhel5 {
  hardware ethernet 08:00:27:AB:81:11;
  fixed-address 192.168.1.121;
}

创建完 playbook 后,我们可以使用ansible-playbook -i inventory dhcp.yml -u emcleroy -k --ask-become -v命令成功运行 Ansible playbook,如下截图所示:

图 9.26 – 成功的 DHCP 服务器 playbook 运行

图 9.26 – 成功的 DHCP 服务器 playbook 运行

本节中,我们学习了如何设置 DHCP 服务器,包括配置文件中的静态条目。在下一节中,我们将处理您在家或工作中的网络打印机。

打印机管理

本节中,我们将管理网络打印机。

问题 1 – 对于这个问题,我们希望您在rhel1.example.com上设置一个网络打印机。请设置一个名为myqueue的打印队列。如果您有网络打印机,您可以进行测试。如果没有,您将无法测试该解决方案/答案。

答案 1 – 我们将从在系统上安装cups开始:

[emcleroy@rhel1 ~]$ sudo dnf install cups -y

然后,我们将启用并启动cups打印服务:

[emcleroy@rhel1 ~]$ sudo systemctl enable cups
[emcleroy@rhel1 ~]$ sudo systemctl start cups

接下来,我们将允许mdns防火墙规则,允许访问打印服务:

[emcleroy@rhel1 ~]$ sudo firewall-cmd --permanent --add-service=mdns
success
[emcleroy@rhel1 ~]$ sudo firewall-cmd --reload
success

我们将使用ippfind命令查找可用的打印机。以我为例,我将使用Brother

[emcleroy@rhel1 ~]$ ippfind -T 5
ipp://BRW9C305BC2B044.local:631/ipp/print
ipp://BRW9C305BC2B044.local:631/ipp/print

接下来,我们将使用ipp地址创建打印队列myqueue,并将打印机添加到队列中:

[emcleroy@rhel1 ~]$ lpadmin -p myqueue -v ipp://BRW9C305BC2B044.local:631/ipp/print -m everywhere -E

如果遇到lpadmin: Unable to connect to "BRW9C305BC2B044.local:631": Name or service not known错误,请确保您的 DNS 能够解析该本地地址。如果不能,请在/etc/hosts文件中添加主机记录,将短名称或 URL 映射到 IP 地址。

最后,我们将设置打印的默认队列目标:

[emcleroy@rhel1 ~]$ lpadmin -d myqueue

接下来,我们将使用以下 playbook 通过 Ansible 自动化设置打印机:

---
- name: Install cups, print queue, and printer
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install cups
      package:
        name: cups
        state: latest
    - name: Enable firewall rules
      firewalld:
        permanent: true
        state: enabled
        service: mdns
    - name: Reload Firewall
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable cups
      service:
        name: cups
        state: started
        enabled: true
    - name: Create print queue
      command:
        cmd: lpadmin -p myqueue -v ipp://BRW9C305BC2B044.local:631/ipp/print -m everywhere -E
    - name: Set default print destination
      command:
        cmd: lpadmin -d myqueue

创建完 playbook 后,我们可以使用ansible-playbook -i inventory cups.yml -u emcleroy -k --ask-become -v命令成功运行 Ansible playbook,如下截图所示:

图 9.27 – 成功的 cups playbook 运行

图 9.27 – 成功的 cups playbook 运行

本节中,我们学习了如何连接到可用的网络打印机,供日常工作使用。在下一节中,我们将向您展示如何在服务器上设置电子邮件服务。

电子邮件服务管理

本节中,我们将在服务器上创建电子邮件服务。

问题 1 – 对于此问题,我们希望你在rhel1.example.com上创建一个空客户端。我们希望所有本地递送的邮件都能转发到rhel2.example.com,并正常送达邮件服务:

myorigin: example.com
relayhost: rhel2.example.com

答案 1 – 我们将首先安装postfix,然后设置问题中提到的正确参数,确保邮件服务器不接受外部或内部邮件:

[root@rhel1 ~]# sudo dnf install postfix -y
[root@rhel1 ~]# sudo postconf -e "inet_interfaces = loopback-only"
[root@rhel1 ~]# sudo postconf -e "myorigin = example.com"
[root@rhel1 ~]# sudo postconf -e "inet_protocols = ipv4"
[root@rhel1 ~]# sudo postconf -e "mydestination ="
[root@rhel1 ~]# sudo postconf -e "mynetworks = 127.0.0.0/8"
[root@rhel1 ~]# sudo postconf -e "local_transport = error: no local delivery"
[root@rhel1 ~]# sudo postconf -e "relayhost = [rhel2.example.com]"
[root@rhel1 ~]# sudo systemctl start postfix
[root@rhel1 ~]# sudo systemctl enable postfix
Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service.

请记住,如果考试要求你为 IPv6 进行设置,请确保同时为 IPv4 和 IPv6 设置inet_protocols

接下来,我们将创建一个 Ansible 剧本来完成这个过程:

 ---
- name: Configure Null Client Email Service
  become: true
  hosts: rhel1.example.com
  vars:
    postfix_conf:
      relayhost: "[??.example.com]"
      inet_interfaces: "loopback-only"
      mynetworks: "127.0.0.0/8"
      myorigin: "example.com"
      mydestination: ""
  roles:
    - linux-system-roles.postfix

在我们创建剧本后,我们将使用ansible-playbook -i inventory email.yml -u emcleroy -k --ask-become -v命令,并成功运行 Ansible 剧本,如下图所示:

图 9.28 – 成功运行的 Ansible 剧本,用于邮件服务

图 9.28 – 成功运行的 Ansible 剧本,用于邮件服务

在本节中,我们向你展示了如何修改邮件服务,并提供了设置空客户端配置的示例。在下一节中,我们将讨论 MariaDB 配置和管理。

管理 MariaDB 数据库服务器

在本节中,我们将安装 MariaDB,添加表,备份,恢复之前存储在列和表中的内容,并搜索数据库。

问题 1 – 对于此问题,我们将安装并安全设置 MariaDB,使得root只能本地访问,并且root的密码是redhat。我们还将执行以下操作:

  • 创建一个名为available_stock的数据库

  • 创建用户fred,设置密码redhat,并赋予其在数据库清单上的完全用户权限

  • 创建数据库清单的备份

  • 恢复数据库清单的备份

答案 1 – 我们将首先安装mariadb服务器,启动并启用它,然后进行安全安装:

[emcleroy@rhel1 ~]$ sudo dnf install @mariadb -y
[root@rhel1 ~]# systemctl start mariadb
[root@rhel1 ~]# systemctl enable mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@rhel1 ~]# mysql_secure_installation

我们将在安全安装过程中选择仅允许本地的root用户。我们将选择删除测试数据库,并在此时为root设置密码。

在启动 MariaDB 并进行安全安装后,我们将登录并创建数据库和用户:

[root@rhel1 ~]# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE available_stock;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> USE  available_stock;
Database changed
MariaDB [available_stock]> CREATE USER fred@localhost identified by 'redhat';
Query OK, 0 rows affected (0.000 sec)
MariaDB [available_stock]> GRANT INSERT, UPDATE, DELETE, SELECT on available_stock.* to fred@localhost;
Query OK, 0 rows affected (0.000 sec)

接下来,我们将备份数据库:

[root@rhel1 ~]# mysqldump available_stock -u root -p
> test.dump
Finally, to restore the dump we are going to simply change the direction of the symbol:
[root@rhel1 ~]# mysqldump -u root -p available_stock
< test.dump

对于 Ansible 剧本,我们将对其进行修改,并以稍有不同的方式,仅设置数据库。我们将通过如下所示的 Ansible 自动化剧本来设置 MariaDB 数据库:

---
- name: MariaDB install and configuration
  hosts: rhel2.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install MariaDB server
      package:
        name: '@mariadb:10.3/server'
        state: present
    - name: Install MariaDB client
      package:
        name: mariadb
        state: latest
    - name: Start and enable MariaDB
      service:
        name: mariadb
        state: started
        enabled: true
    - name: Open firewall rules for MariaDB
      firewalld:
        service: mysql
        permanent: true
        state: enabled
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Set root password for MariaDB
      mysql_user:
        name: root
        host_all: true
        update_password: always
        password: redhat
      no_log: true
      ignore_errors: true

在我们完成创建剧本之后,我们将运行ansible-playbook -i inventory mariadb.yml -u emcleroy -k --ask-become -v命令,并在以下截图中查看剧本的成功输出:

图 9.29 – 成功运行的 MariaDB 剧本

图 9.29 – 成功运行的 MariaDB 剧本

本节我们学习了如何配置 MariaDB,包括为数据库设置用户。下一节将介绍如何设置 Web 服务器。

管理 Web 访问

在本节中,我们将使用 Apache 设置 Web 主机。

问题 1 – 对于这个问题,您需要设置一个 Apache 网络主机,通过端口 80 在浏览器中显示 rhel1.example.com 服务器。

答案 1 – 我们将首先通过以下命令在 rhel1.example.com 服务器上安装 Apache,使用 httpd 包:

[emcleroy@rhel1 ~]$ sudo dnf install httpd -y

httpd 安装成功后,我们将在默认的网页位置 /var/www/html/index.html 创建 index.html 文件。使用您喜欢的文本编辑器,创建文件并写入 此服务器正在 Apache 上运行!!!。创建文件后,我们将启动并启用服务,如下命令所示:

[emcleroy@rhel1 html]$ sudo systemctl enable httpd
[emcleroy@rhel1 html]$ sudo systemctl start httpd

在启动并启用服务后,我们需要打开防火墙规则,以便通过 HTTP 进行连接,使用以下命令:

[emcleroy@rhel1 html]$ sudo firewall-cmd --permanent --add-service=http
success
[emcleroy@rhel1 html]$ sudo firewall-cmd --reload
Success

一旦我们打开防火墙规则,就可以通过浏览器访问网页来确认是否成功。以下截图展示了成功部署 Apache httpd

图 9.30 – 成功的网络主机正在提供 index.html 文件

图 9.30 – 成功的网络主机正在提供 index.html 文件

现在,我们将通过 Ansible 自动化设置 Apache httpd,使用以下 playbook:

---
- name: Install and configure apache
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install apache httpd
      package:
        name: httpd
        state: latest
    - name: Ensure default directory exists
      file:
        path: /var/www/html
        state: directory
        recurse: yes
    - name: Copy index template
      template:
        src: "{{ playbook_dir }}/index.html.j2"
        dest: /var/www/html/index.html
    - name: Restore SELinux contexts
      sefcontext:
        target: /var/www/html
        setype: httpd_sys_content_t
        state: present
    - name: Open firewall rules
      command:
        cmd: firewall-cmd –permanent –add-service=http
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Start and enable apache httpd service
      service:
        name: httpd
        state: restarted
        enabled: true

请确保 index.html.j2 位于您的 playbook 目录中,以便成功复制。

我们将使用以下命令运行 playbook:

ansible-playbook -i inventory apache_server.yml -u emcleroy -k --ask-become -v

本节中,我们设置了 Web 服务器访问。下一节将介绍如何使用 NFS 文件共享。

管理 NFS

本节将介绍 NFS。

问题 1 – 对于这个问题,您需要在 rhel1.example.com 上创建一个 NFS 导出,将 /test 文件夹以只读权限导出到 192.168.1.0/24 网络,并且对 172.16.1.0/24 网络没有访问权限。

问题 2 – 对于这个问题,您需要将 rhel1.example.com 上的 /test 挂载到 rhel2.example.com/mnt/test 目录下,并确保它在启动时自动挂载。

答案 1 – 我们将首先使用以下命令安装 nfs-utils

[emcleroy@rhel1 ~]$ sudo dnf install nfs-utils

安装 nfs-utils 后,我们需要启用并启动服务。然后,我们将使用以下命令确保它正在运行:

[emcleroy@rhel1 ~]$ sudo systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[emcleroy@rhel1 ~]$ sudo systemctl start nfs-server
[emcleroy@rhel1 ~]$ sudo systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor >
   Active: active (exited) since Thu 2022-10-27 12:33:28 EDT; 10s ago
  Process: 71257 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then >
  Process: 71245 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
  Process: 71244 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCC>
 Main PID: 71257 (code=exited, status=0/SUCCESS)
Oct 27 12:33:28 rhel1.example.com systemd[1]: Starting NFS server and services.>
Oct 27 12:33:28 rhel1.example.com systemd[1]: Started NFS server and services.
lines 1-10/10 (END)

然后,我们将使用以下命令创建 /test 目录:

[emcleroy@rhel1 ~]$ sudo mkdir /test

之后,我们将把文件夹添加到 /etc/exports 文件中,以便以适当的权限导出它,允许来自 192.168.1.0/24 域的访问,并默认阻止来自其他网络的访问,具体如以下截图所示:

图 9.31 – 用于 NFS 共享的 exports 文件

图 9.31 – 用于 NFS 共享的 exports 文件

在我们将文件夹添加到exports列表后,我们将使用以下命令暴露 NFS 共享:

[emcleroy@rhel1 /]$ sudo exportfs -rav
exporting 192.168.1.0/24:/test

然后,我们将打开防火墙规则,以允许 NFS 服务向外部世界提供服务,使用以下命令:

[emcleroy@rhel1 /]$ sudo firewall-cmd --permanent --add-service=nfs
success
[emcleroy@rhel1 /]$ sudo firewall-cmd --reload
success

对于 Ansible 解决方案,我们将创建以下 playbook 来完成这些手动任务的自动化版本:

---
- name: Configure nfs and share folder deployment
  hosts: rhel1.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Install nfs-utils
      package:
        name: nfs-utils
        state: present
    - name: Start and enable nfs-server
      service:
        name: nfs-server
        state: started
        enabled: true
    - name: Firewall rules for nfs-server
      firewalld:
        service: nfs
        permanent: true
        state: enabled
    - name: Reload firewall
      command:
        cmd: firewall-cmd --reload
    - name: Create directory
      file:
        path: /test
        state: directory
        mode: '0755'
    - name: Add directory to exports list
      lineinfile:
        path: /etc/exports
        state: present
        line: '/test 192.168.1.0/24(ro)'
    - name: Export nfs shares
      command:
        cmd: exportfs -rav

我们将使用以下命令运行ansible-playbook -i inventory nfs_server.yml -u emcleroy -k --ask-become -v playbook,以下截图显示了 Ansible playbook 的成功执行:

图 9.32 – 成功运行的 playbook 创建 NFS 共享

图 9.32 – 成功运行的 playbook 创建 NFS 共享

答案 2 – 在完成问题 1后,我们可以开始将share文件夹附加到新机器上。在Rhel2上,我们将首先打开防火墙,以允许 NFS 连接,如下命令所示:

[emcleroy@rhel2 ~]$ sudo firewall-cmd --permanent --add-service=nfs
success
[emcleroy@rhel2 ~]$ sudo firewall-cmd --reload
success

接下来,我们将创建挂载点文件夹,以便将共享添加到/etc/fstab并进行挂载:

[emcleroy@rhel2 ~]$ sudo mkdir /mnt/test

之后,我们将把 NFS 共享添加到/etc/fstab文件中,以便它在启动时自动挂载。该文件应该如下截图所示,但根据你的测试环境设置,可能会有所不同:

图 9.33 – 显示启动时运行的挂载项的 fstab

图 9.33 – 显示启动时运行的挂载项的 fstab

一旦将其添加到fstab中,我们将使用以下命令挂载fstab中的项目:

[emcleroy@rhel2 ~]$ sudo mount -a -v
/                        : ignored
/boot                    : already mounted
swap                     : ignored
/mnt/test                : mounted

现在,为了测试这个是否有效,请使用以下命令向rhel1上的test目录添加一个文件:

[emcleroy@rhel1 /]$ sudo touch /test/test.txt

完成后,导航到/mnt/test的文件夹挂载点,并确保你可以从rhel2查看文件,使用以下命令:

[emcleroy@rhel2 ~]$ cd /mnt/test
[emcleroy@rhel2 test]$ ls -l
total 0
-rw-r--r--. 1 root root 0 Oct 27 13:05 test.txt
[emcleroy@rhel2 test]$

如你所见,你能够查看文件。现在,尝试向rhel2上的/mnt/test文件夹添加一个文件,你应该会收到一条错误信息,如下截图所示,因为这是一个只读共享:

图 9.34 – 演示无法从服务器外部写入共享中的任何文件

图 9.34 – 演示无法从服务器外部写入共享中的任何文件

现在,你已经成功挂载了只读共享,它将通过重启持续存在,因为fstab会在启动时挂载列出的挂载项。

接下来,我们将使用 Ansible 自动化完成这些手动任务。我们将使用以下 playbook 来完成共享的挂载:

---
- name: Mount nfs share
  hosts: rhel2.example.com
  become: true
  become_method: sudo
  tasks:
    - name: Create mount directory
      file:
        path: /mnt/test
        state: directory
        mode: '0755'
    - name: Add fstab mount information
      lineinfile:
        path: /etc/fstab
        state: present
        line: '192.168.1.198:/test /mnt/test nfs defaults 0 0'
    - name: Remount fstab shares
      command:
        cmd: mount -a -v

在我们创建了 playbook 后,我们将使用ansible-playbook -i inventory nfs_client.yml -u emcleroy -k --ask-become -v命令运行它。以下截图显示了 playbook 成功执行:

图 9.35 – 成功运行的 playbook 挂载 NFS 共享

图 9.35 – 成功运行的 playbook 挂载 NFS 共享

总结

在本章中,我们为你呈现了一些模拟考试题,这些题目可能以某种形式出现在实际考试中。通过这次全面的复习,我们回顾了本书中所学的内容。同时,我们还展示了完成任务的新方法,以便你进一步提高答题能力,轻松应对考试。在下一章,我们将分享一些考试技巧,帮助你在考试中节省时间,减轻压力。我们将讨论不同的应试策略,帮助你有效地应对考试要求并顺利通过。我期待提供这些技巧和经验,并希望你能从中受益,尤其是我多年来参加这些考试的经验。

第十章:帮助应对考试的提示和技巧

在本章中,我们将介绍我在多年来参加 Red Hat 考试时学到的各种技巧和窍门。虽然不会分享实际考试的内容,但会分享一些技术快捷方式和可能使您生活更轻松的实用技巧。结合本书中您迄今为止学到的内容和模拟考试问题的学习,我相信您一定会成功,但再加上几句建议,我们可以让考试当天减少一些压力。这些建议只是一些可以在考试期间让生活更轻松的做法,但并非通过考试的必要条件。那么,废话少说,让我们开始吧!

本章将涵盖以下主题:

  • 安排考试

  • 考试技巧和窍门

技术要求

我们将使用在第一章中提到的系统设置,块存储——如何在 Red Hat Enterprise Linux 上配置块存储。我们将结合使用该设置和额外网卡团队练习中使用的设置,该内容可以在第二章中找到,网络文件存储——扩展您共享数据的知识。这将使我们能够像在实际考试环境中一样解决所有即将出现的问题。

安排考试

首先,在进入考试技巧之前,您需要先预约考试。这可以通过 Red Hat 考试网站进行,网址为 www.redhat.com/en/services/certification/individual-exams。通过此网站,您可以选择通过注册并支付两张培训学分或 400 美元来预约考试。您可以选择在附近的考试中心参加考试,或选择远程考试。远程考试允许您在安全的地点使用笔记本电脑或台式机进行考试。您需要记住,在考试期间不能有任何干扰,否则考试将被中止,您将失去费用。远程考试需要以下物品:

图 10.1 – 远程考试要求

图 10.1 – 远程考试要求

在下图中,您可以看到参加远程考试的剩余要求:

图 10.2 – 额外的远程考试要求

图 10.2 – 额外的远程考试要求

在购买考试后,您可以使用调度程序来安排您的考试,可以选择远程考试或在您附近的考试中心。如您在调度程序中所见,我有一个可供安排的考试:

图 10.3 – 在 Red Hat 考试调度器中可安排的考试

图 10.3 – 在 Red Hat 考试调度器中可安排的考试

选择好考试后,接下来会出现以下屏幕,提供地点选项,如美国,以及选择考试类型,是在考试中心进行还是远程考试:

图 10.4 – 选择你的考试类型

图 10.4 – 选择你的考试类型

在我的情况下,我选择了远程考试选项:

图 10.5 – 远程考试设置

图 10.5 – 远程考试设置

以下截图展示了设置远程考试时你需要提供的下一个项目:

图 10.6 – 安排考试的额外信息

图 10.6 – 安排考试的额外信息

在你提供了所需信息之后,你将进入考试安排页面,显示可用的时间段。如果你没有看到你想要的时间段,请不要担心,通过重新加载页面并按照前面的步骤操作,可能会有人取消并释放出一个时间段,你希望选择的时间段就有可能被开放。请注意,你必须在 24 小时窗口之前取消或重新安排你的考试,否则,你将无法更改时间并且会失去付款。在这个截图中,你可以看到可用的时间段示例:

图 10.7 – 可预约考试的时间段

图 10.7 – 可预约考试的时间段

我选择了一个可用的时间段,在我的情况下是上午 11:15。这是一个 24 小时制时钟,请在安排考试时注意这一点。如果你想在下午 4:00 开始考试,你需要选择 16:00,而不是 4:00,因为那样会把考试安排在凌晨 4:00,如果安排错误,你可能会接到一个早晨的电话。

最后,一旦你选择了时间段,你将需要添加一些额外的详细信息来安排考试。你需要提供一个电话号码,如果你有,可以提供一个认证 ID,这样它就可以与您的认证资料关联。我们可以在下面的截图中看到所需的字段:

图 10.8 – 安排考试并同意条款和条件

图 10.8 – 安排考试并同意条款和条件

一旦你完成了所有这些设置并同意条款和条件,你的考试将被安排。

考试当天,你需要处于一个没有书写物的地方,周围不能有纸张或铅笔以及你的工作站之外的其他电子设备。监考员会告诉你考试期间哪些物品是可以和不可以带入的。你需要将手机放在远离你的地方,并调至静音状态,以防监考员需要通过屏幕提示与你联系而无法联系到你。考试期间,你的身份证在验证后也需要放在视线外。你可以在考试期间喝饮料;但是,监考员会检查饮料容器,因此确保容器上没有书写,以便获得最佳的考试体验。你也可以在监考员提供的时间段内使用洗手间。请注意,如果你选择在 1 小时 55 分钟时上洗手间,可能就不需要进行第二次房间检查,除了因休息而进行的检查。

我为自己在其中一个小屋里设置了一个安静的地方,确保隐私性和完全的网络连接。如推荐所示,我已将以太网电缆布置到小屋,并为我的笔记本电脑配备了不间断电源UPS)。我发现使用笔记本电脑屏幕有些困难,因为它比我习惯的要小,因此我建议使用一个你自己习惯的显示器,因为你只能使用一个显示器,因此你需要最大化你的空间。这意味着如果你使用笔记本电脑,它必须保持关闭并连接到显示器,因为你不能使用两个显示器。

一旦你设置好一个安静的地方来安全地参加考试,你应该在考试环境中进行兼容性测试(此图像链接将在你安排考试后通过电子邮件发送给你),以确保所有设备符合推荐的设置。如果你选择使用内置摄像头的笔记本屏幕,确保它已启用。如果你同时启用了笔记本和外接摄像头,监考员会更容易看到一切,同时你也能更轻松地调整有线摄像头的位置。兼容性信息可以在以下截图中找到:

图 10.9 – 远程考试兼容性测试信息

图 10.9 – 远程考试兼容性测试信息

在你完成兼容性测试并确保所有设备符合要求后,你就可以放松,知道自己可以在安排的时间和日期安全地参加考试。这将使你能够在考试前安心准备,不必担心远程考试期间的设备设置问题。

在考试当天,您将能够使用您的 Red Hat 登录信息登录,并在您选择的时间开始您的考试。监考人员将指导您在考试期间需要做的事情。这将帮助您了解在远程考试中要求您完成的所有内容,从而使您能够在自己家中按自己方便的时间顺利完成考试。

一旦所有设置完成,我们将继续分享一些关于如何进行考试的技巧,帮助您让自己更加轻松和舒适。

在考试过程中可以帮助您的技巧和窍门

首先,让我们从一件可以让您从一开始就轻松应对的事情入手。请从头到尾阅读所有说明。我之所以这么说,是因为如果说明告诉您可以省略某些重复的操作,比如只在特定的服务器上执行某些任务,那么这样可以节省您的时间。它还会告诉您考试的评分标准。通过阅读说明,您将更好地理解测试环境,并做好充分准备,深入学习材料。任何可以节省时间的地方,都是一次胜利。

说到时间,充分利用考试的 4 小时。不要试图匆忙结束;除非是在这 4 小时的时间窗口内,您不会因为花费时间长短而受到评分限制。考试结束时,计时器归零,您将失去对考试的访问权限。不要让某个问题占用您的时间。如果您擅长其他项目,先做这些,之后再回到难度较大的问题,确保您能尽可能多地覆盖内容。

另一个节省时间的提示是:做所有没有明确指定给某个特定用户的任务时,请以 root 用户身份执行。您始终可以使用restorecon -Rv <directory>恢复可能因用户而导致错误上下文的 SELinux 上下文。通过使用 root 用户,您将避免忘记使用 sudo 命令的问题,作为 root 用户,查找文件也变得非常轻松,因为您可以访问整个文件结构。只需小心,因为这可能会导致文件和文件夹的权限问题,因此如果考试要求您为某个操作使用特定用户,请遵循此要求。虽然在日常生活中这不是最佳实践,但在考试中可以节省时间。

接下来,如果您习惯使用 GUI 界面,比如说,CLI 对您来说不够快捷,您可以做一些事情来让生活变得更轻松。您可以在将要进行更改的服务器上安装 GUI。让我们一起看看如何在 RHEL 8.1 服务器上安装 GUI,以便如果它更适合您的需求时,您能够轻松应对。

首先,我们将在需要 GUI 的服务器上安装带 GUI 的服务器软件包。这些服务器可以同时运行,因此您不必等待一台服务器完成后再进行下一台,如下图所示:

图 10.10 – 带 GUI 的服务器安装命令

图 10.10 – 安装带有图形用户界面的服务器命令

在你运行安装带图形用户界面的服务器包的命令后,你将看到最终结果,如下图所示:

图 10.11 – 完成的图形用户界面安装

图 10.11 – 完成的图形用户界面安装

接下来,我们将设置服务器从图形界面启动并重启,以便你可以从控制台访问它,如下图所示:

图 10.12 – 设置图形界面为默认启动的命令

图 10.12 – 设置图形界面为默认启动的命令

重启后,系统应该会启动进入图形用户界面,如下图所示:

图 10.13 – RHEL 8.1 的图形用户界面登录屏幕

图 10.13 – RHEL 8.1 的图形用户界面登录屏幕

接下来我希望你记住的是,如果你遇到困难,你不仅可以访问/usr/share文件夹,如下图所示:

图 10.14 – 包含已安装软件包文档的文件夹

图 10.14 – 包含已安装软件包文档的文件夹

该目录包含系统上已安装的软件包的信息。因此,如果你在某个问题上遇到困难,比如域名系统DNS)或动态主机配置协议DHCP),你可以查阅相关主题的信息,帮助自己重新激活思维。当你觉得自己忘记了之前学习的所有内容,准备考试时,这会非常有帮助。

接下来是手册页,它包含了你可以使用不同软件包执行的命令和进程的详细信息。你还可以在手册页目录中搜索条目,当你在/usr/share/man/目录中看到 gzip 文件时,它将提供你需要访问的手册页名称,以获取更多信息。我们可以在下图中看到对 DHCP 信息的搜索:

图 10.15 – 搜索包含 DHCP 的文件

图 10.15 – 搜索包含 DHCP 的文件

你可以在以下截图中的文件夹中看到,你有多个包含 DHCP 信息的手册页:

图 10.16 – DHCP 手册页名称

图 10.16 – DHCP 手册页名称

现在,你可以看到有多个包含dhcpd的手册页,你可以打开一个手册页来查看进一步的文档,如下图所示:

图 10.17 – 一个 dhcpd 手册页

图 10.17 – 一个 dhcpd 手册页

这些 gzip 文件如果你对手册页的名称感到困惑,并且需要一种快速的方式来查找包含dhcp的所有手册页,会非常有帮助。

请注意,完成考试时,所有的更改必须是持久的。系统将重新启动并擦除所有 Ansible 节点,以便它们可以用于运行新的 playbook。

总结

最后,我们来到了这本书的旅程终点。我要感谢你们选择与我一起进入 Red Hat Enterprise Linux 的世界。我非常高兴能够写这本书,希望能帮助尽可能多的人实现成为 Red Hat 认证服务管理与自动化专家EX358)的目标。这场考试是获得 Red Hat 认证架构师RHCA)资格所需的五个额外考试之一,同时也需要通过 Red Hat 认证专家RHCE)考试。我希望你们能从中获得一些如何完成任务的洞察。然而,重要的是你要知道,这些并不是你完成这些任务以实现认证目标的唯一方法,而是众多方法中的一些,希望它们能激励你走向胜利之路。

posted @ 2025-07-04 15:40  绝不原创的飞龙  阅读(35)  评论(0)    收藏  举报