本文为译文,原文Puppet Tutorial for Beginners: Resources, Classes, Manifest, Modules,主要讲解了Puppet工具的基本概念和用法。作为快速了解和备忘正合适,翻译记录,希望对大家有用,下面为译文。


在了解Puppet 之前我们先来看下:什么是配置管理?

配置管理是将软件和计算机系统(如服务器,存储,网络)维持在已知的,期望的和一致的状态下的一个过程。它还允许你查看该状态的历史,以便用于项目管理和审计。

系统管理员常常需要执行许多重复性的工作,比如安装服务器、配置各种服务,他们往往写些服务安装的脚本来简化工作。当服务器台数增加到一定规模,脚本这种方式就不现实了。

Puppet 可以很好的解决上边说的问题。

什么是Puppet

Puppet是一个开源的DevOps系统管理工具,用于集中配置管理和自动化配置管理。它常用于在整个基础架构中的配置和部署管理,及编排各种应用程序和服务,包括批量实现包安装、升级或删除,文件系统创建,用户创建或删除,服务器重启,IP配置更改等。

Puppet 可使用与Linux 和 Windows 系统。基于Ruby 语言开发,使用它自己特有的一种语言(Domain Specific Language - DSL)来编写服务配置文件。

Puppet 版本

Puppet 有两个版本:

  • 开源版本:它是Puppet配置管理工具的基本版本,也称为Open Source Puppet。你可以从Puppet官网获取,它使用 Apache 2.0 开源许可。

  • 企业版本:它提供合规性报告、业务流程、基于角色的访问控制、GUI、API 和命令行工具等功能的商业版本,让你更有效的管理节点。

Puppet DSL 语法和编程范式

在我们学习DSL前,先来了解下编程范式:编程范式是您在计算机编程中使用的一种风格。

常用的4中范式:

  • Imperative. 命令式
  • Declarative. 声明式
  • Functional 函数式
  • Object-oriented. 面向对象

下面我们主要说下「命令式」和「声明式」:

  • 命令式:这种编程范式表达了计算的逻辑(怎么做)并描述了它的控制流程(怎么做)。假设您要去办公室,预订出租车并开始一步一步地向司机提供指示,直到您到达办公室。指定要做什么以及如何做是一种必要的风格。

  • 声明式:这种编程范式表达了计算的逻辑(怎么做)而没有描述它的控制流程(怎么做)。假设您要去办公室,预订出租车并指定最终目的地(办公室)。指定不该怎么做的是声明式样式。

Puppet 使用声明式编程范式

我们用一个例子来说明:创建一个Linux系统用户。

它可以通过 shell 脚本使用命令式编程模式来完成。脚本大致如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash 
if [ $(id -u) -eq 0 ];then
  $username=Puppetuser
  read -s -p "Enter password:" password
  Egrep "^$username" /etc/passwd > /dev/null 
  if [ $? -eq 0 ];then 
    echo "$username exists!"
    exit 1 
  else
    useradd -m -p $password $username 
    [ $? -eq 0 ] && echo "User has been added to the system!"||echo "Failed to add a user!"
  fi
fi

而使用Puppet来完成相同的功能,只需要几行代码的配置文件,如下:

1
2
3
user { "Puppetuser":
  ensure => "present"
}

具体语法可参阅官方文档puppet 语法最佳指南

配置管理工具常用的部署架构

业界常用的配置管理工具,有两种部署架构供选择:

  • 基于push的部署模型:由主节点发起。
  • 基于pull的部署模型:由代理启动。

基于push的部署模型

在此部署模型中,主服务器将配置和软件推送到各个代理。验证安全连接后,主服务器会在代理上远程运行命令。如: Ansible和Salt Stack。

基于pull的部署模型

在此部署模型中,各个服务器联系主服务器,验证并建立安全连接,下载其配置和软件,然后相应地进行自我配置。如:Puppet和Chef。

Puppet 是如何工作的

Puppet基于Pull部署模型,其中代理节点在每1800秒后定期检查主节点,以查看是否需要在代理节点中更新配置的服务内容。如果需要更新任何内容,代理会从主服务器中提取必要的Puppet代码并执行所需的操作。

Master 节点

Master 节点是一台安装了 Puppet master 的Linux服务器。它负责维护Puppet管理的服务的配置。注意,Mater 节点只能为Linux系统。

Agent 节点

Agent 节点是安装了 pupept agent 的目标服务器。Agent 节点支持Linux、Windows和Mac系统。

Master 节点和Agent 节点之间通信通过SSL来确保安全。

Master 和 Agent 节点的通信

  • 1、在Agent和Master服务器之间建立连接后,Puppet Agent会将有关其服务状态的数据发送到Puppet Master服务器。 这些被称为facts:此信息包括主机名,内核详细信息,IP地址,文件名详细信息等。

  • 2、Puppet Master使用此数据和menifest文件(配置文件)编译一个应用于Agent的配置列表,这个列表被称为catalog。 catalog中描述了一些操作,例如包安装,升级或删除,文件系统创建,用户创建或删除,服务器重启,IP配置更改等。

  • 3、Agent 在节点上应用此配置列表。如果配置中没有变动,则代理不会执行任何配置更改。

  • 4、完成后,Agent 向 Puppet Master 报告,表明配置已应用并完成。

图片来源:http://www.zsythink.net/archives/201

Puppet 相关概念

Puppet 四个重要的概念:

  • Resource 资源
  • Class 类
  • Manifest 清单
  • Modules 模块

Puppet Resouce

资源是Puppet 配置文件的构建基础。资源是在后端运行的内置函数,用于在puppet中执行所需的操作。通常,系统由files,users,services,processes,packages等组成。

在Puppet中,这些称为资源。资源是Puppet中的基本构建块。在Puppet中,所有的操作都是借助资源来完成的。

我们可以使用单个资源来完成任务和操作,也可以组合多个资源完成更复杂的服务配置。

常用的资源对应我们想要操作的对象,大致如下:

资源也有不同的类型,Puppet通过资源和资源类型,描述系统的配置。

资源大致分为以下三种类型:

  • Puppet 核心和内建的资源类型:核心或内置资源类型是puppet软件附带的预构建的puppet资源类型。所有核心或内置Puppet资源类型都由Puppet团队编写和维护。
  • Puppet 定义的资源类型:定义的资源类型是使用现有资源类型的组合以Puppet声明性语言编写的轻量级资源类型。
  • 自定义的Puppet 资源类型:自定义资源类型是用Ruby编写的完全自定义的资源类型。

Puppet Class

可以将不同资源的组合组合在一起,形成一个称为类的单元。

Puppet Manifest

Manifest是一个包含puppet DSL文件的目录。这些文件的扩展名为.pp。 .pp扩展名代表Puppet程序。 puppet代码由Puppet Classes的定义或声明组成。

Puppet Modules

模块是文件和目录的集合,像是Manifast和Class的定义。它们是Puppet中可重复使用和可共享的单元。

puppet 支持的模块及各系统兼容性,可参考 这里

他们的关系大致如下:

扩展阅读

到这里,大家对运维中的配置管理工具Puppet的基本概念和工作原理,应该有大致的了解,后面的文章我会分享下如何简单的使用。