Puppet常识梳理
Puppet简单介绍
1)puppet是一种Linux/Unix平台下的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
2)Puppet是开源的基于Ruby的系统配置管理工具,puppet是一个C/S结构。所有的puppet客户端同一个服务器端的puppet通讯,每个puppet客户端每半小时(可以设置)连接一次服务器端,下载最新的配置文件,并且严格按照配置文件来配置服务器。 配置完成以后,puppet客户端可以反馈给服务器端一个消息, 如果出错,也会给服务器端反馈一个消息。
3)Puppet是用于大规模集群管理的神器。其本身使用Ruby语言开发,基于C/S架构。在每台机器上部署的客户端每隔一个指定的时间会连接到Master检查资源变化情况,若资源发生变化,将按配置动作进行相应的操作。
4)Puppet将所有可操作对象抽象为资源,目前涵盖了40多种,如:File、User、Group、Host、Package、Service、Cron、Exec等。
5)Puppet 通过抽象资源的方式,使得每台机器能够“清楚”其本身“应该”是什么“状态”,而客户端根据当前是否达到这个状态决定采取指定的动作。这使得Puppet 不仅可用于传统的应用部署,而且通过合理的手段,也能够将比应用部署更频繁的配置管理一并解决。甚至可以在Master端外接自己开发的平台,通过集中配 置方式管理各项“资源”,实现高度灵活的自动化管理体系。
这类垂直管理系统的使用及活跃,极大减轻了运维人员在重复性、批量化操作方面的负 担,能够非常有效地在各自领域完成既定的运维子目标。但其缺陷在于只能针对某一垂直领域的特定问题进行高效处理,对于它们之间的关联性很难应对。因为运维 的本质是保证服务的可用性,而自动化运维则是在完全保证这一前提下,尽可能将需要人干涉的部分处理掉,所以判断其优劣的标准则是——与人工处理比,对服务 的保证有没有提高。如果仅是解决报警、部署这些单一动作,后续仍然需要人去处理、去关注、去判断的话,就离这个目标还有距离,谈不上真正的自动化,只能算 是工具化。
puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,正得到了越来越多地关注,现在很多大型IT公司均在使用puppet对集群中的软件进行管理和部署,如google利用puppet管理超过6000台地mac桌面电脑(2007年数据)。
puppet设计架构是基于c/s架构的。服务器端保存着所有对客户端服务器的配置代码,在puppet里面叫做manifest. 客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。
如上图所示,puppet的工作流程如下
1)客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大 小,ip地址等。pupppetd 把这些信息通过ssl连接发送到服务器端; 2)服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置, 并对该部分内容进行解析,facter送过来的信息可以作为变 量处理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,语法检 查,如果语法错误就报错。如果语法没错,就继续解析,解析 的结果生成一个中间的“伪代码”,然后把伪代码发给客户端; 3)客户端接收到“伪代码”,并且 执行,客户端把执行结果发送给服务器; 4)服务器端把客户端的执行结果写入日志。
puppet工作过程中有两点值得注意
1)为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的 client可以与master通信; 2)puppet会让系统保持在你所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证ssh 服务始终开启,如果文件被删除了或者 ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。
Puppet语法(需要掌握Puppet中资源、属性、类、模块、变量、参数、节点等相关概念)
1)资源:资源可以是文件、服务、软件包、自定义脚本等。
2)属性:资源需要定义相关的属性值,否则毫无意义。
3)类:将多个资源组织起来进行重新定义。
4)模块:多个类的合集。
5)变量:Puppet与其他语言类似,同样支持变量。
6)参数:又称参变量。
7)节点:Puppet每一个客户端,即主机(Host)。
资源
常用的资源主要有以下几个: file:文件管理 package:软件包管理 service:系统服务管理 cron:配置定期任务 exec:运行shell命令
每个资源的定义都具有标题、类型,以及一系列的属性。每个资源在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 master #编译配置文件、模板、节点的自定义插件 puppet agent #客户端进程,负责从Master获取数据 puppet cert #证书颁发,用于签署证书 puppet kick #远程控制agent,远程触发puppet agent命令 puppet apply #运行本地manifests 二、帮助: puppet doc #生成puppet文档 puppet help #显示puppet帮助信息 puppet resource #查看资源帮助 puppet describe #资源帮助 puppet status #查看puppet状态 三、模块和不常用命令: puppet module #从puppet forge创建、安装、查询模块 puppet device #远程管理网络设备 puppet inspect #发送report报告 puppet filebucket #在filebucket中检索和存储文件 puppet queue #队列进程
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状态
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 agent 将等待签署,并默认每2分钟重新连接master以确认是否完成签署
主要命令apply
puppet apply 命令参数详解
--debug: #启用完整的调试模式 --detailed-exitcodes: #提供详细的退出代码 --help: #帮助 --loadclasses: #加载任何已保存类 --logdest: #日志送发方式,默认采用syslog配置 --noop: #使用‘noop’模式 --execute: #执行命令中指定的Puppet代码 --verbose: #显示详细信息 --catalog: #运行puppet master采用--compile输出JSON
puppet cert :用于管理本地证书 查看未签名证书 签署证书 废除证书 清除证书
clean // 清除 用于清除证书 fingerprint // 打印证书指纹 generate // 生成客户端证书 list // 查看认证客户端列表 print // 打印主机证书的全文信息 revoke // 废除已认证的主机 sign // 签署认证 verify // 验证本地指定的认证 参数: --all // 执行所有操作,包括'sign','clean','list','fingerprint' --digest // 设置证书指纹加密的方式,取决于openssl版本 --debug // 启用完整的调试模式 --help // 查看帮助 --verbose // 显示详细信息 --version // -V 打印puppet版本
puppet kick :用于连接到agent 让他主动运行puppet agent --test命令,主动触发
需要agent节点puppet 配置文件字段增加 listen=true 需要agent 节点防火墙允许8139端口 需要agent auth.conf插入配置 #allow puppet kick access path /run method save auth any allow puppet.master.domain.com 参数: --all // -a 指定所有主机,常用选项 --class // -c 指定类 --debug // -d 启用完整的调试模式 --foreground // -f 直到主机运行时才返回,默认是false --help // -h 查看帮助 --host // 指定主机 常用选项 --ignoreschedules // 客户端忽略计划任务,但会影响效率 默认为false --parallel // 并发连接,提高效率,但会导致master压力增大 --tag // -t 指定标签 --test // 测试 --ping // -p 对目标主机做icmp echo ,路过不响应的主机
puppet describe : 提供资源的类型,providers 和metaparameters的帮助
--help // -h 查看帮助 --providers // -p 列出类型详细说明 --list // -l 列出所有类型 --meta // -m 列出所有metaparameters --short // -s 仅列出参数,不显示细节
pupet resource :提供一个签单的工具,奖系统资源转换成puppet代码
命令参数: --debug // -d 启用完整的调试模式 --edit // -e 将查询结果定入文件 --host // -H 指定要查询的主机 --help // -h 查看帮助 --param // -p 添加更多参数进行查询 --types // -t 显示所有类型信息 --verbose // -v 显示详细信息
============================================================================
一些手记快速组合命令
puppet cert sign agentname // 对agent主机进行签名 --all 对所有等待签名的主机授权 puppet cert --clean host // 删除host认证信息 --all表示删除所有agent主机的证书 puppet cert list --all //命令可以查看客户端已经加入 puppet cert signagent_name //来签发证书 puppet apply --test --verbose //查看客户端申请证书的详细过程 puppet doc --reference configuration // 配置参考手册 puppet agent --configprint confdir // 输出配置文件目录 puppet parser validate init.pp // 服务端检查配置文件 2.6版本中puppet --aprseonly init.pp
实例一、将输出信息输出到日志文件
[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文件,代码如下:
[root@node1 tmp]# puppet apply --catalog node2.jiabin.com.json