在学习Puppet语法之前需要掌握Puppet中资源、属性、类、模块、变量、参数、节点等相关概念。

资源:资源可以是文件、服务、软件包、自定义脚本等。

属性:资源需要定义相关的属性值,否则毫无意义。

类:将多个资源组织起来进行重新定义。

模块:多个类的合集。

变量:Puppet与其他语言类似,同样支持变量。

参数:又称参变量。

节点:Puppet每一个客户端,即主机(Host)。



资源:

每个资源的定义都具有标题、类型,以及一系列的属性。每个资源在Puppet中名称必须唯一。

例如Puppet管理Nginx服务的主配置文件---nginx.conf,类型file,通常称为File资源。

file {'nginx.conf':
  ensure => file,
  mode   =>'06400',
  owner  => root,
  group  => root,
  }
 service {'nginx';
  hasrestart => true,
  hasstatus => true,
  subscribe =file ["nginx.conf"],
  }


属性:

每个资源都有它相应的属性,否则就失去意义。上面定义了4个属性

分别为:类型ensure、权限mode、用户owner及用户组

资源定义两个其他属性值----hasrestart与hasstatus,这两属性值都为true.


类:

通常类以应用名或作用名命名,比如应用软件Nginx、Apache等

class nginx {
file 
  {'nginx.conf':
  ensure => file,
  mode   =>'06400',
  owner  => root,
  group  => root,
  }
 service {'nginx';
  hasrestart => true,
  hasstatus => true,
  subscribe =file ["nginx.conf"],
  }
  }

模块

当类比较多的时候,就需要把类规范起来,定义成模块的方式进行管理。

[root@node1 tmp]# tree /etc/puppet/modules/httpd/
/etc/puppet/modules/httpd/
|-- files
|-- manifests
|   `-- init.pp
`-- templates

3 directories, 1 file

节点

节点就是一个客户端,通常以主机名命名。

[root@node1 tmp]# more /etc/puppet/manifests/nodes/node2.jiabin.com.pp 
node 'node2.jiabin.com' {
include test
include httpd
}

[root@node1 tmp]# more /etc/puppet/manifests/site.pp 
import "nodes/node2.jiabin.com.pp"

通过以上代码可以看到,node为定义了主机名为”node2.jiabin.com"的主机,并加载了httpd类,以及定义了主机变量$vhost.


二、Puppet语法风格

总体来说Puppet的语法规则是以括号"{}"分类,以冒号":"声明,以逗号","属性约束

例如:

package {'nginx': ensure => present, }


必须使用两个空格表示缩进;

不得使用文字制表符;

尾部不能有空格;

宽度不能超过80字符;

使用=>符号进行对齐。


变量的引用

不包含变量的字符串应该使用单引号('')括起来。需要应用变量是应使用双引号("")括起来。字符串中的多有变量应该使用花括号"{}"括起来。

如:

"/etc/${file}.conf"

对变量本身的引用

变量是变量本身,不需要引号。

mode => $my_mode


三、资源

  1. 资源名

资源名采用单引号('')引起来,采用冒号(:)结尾。也可以使用(“”)的写法

package {'openssh': ensure  => present }

package {"openssh": ensure  => present }

2.对齐

3.属性的顺序

声明资源时,应先定义ensure属性。方便阅读。

file { '/tmp/readme.txt':
  ensure => file,
  owner => root.
  .......
  }

四、Puppet命令详解

Puppet提供大量的命令来帮助我们进行有效的管理。Puppet中所有的命令都可以使用Puppet help命令查看。

  agent                                         #客户端进程,负责从Master获取数据
  apply                                         #运行本地 manifests
  ca                                            #本地证书的管理
  catalog                                       #编译、保存、查看Puppet代码
  cert                                          #证书颁发,用于签署证书
  certificate                                   #提供访问CA证书的管理
  certificate_request                           #管理证书请求
  certificate_revocation_list                   #管理撤销证书的列表
  config                                        #配置选项
  describe                                      #管理远程网络设备
  device                                        #管理远程网络设备
  doc                                           #生成Puppet文档
  facts                                         #系统信息检查
  file                                          #在filebuckete中检索和存储文件
  filebucket                                    #在filebucket中检索和存储文件
  help                                          #查看帮助
  inspect                                       #发送report报告
  instrumentation_data                          #管理监听的数据
  instrumentation_listener                      #管理监听状态
  instrumentation_probe                         #管理监听探测
  key                                           #创建、保存、删除证书密钥
  kick                                          #远程控制Agent,远程触发puppet agent命令
  man                                           #查看手册
  master                                        #服务端进程
  module                                        #从Puppet Forge创建、安装、查询模块
  node                                          #管理节点
  parser                                        #解析器管理
  plugin                                        #插件管理
  queue                                         #队列进程
  report                                        #创建、查看报告
  resource                                      #查看资源帮助
  resource_type                                 #查看类、默认资源类型与节点信息
  secret_agent                                  #模拟Agent
  status                                        #查看Puppet状态

Puppet常用命令

1、puppet master

参数详解如下:

*--daemonize:                                   #-D发送到后台守护进程,默认选项
*--no-daemonize:                                #不发送到后台守护进程
*--debug:                                       #-d启用完整的调试模式
*--help:                                        #-h查看帮助
*--logdest:                                     #-l日志送发方式,默认采用syslog配置
*--verbose:                                     #-v显示详细信息
*--version:                                     #-V打印Puppet版本
*--compile:                                     #以JSON的方式输出编译的catalog

--genconfig输出默认的配置文件,代码如下:

[root@node2 ~]# puppet master --genconfig>puppet.conf

最常用的是不启用守护进程的方式运行,用于调试Puppet代码

2、puppet agent

puppet agent在每个节点以守护进程方式运行,通常每30分钟向master请求一次,以确认信息并询问是否有变更,然后复制运行编译好的Catalog代码。

命令的参数详解如下:

*--certname:                                    #指定客户端certname(唯一ID)
*--daemonize:                                   #-D发送到后台守护进程,默认选项
*--no-daemonize:                                #不发送到后台守护进程
*--debug:                                       #-d启用完整的调试模式
*--detailed-exitcodes:                          #提供详细的退出代码
*--digest:                                      #指定证书指纹算法,默认为MD5算法
*--disable:                                     #禁用,禁止puppet agent在此节点执行
*--enable:                                      #启用,重新允许执行puppent agent
*--fingerpring:                                 #显示当前证书的指纹
*--logdest:                                     #-l 日志发送方式,默认采用syslog配置
*--no-client:                                   #不要创建客户端配置文件,当listen=true
*--noop:                                        #使用'noop’模式,Puppet运行Catalog
*--onetime:                                     #-o 运行一次,配合--no-daemonize使用
*--server:                                      #启动另一类型的服务
*--test:                                        #-t 测试,常用选择
*--verbose:                                     #-v 显示详细信息
*--version:                                     #-V 打印Puppet版本
*--waitforcert:                                 #-w 当Master未签署此节点证书时,puppet ag                                                ent将等待签署,并默认没2分钟重新连接Maste                                                r以确认是否完成签署

主要命令apply

puppet apply 命令参数详解

*--debug:                                       #启用完整的调试模式
*--detailed-exitcodes:                          #提供详细的退出代码
*--help:                                        #帮助
*--loadclasses:                                 #加载任何已保存类
*--logdest:                                     #日志送发方式,默认采用syslog配置
*--noop:                                        #使用'noop’模式
*--execute:                                     #执行命令中指定的Puppet代码
*--verbose:                                     #显示详细信息
*--catalog:                                     #运行puppet master采用--compile输出JSON

实例一、将输出信息输出到日志文件

[root@node1 manifests]# puppet apply -l /tmp/init.log init.pp 

** (process:18930): WARNING **: nm_client_get_devices: error getting devices: The name org.freedesktop.NetworkManager was not provided by any .service files

[root@node1 manifests]# cd /tmp/
[root@node1 tmp]# cat init.log 
Wed Dec 31 11:55:36 +0800 2014 Puppet (notice): Compiled catalog for node1.jiabin.com in environment production in 0.04 seconds
Wed Dec 31 11:55:36 +0800 2014 Puppet (notice): Finished catalog run in 0.01 seconds

实例二、在客户端运行命令

[root@node2 ~]# mkdir -p /etc/puppet/modules/test/manifests
[root@node2 ~]# vim /etc/puppet/modules/test/manifests/init.pp
[root@node2 ~]# puppet apply -e "include test" --noop
Notice: Compiled catalog for node2.jiabin.com in environment production in 0.10 seconds
Notice: Finished catalog run in 0.02 seconds

去除 --noop后可以查看/tmp下生成的node2.txt文件
[root@node2 ~]# puppet apply -e "include test" 
Notice: Compiled catalog for node2.jiabin.com in environment production in 0.07 seconds
Notice: Finished catalog run in 0.03 seconds
[root@node2 ~]# cd /tmp/
[root@node2 tmp]# ls
helloworld.txt  node2.txt
[root@node2 tmp]# cat node2.txt 
Hello World![root@node2 tmp]#

实例三、使用apply运行master编译好的JSON文件。需要在服务端使用compile参数生成JSON文件再传递至客户端执行。

1)先修改test类的内容,将"Hello World!" 修改为“Testing JSON!":

[root@node1 tmp]# vim /etc/puppet/modules/test/manifests/init.pp 

class test {
    file { "/tmp/$hostname.txt": content => "Testing JSON!";}
}

2)使用compile参数生成JSON文件,代码如下:

# puppet apply --catalog node2.jiabin.com.json