Puppet 入门教程:基础知识和 DSL

Puppet 是一款开源的配置管理工具,它允许您将基础设施定义为代码,并使大量服务器保持一致且可重复的状态。在学习 Puppet 之前,让我们先来了解一下配置管理。
什么是配置管理?
配置管理是指将软件和计算机系统(例如服务器、存储和网络)维护在已知、所需且一致的状态的过程。它还为项目管理和审计目的提供对系统状态的准确历史记录的访问。
系统管理员主要执行重复性任务,例如安装和配置服务器。这些专业人员可以通过编写脚本来实现这些工作的自动化。
然而,当涉及到庞大的基础设施时,这项工作就变得十分困难。诸如 Puppet 之类的配置管理工具应运而生,旨在解决这些问题。
什么是 Puppet?
木偶 Puppet 是一款系统管理工具,用于集中化和自动化配置管理流程。Puppet 也可用作软件部署工具。
它是一款开源配置管理软件,广泛用于服务器配置、管理、部署以及组织整个基础架构中各种应用程序和服务的编排。
Puppet 是专门为管理 Linux 和 Windows 系统。它是用 Ruby 编写的,并使用其独特的 D奥曼 Specific L使用DSL(DSL)来描述系统配置。
Puppet 有哪些版本?
Puppet 有两个版本:
- 开源 Puppet这是一个基础版的 Puppet 配置管理工具,也称为开源 Puppet。它可以直接从 Puppet 的网站获取,并采用 Apache 2.0 许可协议。
- Puppet Enterprise商业版本提供合规性报告、编排、基于角色的访问控制、图形用户界面、应用程序接口和命令行工具等功能,可有效管理节点。
Puppet 可以做什么?
例如,假设你有一个包含大约 100 台服务器的基础架构。作为系统管理员,你的职责是确保所有这些服务器始终保持最新状态并正常运行,且功能齐全。

为此,您可以使用 Puppet,它允许您编写简单的代码并自动部署到这些服务器上。这减少了人工投入,使开发过程快速高效。

Puppet 执行以下功能:
- Puppet 允许您为每个主机定义不同的配置。
- 该工具允许您持续监控服务器,以确认所需的配置是否存在且未被更改。如果配置发生更改,Puppet 会将配置恢复到主机上的预定义配置。
- 它还可以控制每个已配置的系统,因此集中更改会自动在所有地方生效。
- 它还可用作部署工具,因为它能自动将软件部署到系统中。它实现了…… 基础设施即代码,因为策略和配置都是用代码编写的。
Puppet DSL 和编程范例
在学习 Puppet DSL 之前,让我们先了解一下编程范式。编程范式是指你在计算机编程中使用的一种风格。
四种类型的范式是:
- 至关重要的。
- 声明性的。
- 函数式编程(被认为是声明式编程范式的一个子集)。
- 面向对象。
我们将重点关注命令式和声明式编程范式。
命令式范式
这种编程范式表达了计算的逻辑(做什么),也描述了它的控制流(如何做)。
计费示例:
假设你要去上班。你叫了一辆出租车,然后开始一步一步地向司机描述路线,直到到达办公室。这种详细说明要做什么以及如何做的表达方式,属于命令式。
声明式范式
这种编程范式表达了计算的逻辑(做什么),而不描述其控制流(如何做)。
计费示例:
假设你要去办公室。你叫了一辆优步,只指定了最终目的地(办公室)。这种只指定要做什么,而不指定怎么做的风格,属于声明式风格。
| 范例 | 该怎么办 | 怎么做 |
|---|---|---|
| 势在必行 | 是 | 是 |
| 陈述式 | 是 | 没有 |
Puppet 使用声明式编程范式
Puppet 使用声明式编程方法。
计费示例: 在系统中创建用户。
这可以通过使用 shell 脚本的命令式编程模式来实现。在这里,我们指定如何创建用户以及要对用户执行哪些命令。 操作系统.
但是,也可以使用声明式编程模式,只需几行 Puppet 代码和 Puppet 领域特定语言 (DSL),即可达到同样的效果。
配置管理工具的部署模型
有两种部署模型 配置管理工具:
- 基于推送的部署模型:由主节点发起。
- 基于拉取的部署模型:由代理发起。
基于推送的部署模型
在这种部署模型中,主服务器将配置和软件推送至各个代理。验证连接安全后,主服务器会在代理上远程运行命令。例如: Ansible 和 Salt Stack。
基于拉取的部署模式
在这种部署模型中,各个服务器联系主服务器,验证并建立安全连接,下载自身的配置和软件,然后进行相应的配置——例如,Puppet 和 Chef.
Puppet 如何工作?
Puppet 基于拉取部署模型,其中代理节点会定期签入——每 1800 几秒钟内,代理会与主节点通信,查看代理是否需要更新。如果需要更新,代理会从主节点拉取必要的 Puppet 代码并执行所需操作。
让我们以主代理架构为例来解释一下。
主
这是一台基于 Linux 的机器,上面安装了 Puppet 主控软件。它负责维护以 Puppet 代码形式存在的配置。主节点只能是 Linux 系统。
特工们
这些是 Puppet 管理的目标机器,上面安装了 Puppet 代理软件。
该代理程序可以配置在任何受支持的操作系统上,例如 Linux。 Windows, Solaris或 Mac OS。
主控端和代理端之间的通信是通过安全证书建立的。

主服务器与代理服务器之间的通信
步骤1) 一旦代理服务器与主服务器建立连接,Puppet 代理服务器就会向 Puppet 主服务器发送有关其状态的数据。这些数据被称为“事实”(Facts),其中包括主机名、内核详细信息、IP 地址、文件名详细信息等等。

步骤2) Puppet 主控程序使用这些数据,并编制一份要应用于代理的配置列表。这份要对代理执行的配置列表被称为配置项。 检索目录这可能包括软件包安装、升级或卸载,文件系统创建,用户创建或删除,服务器重启,IP 配置更改等等。
步骤3) 代理使用此配置列表在节点上应用任何所需的配置更改。
如果配置没有偏差,代理不会执行任何配置更改,并让节点以相同的配置运行。

步骤4) 完成后,节点会向 Puppet 主服务器报告,表明配置已应用并完成。
傀儡积木
Puppet 提供了灵活性,可以使用 Puppet API 将报表与第三方工具集成。
木偶模型由四种类型的积木组成:
- 相关资源
- 精品团课
- 舱单
- 科目
金宝博官方网站木偶资源
Puppet资源是Puppet的组成单元。
资源是 内置函数 在后端运行以在 Puppet 中执行所需操作的程序。
木偶课程
可以将不同的资源组合在一起,形成一个称为“类”的单元。
Puppet 清单
清单文件是一个包含 Puppet DSL 文件的目录。这些文件以 .pp 为扩展名,.pp 代表 Puppet 程序。Puppet 代码由 Puppet 类的定义或声明组成。
Puppet 模块
模块是文件和目录的集合,例如清单文件和类定义。它们是 Puppet 中可重用和可共享的单元。
例如 MySQL 模块安装和配置 MySQL,并 Jenkins 模块管理 Jenkins.

Puppet 资源类型
通常,一个系统由文件、用户、服务、进程、软件包等组成。在 Puppet 中,这些被称为资源,它们是 Puppet 的基本构建模块。
对 Puppet 代理的所有操作都是借助 Puppet 资源执行的。
Puppet 资源是现成的工具,用于在任何受支持的平台上执行各种任务和操作。我们可以使用单个 Puppet 资源来执行特定任务,也可以同时使用多个 Puppet 资源来执行复杂的应用程序配置部署。
资源可以有不同的类型。Puppet 使用 资源 和 资源类型 来描述系统的配置。
资源类型有三种:
- Puppet 核心或内置资源类型。
- Puppet 定义的资源类型。
- Puppet 自定义资源类型。
Puppet 核心或内置资源类型
核心资源类型或内置资源类型是指 Puppet 软件自带的预构建资源类型。所有核心资源类型或内置资源类型均由 Puppet 团队编写和维护。
Puppet 定义的资源类型
已定义的资源类型是使用现有资源类型的组合,用 Puppet 声明式语言编写的轻量级资源类型。
Puppet 自定义资源类型
自定义资源类型是用 Ruby 编写的完全定制的资源类型。
让我们进一步探讨 Puppet 资源类型。
在终端中,输入以下命令以显示与 Puppet 相关的子命令列表:
Puppet --help
在我们的例子中,我们感兴趣的是子命令“资源我们将使用它来查找有关内置 Puppet 资源类型的信息。
在终端中,输入以下任意命令来显示以下列表 行动 与 Puppet 子命令相关的“资源“:
Puppet help resource Puppet resource --help
在这种情况下,我们有 资源 作为子命令和 –类型 作为行动。
Puppet 有 49 种内置核心资源类型。
在终端中,输入以下命令以显示可用的内置 Puppet 资源类型列表:
puppet resource –types
每种类型都支持以下列表 属性这些属性提供了Puppet用来管理资源的详细描述。
要查找与 Puppet 资源类型关联的所有属性,请使用以下命令:
puppet describe <resource type name>
参数将列出该资源类型的所有可用属性。
puppet 描述包
对于新手来说,理解和关联大量未管理的 Puppet 代码文件非常困难。这就是我们需要一些小组讨论的地方。ping 将各项操作整合在一起。其目的是解决单个问题,例如在服务器上配置 SSH、NTP 服务或从头开始构建完整的 Web 服务器或数据库服务器所需的所有操作。
什么是 Puppet 课程?
Puppet 类是将 Puppet 资源捆绑在一起作为一个单元的集合。
Puppet 引入了类,使得结构可重复使用且有条理。
首先,我们需要使用类定义语法来定义一个类。类必须是唯一的,并且只能使用同一个名称声明一次:
class <class-name> {
<Resource declarations>
}
计费示例:
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
到目前为止,我们只是定义了这个类,还没有在任何地方使用它。这意味着,除非我们在其他地方声明这个类,否则我们编写的代码永远不会执行。
类别声明
要在代码中使用已定义的类,请使用 包括 关键词。
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
include ntpconfig
让我们通过一个实际的例子来理解这一点。
演示安装 NTP
首先,请确保服务器上尚未安装 NTP 软件包。如果服务器上不存在 NTP 软件包,以下命令将不会返回任何结果:
rpm -qa | grep -i ntp
我们可以看到,服务器上已经存在 NTP 软件包。让我们删除现有的 NTP 软件包:
yum remove ntp
卸载软件包后,请确保ntp.conf文件已不存在:
ls -lrt /etc/ntp.conf
运行以下命令验证ntp服务是否存在:
systemctl status ntp
创建一个新的 .pp 文件来保存代码。从命令行:
vi demontp.pp
按键盘上的 i 键切换到插入模式。
输入以下代码来创建新文件:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
编辑完成后,按 Esc 键。
要保存文件,请按:wq!
接下来的步骤是将 查 代码是否有语法错误。执行以下命令:
puppet parser validate demontp.pp
请确保您已切换到 根 用户可以通过执行以下命令顺利完成测试,不会出现任何错误:
su root
《测试》(Test) 是代码创建过程的下一步。执行以下命令进行冒烟测试:
Puppet applies demontp.pp --noop
最后一步是 运行 在实模式下运行 Puppet 并验证输出。
puppet apply demontp.pp
Puppet 没有执行任何操作,因为演示类只是 定义 但不 声明.
因此,在声明 Puppet 类之前,代码不会生效。
让我们 宣布 同一代码中的演示类使用 包括类名 在代码的末尾:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
# Class Declaration
include ntpconfig
同样, 查 代码是否有语法错误。执行以下命令:
puppet parser validate demontp.pp
请确保您已切换到 根 用户可以通过执行以下命令顺利完成测试,不会出现任何错误:
su root
测试与验证 是代码创建过程的下一步。执行以下命令进行冒烟测试:
Puppet apply demontp.pp --noop
最后一步是 运行 在实模式下运行 Puppet 并验证输出。
puppet apply demontp.pp
这次代码能够生效,是因为类已经定义并声明过了。
请确保ntp.conf文件存在:
ls -lrt /etc/ntp.conf
运行以下命令验证ntp服务是否已启动:
systemctl status ntpd











