Puppet 是一个开源的强大的基础设施配置管理工具,很早之前我介绍过一款 Python 编写的开源的自动化运维工具 Ansible,后面陆陆续续还分享过如何使用 Ansible 去管理 Contab,如何使用 Roles 来结构化并管理大量的 Ansible 配置。而今天要介绍的 Puppet 是另外一款运维自动化工具,被广泛用于自动化管理多个服务器配置。

相较于基于任务的 Ansible,Puppet 使用一种声明式描述语言,可以用来构建更复杂,更庞大的基础设施。

  • Puppet 使用客户端/服务器架构,使用 Master 和 Agent 架构进行通信
  • Puppet 可以用来支持数千台服务器基础设施管理
  • 提供内置模块,支持配置各种系统服务
  • 可以管理超过 40 种的资源,包括文件,用户,组,host,package,系统服务等。

架构

Puppet 采用三层模型来实现自动化。

  • 配置语言,使用声明式配置语言,定义目标
  • 转换层,将配置转换成可执行命令
  • 资源抽象层,将指令应用到具体的资源上

在具体工作流程中,Puppet 会首先收集各个系统的 Facts,包括硬件,操作系统,包版本等信息。

Master 会为每个系统生成自定义的配置,并发送给 Puppet Agent。Agent 会将配置应用到系统中,然后 Agent 向 Master 发送报告。

使用模式

单机模式

在单机模式下,Puppet 直接在本地执行

  • 定义多个 manifest 文件
  • 编译成 catalog
  • 应用配置

这种模式下,管理员需要手动将 manifest 应用到系统。

Master/Agent 模式

Master/Agent 模式实现集中管理。

  • Agent 默认 30 分钟向 Master 发起请求,获取配置数据
  • Master 基于 Agent 的信息生成配置
  • Agent 在本地执行配置将结果返回 Master
  • 如果目标主机状态与定义的目标不同,最迟 30 分钟会自动修复

Master/Agent 模式非常适合管理大规模服务器集群。

核心概念

资源 Resource

资源是 Puppet 的核心,代表系统中的各种实体,包括文件,用户,服务等。资源通过如下的语法定义。

type {'title':
  attribute1 => value1,
  attribute2 => value2,
  ...
}

需要注意 type 必须是小写,title 是一个字符串,在同一个类型中必须唯一,每个属性之间使用逗号分割,最后一个逗号可省略。

清单 Manifest

Manifest 是包含资源定义的文件,使用 .pp 作为扩展名,描述了系统的期望。

类 Class

类是一组资源的集合,可以将多个相关资源组织在一起,便于管理和重用。

模块 Module

模块是包含多个类的更大单位,相当于 Ansible 中的 Role(角色),提供一种组织和共享代码的方式。

安装和配置

在大多数的 Linux 发行版中,可以直接使用包管理器安装

sudo apt update
sudo apt install -y puppet

然后可以启动服务

sudo systemctl start puppet
sudo systemctl enable puppet

配置 Puppet Agent

可以编辑 /etc/puppetlabs/puppet/puppet.conf 配置文件,指定 Master 地址。

实际应用场景

Puppet 可用于管理服务器的各种配置,比如修改系统参数,配置文件等。

这里就举一些简单的例子好让大家有一些基本的概念。比如修改所有系统的时区为东京时区

class { 'timezone':
    timezone => 'Asia/Tokyo',
}

Puppet vs Ansible

Puppet 和 Ansible 还是有些非常大的区别。

  • Ansible 使用 Python 开发,Puppet 则使用 Ruby,C++ 等等开发
  • Ansible 只需要安装在控制端,并且通过 Control 服务器去通过 SSH 控制其他客户端,但是 Puppet 采用 Server/Client 模式,客户端必须被 Server 授权,并且 Puppet 会长时间运行在后台
  • Ansible 使用 YAML 配置文件,Puppet 设计了 PuppetDSL 配置语言
  • Ansible 更像是过程式编程, 开发者需要描述如何达成目标,定义做什么,Puppet 更类似声明式编程,关注的是期望结果
  • Ansible 没有默认的状态监控和管理,需要自己配置,Puppet 提供了定期的状态检查和强制执行期望状态

Ansible 和 Puppet 两者都是非常强大的自动化配置工具,但是相对来说 Puppet 更适合需要严格管理配置的大型复杂环境,Ansible 更适合快速部署和简单的自动化场景。

  • [[Terraform]]