Puppet 是一个开源配置管理自动化工具。 Puppet 允许系统管理员将基础设施作为代码输入,使用 Puppet 描述语言而不是使用任何定制的和单独的脚本来这样做。这意味着万一系统管理员错误地更改了机器的状态,此时 puppet 可以支持更改并保证框架返回到所需的状态。传统方法将要求系统管理员登录到每台机器以执行框架组织分配,但这不能很好地扩展。
木偶建筑
Puppet 使用客户端/服务器模型。服务器被称为傀儡大师。 Puppet Master 为客户端存储配方或清单(包含资源和所需状态的代码)。客户端称为 Puppet 节点并运行 Puppet 代理软件。该节点运行一个 puppet 守护进程(代理)以连接到 puppet master。这些节点将从 puppet master 下载分配给节点的清单,并在需要时应用配置。
人偶是如何工作的?
Puppet 运行从节点而不是主节点开始。此运行使用 SSL 服务在节点和主节点之间来回传递数据包。节点运行 factor 命令来收集有关系统的信息。然后将这些事实发送给主人。
一旦 master 收到事实,它会编译一个目录,描述节点中每个资源的状态。主节点比较每个节点的主机名并将其与特定节点配置匹配,或者如果节点不匹配则使用默认配置。目录编译完成后,傀儡师将其发送到节点。 Puppet 将在节点上应用目录,确保系统处于所需状态。
木偶积木
- 资源 – Puppet 有许多内置资源,如文件、用户、包和服务。傀儡语言允许管理员独立管理系统资源,确保系统处于理想状态。资源的示例是包、服务、通知、用户、执行等等。 puppet resource_type命令列出了 Puppet 主机上的可用资源类型。 resource_type 的语法如下:
resource_type { 'resource_title': attr1 => value1, attr2 => value2, attr3 => value3, ... attrN => valueN, }
资源减速从声明资源的类型开始。 Puppet 有许多内置的资源类型,如文件、用户、包和服务。资源类型后跟大括号(大括号),其中包括资源标题和值/属性对列表。资源标题是用单引号括起来的刺。冒号分隔符用于分隔资源图块和属性/值对列表。
每个资源都有其属性,也称为参数。例如,文件具有路径、所有者、组、确保和模式等属性。这些属性被定义为使用 => 运算符的值。例如,所有者的值可以是 root 或创建文件的用户帐户。此外,文件的模式可以是 750 或 777,具体取决于文件所需的权限类型。
资源标题
应极其谨慎地定义资源标题。标题通知 Puppet Compiler 有关要对其执行操作的资源。多个相似的“资源标题”可能具有相同的属性。在这种情况下,它们可以组合在一个资源定义中。一个类似的例子如下所示
file { [ '/etc/firewalld', '/etc/firewalld/helpers', '/etc/firewalld/services', '/etc/firewalld/ipsets' ]: ensure => 'directory', owner => 'root', group => 'root', mode => '750', }
以下示例显示了 firewalld 服务的声明。
service { 'httpd': ensure => 'running', enable => true, }
- Puppet Manifests—— Puppet Manifests 是用 Puppet DSL 编写的文本文档,用于描述主机系统的最终状态。它可以使用任何文本编辑器和它的扩展名 .pp 扩展名创建。下面的 noalice.pp 将确保 Puppet 从系统中删除一个名为 alice 的帐户。
[root@master ~]# vim alice.pp [root@master ~]# cat noalice.pp user {'alice': ensure => 'absent', }
- Puppet Classes – Puppet Classes 有助于确保 Puppet 资源定义可以变得更加健壮和可重用,以便它们可以应用于多个主机。 Puppet 类通常用于定义实现服务或运行应用程序所需的所有资源。下面的例子演示了类的语法
class class_name ($param = 'value') { resource definitions... }
以下示例演示了一个名为 test 的类
class test { user { 'master': ensure => 'present', home => '/home/master', shell => '/bin/bash', } file { '/home/master': ensure => 'directory', owner => 'master', group => 'master', mode => '0770', require => User['master'], } package { 'httpd': ensure => 'present', } service { 'httpd': ensure => 'running', enable => true, require => Package['httpd'], } } include test # include is a function that is used to call the class test in the manifest
include命令在清单中用于使用类。它类似于在编程语言中调用先前定义的函数
- Puppet模块 – Puppet 模块是一种将Puppet 清单和相关文件打包到单个文件中的方法。该模块是一个具有既定层次结构的 tar 存档。
Puppet 模块为 Puppet 代码和它们包含的相关文件提供了一个标准的、可预测的目录结构。
下面列出了模块层次结构中一些基本或最常用的目录:- Manifests 目录包含模块中定义的所有 puppet 清单。
- 文件目录包含静态文件
- lib/factory 目录包含自定义事实定义
- 测试目录包含用于测试模块提供的功能的清单。
Puppet DSL 简写
如果资源定义块中的属性以分号而不是逗号结尾,则可以指定另一个标题后跟冒号和属性/值对列表。以下示例显示了如何实现。
file { '/etc/vmrc': ensure => 'directory', owner => 'root', group => 'root', mode => '755'; '/etc/rc.d/init.d': ensure => 'directory', owner => 'root', group => 'root', mode => '755'; }
人偶功能
在 master 上的目录编译期间,会调用称为函数的插件。当人偶清单调用函数,它会返回一个值或进行一些修改目录的更改。
函数的代码是用 Ruby 编写的,它执行许多操作以生成最终值。这些函数执行以下任务:
- 评估模板
- 进行数学计算
- 修改目录
Puppet 包含许多内置函数。自定义函数也可以在模块中组合和使用。
用于内置自定义函数的语法如下:
function
:: ( ) >> { ... body of function ... final expression, which will be the returned value of the function } 一些内置函数是模板、警报、包含、映射等等。
语句函数
语句函数是一组仅用于修改目录的内置函数。内置的语句函数是:
- 目录语句,如包含、要求、包含和标记
- 记录语句,如调试、信息、通知、警告、错误。
- 失败语句,如失败。
函数调用
以下语法用于调用函数。
function_name(argument, argument, ...) |$parameter, $parameter, ...| { code block }
- 该函数名是函数的全名。
- 用于包含参数列表的左括号。 (使用像 include
这样的语句函数时不需要括号)。在所有其他情况下,它需要。要了解什么是一个函数所需的参数,它可以是函数的文档中进行检查。在左括号的情况下,应该有一个右括号。 - 代码块或 lambda,以防函数需要一个。
在给定的示例中,模板、包含和每个都是函数。
file {"/etc/smb.conf": ensure => file, content => template("smb/smb.conf.erb"), # function call; resolves to a string } include test # function call; modifies catalog $binaries = [ "facter", "hiera", ] # function call with lambda; runs block of code several times each($binaries) |$binary| { file {"/usr/bin/$binary": ensure => link, target => "/opt/puppetlabs/bin/$binary", } }