在学习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"], } }
模块
当类比较多的时候,就需要把类规范起来,定义成模块的方式进行管理。
[[email protected] tmp]# tree /etc/puppet/modules/httpd/ /etc/puppet/modules/httpd/ |-- files |-- manifests | `-- init.pp `-- templates 3 directories, 1 file
节点
节点就是一个客户端,通常以主机名命名。
[[email protected] tmp]# more /etc/puppet/manifests/nodes/node2.jiabin.com.pp node ‘node2.jiabin.com‘ { include test include httpd } [[email protected] 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
三、资源
- 资源名
资源名采用单引号(‘‘)引起来,采用冒号(:)结尾。也可以使用(“”)的写法
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输出默认的配置文件,代码如下:
[[email protected] ~]# 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
实例一、将输出信息输出到日志文件
[[email protected] 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 [[email protected] manifests]# cd /tmp/ [[email protected] 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
实例二、在客户端运行命令
[[email protected] ~]# mkdir -p /etc/puppet/modules/test/manifests [[email protected] ~]# vim /etc/puppet/modules/test/manifests/init.pp [[email protected] ~]# 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文件 [[email protected] ~]# 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 [[email protected] ~]# cd /tmp/ [[email protected] tmp]# ls helloworld.txt node2.txt [[email protected] tmp]# cat node2.txt Hello World![[email protected] tmp]#
实例三、使用apply运行master编译好的JSON文件。需要在服务端使用compile参数生成JSON文件再传递至客户端执行。
1)先修改test类的内容,将"Hello World!" 修改为“Testing JSON!":
[[email protected] 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