Puppet简单介绍node
1)puppet是一种Linux/Unix平台下的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。nginx
2)Puppet是开源的基于Ruby的系统配置管理工具,puppet是一个C/S结构。全部的puppet客户端同一个服务器端的puppet通信,每一个puppet客户端每半小时(能够设置)链接一次服务器端,下载最新的配置文件,而且严格按照配置文件来配置服务器。 配置完成之后,puppet客户端能够反馈给服务器端一个消息, 若是出错,也会给服务器端反馈一个消息。算法
3)Puppet是用于大规模集群管理的神器。其自己使用Ruby语言开发,基于C/S架构。在每台机器上部署的客户端每隔一个指定的时间会链接到Master检查资源变化状况,若资源发生变化,将按配置动做进行相应的操做。shell
4)Puppet将全部可操做对象抽象为资源,目前涵盖了40多种,如:File、User、Group、Host、Package、Service、Cron、Exec等。json
5)Puppet 经过抽象资源的方式,使得每台机器可以“清楚”其自己“应该”是什么“状态”,而客户端根据当前是否达到这个状态决定采起指定的动做。这使得Puppet 不只可用于传统的应用部署,并且经过合理的手段,也可以将比应用部署更频繁的配置管理一并解决。甚至能够在Master端外接本身开发的平台,经过集中配 置方式管理各项“资源”,实现高度灵活的自动化管理体系。vim
这类垂直管理系统的使用及活跃,极大减轻了运维人员在重复性、批量化操做方面的负 担,可以很是有效地在各自领域完成既定的运维子目标。但其缺陷在于只能针对某一垂直领域的特定问题进行高效处理,对于它们之间的关联性很难应对。由于运维 的本质是保证服务的可用性,而自动化运维则是在彻底保证这一前提下,尽量将须要人干涉的部分处理掉,因此判断其优劣的标准则是——与人工处理比,对服务 的保证有没有提升。若是仅是解决报警、部署这些单一动做,后续仍然须要人去处理、去关注、去判断的话,就离这个目标还有距离,谈不上真正的自动化,只能算 是工具化。安全
puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,正获得了愈来愈多地关注,如今不少大型IT公司均在使用puppet对集群中的软件进行管理和部署,如google利用puppet管理超过6000台地mac桌面电脑(2007年数据)。bash
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命令详解
1、经常使用命令: puppet master #编译配置文件、模板、节点的自定义插件 puppet agent #客户端进程,负责从Master获取数据 puppet cert #证书颁发,用于签署证书 puppet kick #远程控制agent,远程触发puppet agent命令 puppet apply #运行本地manifests 2、帮助: puppet doc #生成puppet文档 puppet help #显示puppet帮助信息 puppet resource #查看资源帮助 puppet describe #资源帮助 puppet status #查看puppet状态 3、模块和不经常使用命令: 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
实例1、将输出信息输出到日志文件
[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
实例2、在客户端运行命令
[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]#
实例3、使用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