初学者的 Puppet 教程:什么是 Puppet 以及如何使用?
在学习Puppet之前我们先来了解一下:
什么是配置管理?
配置管理是将软件和计算机系统(例如服务器、存储、网络)保持在已知、期望和一致状态的过程。它还允许访问系统状态的准确历史记录,以用于项目管理和审计目的。
系统管理员主要执行重复性任务,如安装服务器、配置服务器等。这些专业人员可以通过编写脚本来自动执行此任务。
然而,当他们在处理大规模基础设施时,这项工作就变得很困难了。Puppet 之类的配置管理工具就是为了解决此类问题而引入的。
什么是 Puppet?
木偶 是一种用于集中和自动化配置管理过程的系统管理工具。Puppet 也可用作软件部署工具。它是一种开源配置管理软件,广泛用于整个组织基础架构中各种应用程序和服务的服务器配置、管理、部署和编排。
Puppet 是专门为管理 Linux 和 Windows 系统。它是用 Ruby 编写的,并使用其独特的 D奥曼 Specific L使用DSL(DSL)来描述系统配置。
Puppet 有哪些版本?
Puppet 有两个版本:
- 开源 Puppet:它是Puppet配置管理工具的基础版本,也称为开源Puppet。它可以直接从Puppet的网站获得,并在Apache 2.0系统下获得许可。
- 木偶企业:商业版本提供合规性报告、业务流程编排、基于角色的访问控制、GUI、API 和命令行工具等功能,以有效管理节点。
Puppet 可以做什么?
例如,您的基础设施包含大约 100 台服务器。作为系统管理员,您的职责是确保所有这些服务器始终保持最新状态并正常运行。
为此,您可以使用 Puppet,它允许您编写简单的代码,并可自动部署到这些服务器上。这减少了人力,并使开发过程快速而有效。
Puppet 执行以下功能:
- Puppet 允许您为每个主机定义不同的配置。
- 该工具允许您持续监控服务器,以确认所需的配置是否存在且未被更改。如果配置发生更改,Puppet 工具将恢复到主机上的预定义配置。
- 它还提供对所有配置系统的控制,因此集中式更改会自动生效。
- 它还可用作部署工具,因为它可以自动将软件部署到系统中。它实现了 基础设施即代码,因为策略和配置都是以代码的形式编写的。
Puppet DSL 和编程范例
在学习Puppet DSL之前,我们先来了解一下编程范式:
编程范式是计算机编程中使用的一种风格。
四种类型的范式是:
- 至关重要的。
- 声明性的。
- 函数式(被认为是声明式范式的一个子集)
- 面向对象。
我们将重点关注命令式和声明式。
命令式范式
这种编程范式表达了计算的逻辑(做什么)并描述了其控制流(如何做)
示例:
假设你要去办公室,你预订了一辆出租车,并开始一步步地向司机指示,直到你到达办公室。指定要做什么和如何做是一种命令式风格。
声明式范式
这种编程范式表达了计算的逻辑(做什么),而不描述其控制流(如何做)
示例:
假设你要去办公室,你预订了 Uber 出租车并指定最终目的地(办公室)。指定做什么而不是怎么做是一种声明式风格。
范例 | 该怎么办 | 怎么做 |
---|---|---|
势在必行 | Yes | Yes |
陈述式 | Yes | 没有 |
Puppet 使用声明式编程范式
Puppet 使用声明式编程方法。
示例: 在系统上创建用户:
它可以通过 shell 脚本使用命令式编程模式来完成:在这里我们指定如何创建用户以及在 操作系统.
但是,可以使用声明式编程模式,仅用几行 puppet 代码和 Puppet 领域特定语言 (DSL) 就可以完成,并且仍然可以实现相同的结果。
配置管理工具的部署模型
有两种部署模型 配置管理工具 :
- 基于推送的部署模型:由主节点发起。
- 基于拉取的部署模型:由代理发起。
基于推送的部署模型
在此部署模型中,主服务器将配置和软件推送到各个代理。验证安全连接后,主服务器在代理上远程运行命令。例如, Ansible 和 Salt Stack。
基于拉取的部署模型。
在这种部署模型中,各个服务器联系主服务器,验证并建立安全连接,下载其配置和软件,然后进行相应的配置——例如 Puppet 和 Chef。
Puppet 如何工作?
Puppet 基于 Pull 部署模型,其中代理节点在每次 1800 几秒钟后,代理将与主节点通信,查看代理中是否需要更新任何内容。如果需要更新任何内容,代理将从主节点提取必要的 puppet 代码并执行所需的操作。
我们通过一个例子来解释一下:
示例: 主 - 代理设置:
主
一台基于 Linux 的机器,上面安装了 Puppet Master 软件。它负责以 Puppet 代码的形式维护配置。主节点只能是 Linux。
特工们
目标机器由安装了 Puppet 代理软件的 Puppet 进行管理。
代理可在任何受支持的操作系统上配置,例如 Linux 或 Windows or Solaris 或 Mac OS。
主控和代理之间的通信是通过安全证书建立的。
主服务器与代理服务器之间的通信
步骤1) 一旦代理与主服务器之间建立了连接,Puppet 代理就会将其状态数据发送到 Puppet 主服务器。这些被称为事实:此信息包括主机名、内核详细信息、IP 地址、文件名详细信息等。
步骤2) Puppet Master 会使用这些数据并编制一份要应用于代理的配置列表。要在代理上执行的配置列表称为 目录。 这可以改变,例如包安装、升级或删除、文件系统创建、用户创建或删除、服务器重启、IP 配置更改等。
步骤3) 代理使用此配置列表在节点上应用任何所需的配置更改。
如果配置没有漂移,Agent 不会执行任何配置更改,并让节点以相同的配置运行。
步骤4) 一旦完成后,节点就会向 Puppet Master 报告,表明配置已应用并完成。
傀儡积木
Puppet 提供了使用 Puppet API 将报告与第三方工具集成的灵活性。
Puppet 构建块有四种类型:
- 资源中心
- 精品团课
- 舱单
- 模块
金宝博官方网站木偶资源
Puppet 资源是 Puppet 的组成部分。
资源是 内置函数 在后端运行以执行puppet中所需的操作。
木偶课程
不同资源的组合可以被分组为一个单元,称为类。
Puppet 清单
Manifest 是一个包含 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 定义的资源类型
定义的资源类型是使用 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 代码文件非常困难。这时,我们需要一些分组来将操作联系在一起。目的是解决一个问题,例如在服务器或 ntp 服务上配置 ssh 所需的所有操作,或者从头开始配置完整的 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 包,如果服务器上不存在 telnet,则以下命令将不返回任何内容:
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
测试 是代码创建过程的下一步。执行以下命令进行冒烟测试:
Puppet applies demontp.pp --noop
最后一步是 运行 以实模式运行木偶并验证输出。
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 apply demontp.pp
这次代码被应用是因为该类已被定义并被声明。
确保 ntp.conf 现在存在:
ls -lrt /etc/ntp.conf
通过运行以下命令验证 ntp 服务已启动:
systemctl status ntpd