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 更适合快速部署和简单的自动化场景。
related
- [[Terraform]]