-----本文大纲
简介
工作原理
puppet安装及命令解析
puppet资源类型
---------------------
一、简介
puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置服务器. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息.
二、工作原理
在使用任何软件前我们都需要了解其工作原理,否则会给后续使用带来诸多不便。Puppet采用了非常简单的C/S架构,所有数据的交互都通过SSL进行,以保证安全
<a href="http://s3.51cto.com/wyfs02/M02/28/5E/wKioL1N4JjHQBZ8_AAHsiMGBTsg364.jpg" target="_blank"></a>
客户端Puppetd向Master发起认证请求,或使用带签名的证书。
Master告诉Client你是合法的。
客户端Puppetd调用Facter,Facter探测出主机的一些变量,例如主机名、内存大小、IP地址等。Puppetd将这些信息通过SSL连接发送到服务器端。
服务器端的Puppet Master检测客户端的主机名,然后找到manifest对应的node配置,并对该部分内容进行解析。Facter送过来的信息可以作为变量处 理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catelog),然后把伪代码发给客户端。
客户端接收到“伪代码”,并且执行。
客户端在执行时判断有没有File文件,如果有,则向fileserver发起请求。
客户端判断有没有配置Report,如果已配置,则把执行结果发送给服务器。
服务器端把客户端的执行结果写入日志,并发送给报告系统。
三、puppet安装
1、安装puppet
安装ruby
1
<code>#yum install ruby ruby-libs ruby-rdoc</code>
安装epel源
<code>#rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</code>
安装puppet
<code>[root@dynamic bin]</code><code># yum --enablerepo="epel,epel-puppet" install puppet</code>
2、puppet命令注解
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<code>[root@dynamic bin]</code><code># puppet help</code>
<code>Usage: puppet <subcommand> [options] <action> [options]</code>
<code>Available subcommands, from Puppet Faces:</code>
<code> </code><code>ca Local Puppet Certificate Authority management.</code>
<code>#管理本地证书</code>
<code> </code><code>catalog Compile, save, view, and convert catalogs.</code>
<code>#编译、保存、查看 puppet、代码,或转换成 Catalogs</code>
<code> </code><code>certificate Provide access to the CA </code><code>for</code> <code>certificate management.</code>
<code>#提供访问 CA证书的管理</code>
<code> </code><code>certificate_request Manage certificate requests.</code>
<code>#管理证书的请求</code>
<code> </code><code>certificate_revocation_list Manage the list of revoked certificates.</code>
<code> </code><code>#管理撤销证书的列表</code>
<code> </code><code>config Interact with Puppet's configuration options.</code>
<code> </code><code>facts Retrieve and store facts.</code>
<code>#系统信息检查</code>
<code> </code><code>file</code> <code>Retrieve and store files </code><code>in</code> <code>a filebucket</code>
<code>#在 filebucket 中检索和存</code>
<code>储文件</code>
<code> </code><code>help Display Puppet help.</code>
<code> </code><code>instrumentation_data Manage instrumentation listener accumulated data.</code>
<code>#管理监听的数据</code>
<code> </code><code>instrumentation_listener Manage instrumentation listeners.</code>
<code>#管理监听的状态</code>
<code> </code><code>instrumentation_probe Manage instrumentation probes.</code>
<code> </code><code>#管理监听探测</code>
<code> </code><code>key Create, save, and remove certificate keys. </code><code>##创建、保存、删除证书密</code>
<code>钥</code>
<code> </code><code>man</code> <code>Display Puppet manual pages.</code>
<code> </code><code>module Creates, installs and searches </code><code>for</code> <code>modules on the Puppet Forge. </code><code>#</code>
<code>从 Puppet Forge 创建、安装、查询模块</code>
<code> </code><code>node View and manage node definitions.</code>
<code>#管理节点</code>
<code> </code><code>parser Interact directly with the parser.</code>
<code>#解析器管理,检查 pp 文件语法</code>
<code>plugin Interact with the Puppet plugin system.</code>
<code>#管理插件</code>
<code> </code><code>report Create, display, and submit reports.</code>
<code> </code><code>#创建、查看报告</code>
<code> </code><code>resource API only: interact directly with resources via the RAL.</code>
<code>#查看资源帮助</code>
<code> </code><code>resource_type View classes, defined resource types, and nodes from all manifests</code>
<code>#查看类、默认资源类型与节点信息</code>
<code> </code><code>secret_agent Mimics puppet agent.</code>
<code>#模拟 Agent</code>
<code>status View puppet server status.</code>
<code>#查看 puppet 状态</code>
<code>Available applications, soon to be ported to Faces:</code>
<code> </code><code>agent The puppet agent daemon</code>
<code>#客户端进程,负责从 Master 端获取信息</code>
<code> </code><code>apply Apply Puppet manifests locally</code>
<code>#运行本地 manifests</code>
<code> </code><code>cert Manage certificates and requests</code>
<code>#证书颁发,用于签署证书</code>
<code> </code><code>describe Display help about resource types</code>
<code>#资源帮助</code>
<code> </code><code>device Manage remote network devices</code>
<code> </code><code>#管理远程网络设备</code>
<code> </code><code>doc Generate Puppet documentation and references</code>
<code>#生成 puppet 文档</code>
<code> </code><code>filebucket Store and retrieve files </code><code>in</code> <code>a filebucket</code>
<code>#在 filebucket 中检索和存储文件</code>
<code> </code><code>inspect Send an inspection report</code>
<code>#发送 report 报告</code>
<code> </code><code>kick Remotely control puppet agent</code>
<code> </code><code>#远程控制 agent,远程触发 puppet agent命令</code>
<code> </code><code>master The puppet master daemon</code>
<code>#编译配置文件、模板、节点的自定义插件</code>
<code> </code><code>queue Queuing daemon </code><code>for</code> <code>asynchronous storeconfigs</code>
<code>#队列进程</code>
<code>See </code><code>'puppet help <subcommand> <action>'</code> <code>for</code> <code>help on a specific subcommand action.</code>
<code>See </code><code>'puppet help <subcommand>'</code> <code>for</code> <code>help on a specific subcommand.</code>
<code>Puppet v2.7.25</code>
puppet master :编译配置文件、模板、节点的自定义插件
<code>[root@dynamic bin]</code><code># puppet help master</code>
<code> </code>
<code>puppet-master(8) -- The puppet master daemon</code>
<code>========</code>
<code>SYNOPSIS</code>
<code>--------</code>
<code>The central puppet server. Functions as a certificate authority by</code>
<code>default.</code>
<code>USAGE</code>
<code>-----</code>
<code>puppet master [-D|--daemonize|--no-daemonize] [-d|--debug] [-h|--help]</code>
<code> </code><code>[-l|--logdest <</code><code>file</code><code>>|console|syslog] [-</code><code>v</code><code>|--verbose] [-V|--version]</code>
<code> </code><code>[--compile <node-name>]</code>
<code>DESCRIPTION</code>
<code>-----------</code>
<code>This </code><code>command</code> <code>starts an instance of puppet master, running as a daemon</code>
<code>and using Ruby's built-</code><code>in</code> <code>Webrick webserver. Puppet master can also be</code>
<code>managed by other application servers; when this is the </code><code>case</code><code>, this</code>
<code>executable is not used.</code>
<code> </code><code>-D|--daemonize </code><code>#发送到后台守护进程,默认选项</code>
<code>--no-daemonize </code><code>#不发送到后台守护进程</code>
<code>-d|--debug </code><code>#启用完整的调试模式</code>
<code>-h|--help </code><code>#查看帮助</code>
<code>-l|--logdest <</code><code>file</code><code>>|console|syslog </code><code>#日志发送方式,默认采用 syslog 配置</code>
<code>-</code><code>v</code><code>|--verbose </code><code>#显示详细信息</code>
<code>-V|--version </code><code>#打印 puppet 版本</code>
<code>--compile <node-name> </code><code>#以 JSON 的方式输出编译的 catalog</code>
<code>--genconfig </code><code>#输入默认配置文件</code>
puppet agent :客户端进程,负责从 Master 获取数据
74
75
<code>[root@dynamic bin]</code><code># puppet help agent</code>
<code> </code>
<code>puppet-agent(8) -- The puppet agent daemon</code>
<code>Retrieves the client configuration from the puppet master and applies it to</code>
<code>the </code><code>local</code> <code>host.</code>
<code>This service may be run as a daemon, run periodically using </code><code>cron</code> <code>(or something</code>
<code>similar), or run interactively </code><code>for</code> <code>testing purposes.</code>
<code>puppet agent [--certname <name>] [-D|--daemonize|--no-daemonize]</code>
<code> </code><code>[-d|--debug] [--detailed-exitcodes] [--digest <digest>] [--disable] [--</code><code>enable</code><code>]</code>
<code> </code><code>[--fingerprint] [-h|--help] [-l|--logdest syslog|<</code><code>file</code><code>>|console]</code>
<code> </code><code>[--no-client] [--noop] [-o|--onetime] [--serve <handler>] [-t|--</code><code>test</code><code>]</code>
<code> </code><code>[-</code><code>v</code><code>|--verbose] [-V|--version] [-w|--waitforcert <seconds>]</code>
<code>This is the main puppet client. Its job is to retrieve the </code><code>local</code>
<code>machine's configuration from a remote server and apply it. In order to</code>
<code>successfully communicate with the remote server, the client must have a</code>
<code>certificate signed by a certificate authority that the server trusts;</code>
<code>the recommended method </code><code>for</code> <code>this, at the moment, is to run a certificate</code>
<code>authority as part of the puppet server (</code><code>which</code> <code>is the default). The</code>
<code>client will connect and request a signed certificate, and will </code><code>continue</code>
<code>connecting </code><code>until</code> <code>it receives one.</code>
<code>Once the client has a signed certificate, it will retrieve its</code>
<code>configuration and apply it.</code>
<code>--certname <name></code>
<code>#指定客户端 certname(唯一 ID),通常以 FQDN 命名</code>
<code>--daemonize</code>
<code>#发送到后台守护进程,默认选项</code>
<code>--no-daemonize</code>
<code>#不发送到后台守护进程</code>
<code>-d|--debug</code>
<code> </code><code>#启用完整的调试模式</code>
<code>--detailed-exitcodes</code>
<code>#提供详细的退出代码</code>
<code>--digest <digest></code>
<code>#指定证书指纹算法,默认为 MD5 算法</code>
<code>--disable</code>
<code> </code><code>#禁用,禁止 puppet agent 在此节点运行</code>
<code>--</code><code>enable</code>
<code>#启用,重新运行执行 puppet agent</code>
<code>--fingerprint</code>
<code> </code><code>#显示当前证书的指纹</code>
<code>-h|--help</code>
<code>#查看帮助</code>
<code>-l|--logdest syslog|<</code><code>file</code><code>>|console</code>
<code>#日志发送方式,默认采用 syslog 配置</code>
<code>--no-client</code>
<code> </code><code>#不创建客户端配置文件,当 listen=true 时才有意义</code>
<code>--noop</code>
<code>#puppet 运行 Catalog,但不执行配置</code>
<code>-o|--onetime</code>
<code>#运行一次,配合--no-daemonize 使用</code>
<code>--serve <handler></code>
<code>#启动另一类的服务</code>
<code>-t|--</code><code>test</code>
<code> </code><code>#测试用,包含了('onetime','verbose', 'ignorecache', 'no-daemonize', 'no-usecacheonfailure','detailed-exit-codes', 'no-splay', and 'show_diff')</code>
<code>-</code><code>v</code><code>|--verbose</code>
<code> </code><code>#显示详细信息</code>
<code>-V|--version</code>
<code>#打印 puppet 版本</code>
<code>-w|--waitforcert <seconds></code>
<code> </code><code>#当 Master 未签署此节点证书时,puppet agent 将等待签署,并默认</code>
<code>#每 2 分钟重新连接 Master 以确定是否完成签署</code>
puppet cert :证书颁发,用于签署证书
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<code>[root@dynamic bin]</code><code># puppet help cert</code>
<code>puppet-cert(8) -- Manage certificates and requests</code>
<code>Standalone certificate authority. Capable of generating certificates,</code>
<code>but mostly used </code><code>for</code> <code>signing certificate requests from puppet clients.</code>
<code>puppet cert <action> [-h|--help] [-V|--version] [-d|--debug] [-</code><code>v</code><code>|--verbose]</code>
<code> </code><code>[--digest <digest>] [<host>]</code>
<code>Because the puppet master service defaults to not signing client</code>
<code>certificate requests, this script is available </code><code>for</code> <code>signing outstanding</code>
<code>requests. It can be used to list outstanding requests and </code><code>then</code> <code>either</code>
<code>sign them individually or sign all of them.</code>
<code>ACTIONS</code>
<code>-------</code>
<code>Every action except </code><code>'list'</code> <code>and </code><code>'generate'</code> <code>requires a </code><code>hostname</code> <code>to act on,</code>
<code>unless the </code><code>'--all'</code> <code>option is </code><code>set</code><code>.</code>
<code>* clean:</code>
<code>#清除,用于清除证书</code>
<code> </code><code>Revoke a host's certificate (</code><code>if</code> <code>applicable) and remove all files</code>
<code> </code><code>related to that host from puppet cert's storage. This is useful when</code>
<code> </code><code>rebuilding hosts, since new certificate signing requests will only be</code>
<code> </code><code>honored </code><code>if</code> <code>puppet cert does not have a copy of a signed certificate</code>
<code> </code><code>for</code> <code>that host. If </code><code>'--all'</code> <code>is specified </code><code>then</code> <code>all host certificates,</code>
<code> </code><code>both signed and unsigned, will be removed.</code>
<code>* fingerprint:</code>
<code>#打印证书指纹</code>
<code> </code><code>Print the DIGEST (defaults to md5) fingerprint of a host's</code>
<code> </code><code>certificate.</code>
<code>* generate:</code>
<code>#生成客户端证书</code>
<code> </code><code>Generate a certificate </code><code>for</code> <code>a named client. A certificate</code><code>/keypair</code> <code>will</code>
<code> </code><code>be generated </code><code>for</code> <code>each client named on the </code><code>command</code> <code>line.</code>
<code>* list:</code>
<code>#查看认证客户端列表</code>
<code> </code><code>List outstanding certificate requests. If </code><code>'--all'</code> <code>is specified, signed</code>
<code> </code><code>certificates are also listed, prefixed by </code><code>'+'</code><code>, and revoked or invalid</code>
<code> </code><code>certificates are prefixed by </code><code>'-'</code> <code>(the verification outcome is printed</code>
<code> </code><code>in</code> <code>parenthesis).</code>
<code>* print:</code>
<code>#打印主机证书的全文信息</code>
<code> </code><code>Print the full-text version of a host's certificate.</code>
<code>* revoke:</code>
<code>#废除已认证的主机</code>
<code> </code><code>Revoke the certificate of a client. The certificate can be specified either</code>
<code> </code><code>by its serial number (given as a hexadecimal number prefixed by </code><code>'0x'</code><code>) or by its</code>
<code> </code><code>hostname</code><code>. The certificate is revoked by adding it to the Certificate Revocation</code>
<code> </code><code>List given by the </code><code>'cacrl'</code> <code>configuration option. Note that the puppet master</code>
<code> </code><code>needs to be restarted after revoking certificates.</code>
<code>* sign:</code>
<code>#签署认证</code>
<code> </code><code>Sign an outstanding certificate request.</code>
<code>* verify:</code>
<code>#验证本地指定的认证</code>
<code> </code><code>Verify the named certificate against the </code><code>local</code> <code>CA certificate.</code>
<code>OPTIONS</code>
<code>Note that any configuration parameter that's valid </code><code>in</code> <code>the configuration</code>
<code>file</code> <code>is also a valid long argument. For example, </code><code>'ssldir'</code> <code>is a valid</code>
<code>configuration parameter, so you can specify </code><code>'--ssldir <directory>'</code> <code>as an</code>
<code>argument.</code>
<code>See the configuration </code><code>file</code> <code>documentation at</code>
<code>http:</code><code>//docs</code><code>.puppetlabs.com</code><code>/references/stable/configuration</code><code>.html </code><code>for</code> <code>the</code>
<code>full list of acceptable parameters. A commented list of all</code>
<code>configuration options can also be generated by running puppet cert with</code>
<code>'--genconfig'</code><code>.</code>
<code>* --all:</code>
<code> </code><code>#执行所有操作,包括'sign','clean','list','fingerprint',</code>
<code> </code><code>Operate on all items. Currently only makes sense with the </code><code>'sign'</code><code>,</code>
<code> </code><code>'clean'</code><code>, </code><code>'list'</code><code>, and </code><code>'fingerprint'</code> <code>actions.</code>
<code>* --digest:</code>
<code>#设置证书指纹加密的方式,取决于 openssl 版本</code>
<code> </code><code>Set the digest </code><code>for</code> <code>fingerprinting (defaults to md5). Valid values</code>
<code> </code><code>depends on your openssl and openssl ruby extension version, but should</code>
<code> </code><code>contain at least md5, sha1, md2, sha256.</code>
<code>* --debug:</code>
<code>#启用完整的调试模式</code>
<code> </code><code>Enable full debugging.</code>
<code>* --help:</code>
<code> </code><code>#查看帮助</code>
<code> </code><code>Print this help message</code>
<code>* --verbose:</code>
<code>#显示详细信息</code>
<code> </code><code>Enable verbosity.</code>
<code>* --version:</code>
<code>#显示版本</code>
<code> </code><code>Print the puppet version number and </code><code>exit</code><code>.</code>
puppet apply :运行本地 manifests
<code>[root@dynamic bin]</code><code># puppet help apply</code>
<code>puppet-apply(8) -- Apply Puppet manifests locally</code>
<code>Applies a standalone Puppet manifest to the </code><code>local</code> <code>system.</code>
<code>puppet apply [-h|--help] [-V|--version] [-d|--debug] [-</code><code>v</code><code>|--verbose]</code>
<code> </code><code>[-e|--execute] [--detailed-exitcodes] [-l|--logdest <</code><code>file</code><code>>]</code>
<code> </code><code>[--apply <catalog>] [--catalog <catalog>] <</code><code>file</code><code>></code>
<code>#显示版本信息</code>
<code>-e|--execute</code>
<code>#执行命令中指定的 puppet 代码</code>
<code>-l|--logdest <</code><code>file</code><code>></code>
<code> </code><code>#日志发送方式,默认采用 syslog 配置</code>
<code>--catalog <catalog></code>
<code>#运行 puppet master 采用--compile 输出 JSON 代码</code>
puppet kick #远程控制 agent,远程触发 puppet agent 命令
3、帮助
<code>puppet doc</code>
<code>puppet help</code>
<code> </code><code>#显示 puppet 帮助信息</code>
<code>puppet resource</code>
<code>puppet describe</code>
<code>puppet status</code>
四、常用的核心资源( puppet describe -l)
在定义资源时,资源类型必须使用小写字符,资源名称仅是一个字符串,但要求在同一个类型中的其必须惟一.
如,可以同时存在名为niginx的"service"和"package"资源,但在"package"类型资源中只能有一个名为"nginx"
puppet resouce 命令可用于交互式查找及修改puppet资源
资源定义格式:
type {'title':
key =>values,
........
}
1、package
puppet支持使用的软件包管理器:
yum,rpm,apt,ports,gem,msi,dpkg,pkg等
package 常用参数
ensure:程序包目标状态
ensure => {present|installed|absent|latest|purged|"version"}
=> present|installed, 检查文件是否存在,不存在则新建之
=> absent, 无其他软件依赖,可删除,否则会报错。
=> latest, 检查文件是否为最新版本,否则升级为最新版本
=> purged, 删除该包包括所有依赖的包,有风险慎用
=> "2.7.21-1", 指定某一个版本处于安装状态
name:资源的名称,即软件包的名字(默认与 title 相同可不写)
source :指定程序包文件路径
provider:软件包括管理器(注:如通过 rpm 命令安装包,需要通过 source 指定安装那些包)
install_options :安装选项,最常的用是通过INSTALLDIR指定安装目录
例:安装haproxy
<code>[root@essun tmp]</code><code># rpm -q haproxy</code>
<code>package haproxy is not installed</code>
<code>[root@essun tmp]</code><code># cat haproxy_setup.pp</code>
<code>package {</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>name => haproxy</code>
<code>}</code>
<code>[root@essun tmp]</code><code># puppet apply haproxy_setup.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[haproxy]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>16.53 seconds</code>
<code>haproxy-1.4.24-2.el6.x86_64</code>
2、service :管理服务
ensure:服务的目标状态,true|false|running|stopped
enable :是否开机自动启动
enable => true|false 指定服务是否开机自启动(修改 chkconfig 部分),并非对所有均有效
name: 服务名称
name => "service name",该资源的 namevar, 服务的名字,通常就是在/etc/init.d/目录下的名字,默认与 title 相同
path:脚本路径
path => "/etc/rc.d/init.d", 启动脚本的搜索路径,可以用冒号分割多个路径,或者用数组指定
start :是否启动服务
stop:是否停止服务
restart:是否重启服务
restart => true |false, 指出管理脚本是否支持 restart 参数,如果不支持,就用 stop 和 start实现 restart 效果.
status:判断服务是否已经在运行
status => true|false, 指出管理脚本是否支持 status 参数,puppet 用 status 参数来判断服务是否已经在运行了,如果不支持 status 参数,puppet 利用查找运行进程列表里面是否有服务名来判断服务是否在运行
例:启动haproxy
<code>[root@essun tmp]</code><code># cat haproxy_setup.pp</code>
<code>service {</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>name => haproxy,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code>
<code>[root@essun tmp]</code><code># puppet apply haproxy_setup.pp -v</code>
<code>info: Applying configuration version </code><code>'1400171155'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Service</code><code>[haproxy]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>9.21 seconds</code>
<code>[root@essun tmp]</code><code># chkconfig --list haproxy</code>
<code>haproxy 0:off 1:off 2:on 3:on 4:on 5:on 6:off</code>
3、file:管理文件,目录,符号链接
生成文件内容、管理文件权限、属性
通过source属性到指定位置下载文件
通过recurse属性来获取目录
常用属性
ensure => {present|absent|directory|file|link}, 指定文件的目标状态
=> present, 检查文件是否存在,不存在则新建之
=> absent, 检查文件是否存在,存在则删除之
=> directory, 指定这是一个目录,不存在则创建
backup:通过filebucket资源备份文件,值通常为filebucket资源名称
content:文件内容:生成方式有三种(content,source,target),彼此互斥
content => "hello",|content => template("postfix/main.cf.erb"), 文件的具体内容,亦可由 erb 模板生成,选择这个可不写资源 source
source:通过指定的url下载文件至本地,获取方式通常为puppet url,格式为puppet:///modules/MODULE_NAME/file_name;
target:为符号链接指定目标
links:文件为符号链接{follow|manage}
path:文件路径,必须使用双引号;
path => "/etc/postfix/main.cf", 文件完整路径。默认与 title 相同可不写
mode:定义权限
mode => 0644, 权限属性,四位八进制数
owner:属主
owner|user => root, 所属用户,也可以用 UID
group:属组
group => puppet, 所属用户组,也可以用 GID
force:强制执行删除文件、链接或目录;仅用于ensure为absent时:
purge:清空指定目录中存在的,但未在资源中定义的文件。
recurse:目录递归
recurse => '{true|false|inf|remote}', 对目录是(true)否(false)递归(ensure =>directory 时有效)
replace:替换,本地存在的文件与资源中指定的文件内容不同时,是否执行替换,默认为否
例:
<code>[root@dynamic tmp]</code><code># mkdir -pv /tmp/dir1/{dir2,dir3,dir4}</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1/dir2</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1/dir3</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1/dir4</code><code>'</code>
<code>[root@dynamic tmp]</code><code># cat mkdir.pp</code>
<code>file</code><code>{ </code><code>"/tmp/dir1"</code><code>:</code>
<code>owner => </code><code>"puppet"</code><code>,</code>
<code>group => </code><code>"puppet"</code><code>,</code>
<code>mode => 0700,</code>
<code>ensure => directory,</code>
<code>recurse => </code><code>true</code><code>,</code>
<code>purge => </code><code>true</code><code>,</code>
<code>force => </code><code>true</code><code>,</code>
<code>ignore => </code><code>"dir2"</code><code>,</code>
<code>[root@dynamic tmp]</code><code># puppet apply mkdir.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/dir1</code><code>]</code><code>/owner</code><code>: owner changed </code><code>'root'</code> <code>to </code><code>'puppet'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/dir1</code><code>]</code><code>/group</code><code>: group changed </code><code>'root'</code> <code>to </code><code>'puppet'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/dir1</code><code>]</code><code>/mode</code><code>: mode changed </code><code>'0755'</code> <code>to </code><code>'0700'</code>
<code>notice: </code><code>/File</code><code>[</code><code>/tmp/dir1/dir4</code><code>]</code><code>/ensure</code><code>: removed</code>
<code>notice: </code><code>/File</code><code>[</code><code>/tmp/dir1/dir3</code><code>]</code><code>/ensure</code><code>: removed</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.06 seconds</code>
<code>[root@dynamic tmp]</code><code># ll -d dir1/</code>
<code>drwx------ 3 puppet puppet 4096 May 18 14:29 dir1/</code>
<code>[root@dynamic dir1]</code><code># ll</code>
<code>total 4</code>
<code>drwxr-xr-x 2 root root 4096 May 18 14:28 dir2</code>
4、exec :执行外部命令,通常用于完成puppet自身无法完成的功能
常用属性
command :要执行的命令,通常为命令文件的完整路径
path:命令搜索路径.(如果path 没有被定义,命令需要使用绝对路径。路径可以以数组或以冒号分隔的形式来定义。)
user:定义运行命令的用户
group:定义运行命令的用户组
onlyif:0,表示仅在命令的状态返回值为0时才执行此命令。
refresh:接收到其它资源的通知时,如何重新执行此命令
refreshonly:仅当被依赖的资源发生改变时才被触发
tries:尝试的次数,默认为1;
try_sleep:多次尝试之间的时间间隔
例
<code>[root@dynamic tmp]</code><code># cat temp.pp</code>
<code>exec</code> <code>{</code><code>'echo temp'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>'mktemp /tmp/tmp.XXX'</code><code>,</code>
<code> </code><code>path => [ </code><code>"/bin"</code><code>,</code><code>"/sbin"</code><code>,</code><code>"/usr/bin"</code><code>,</code><code>"/usr/sbin"</code> <code>],</code>
<code>[root@dynamic tmp]</code><code># puppet apply temp.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[</code><code>echo</code> <code>temp]</code><code>/returns</code><code>: executed successfully</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.10 seconds</code>
<code>[root@dynamic tmp]</code><code># ll</code>
<code>total 12</code>
<code>drwx------ 3 puppet puppet 4096 May 18 14:29 dir1</code>
<code>srwxrwxrwx 1 mysql mysql 0 May 4 14:19 maria.sock</code>
<code>-rw-r--r-- 1 root root 166 May 18 14:24 </code><code>mkdir</code><code>.pp</code>
<code>-rw-r--r-- 1 root root 111 May 18 15:09 temp.pp</code>
<code>-rw------- 1 root root 0 May 18 15:09 tmp.ZeW</code>
资源引用:
在引用时,"Type"首字母必须大写,如:Package ['nginx']
元参数:用于定义资源间依赖关系及应用次序。
通知机制:应用产生的消息
特殊属性
notify:调试输出
常用参数
message :信息内容
name :消息名称
<code>[root@dynamic tmp]</code><code># cat messages.pp</code>
<code>file</code> <code>{</code><code>'/tmp/messages.txt'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>content =></code><code>"hello puppet!"</code><code>,</code>
<code> </code><code>notify => Exec[</code><code>'messages'</code><code>]</code>
<code>exec</code> <code>{</code><code>'messages'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>'echo "/tmp/message.txt" >> /tmp/message.txt'</code><code>,</code>
<code> </code><code>refreshonly =></code><code>true</code><code>,</code>
<code> </code><code>path => </code><code>"/bin/:/sbin/:/usr/bin:/usr/sbin"</code>
<code>[root@dynamic tmp]</code><code># puppet apply messages.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/messages</code><code>.txt]</code><code>/content</code><code>: content changed </code><code>'{md5}e147509e8f852facd239743193e249c2'</code> <code>to </code><code>'{md5}d007288adc523f44584e631abde90137'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[messages]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.21 seconds</code>
<code>[root@dynamic tmp]</code><code># cat message.txt</code>
<code>/tmp/message</code><code>.txt</code>
<code>[root@dynamic tmp]</code><code># cat messages.txt</code>
<code>hello puppet!</code>
<code>[root@dynamic tmp]</code><code>#</code>
subscribe:主动关注所关联的资源的变化
<code> </code><code>content =></code><code>"how are you"</code><code>,</code>
<code> </code><code>command</code> <code>=> </code><code>'echo "/tmp/messages.txt changed" >> /tmp/message.txt'</code><code>,</code>
<code> </code><code>subscribe => File[</code><code>'/tmp/messages.txt'</code><code>],</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[messages]</code><code>/returns</code><code>: executed successfully</code>
<code>how are you</code>
<code>/tmp/messages</code><code>.txt changed</code>
require:必须依赖于那一个资源
<code>[root@dynamic tmp]</code><code># cat ha_setup.pp</code>
<code>package{</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>before => Service[</code><code>'haproxy'</code><code>],</code>
<code>file</code><code>{</code><code>'/etc/haproxy/haproxy.cfg'</code><code>:</code>
<code> </code><code>source</code><code>=></code><code>'/tmp/haproxy.cfg'</code><code>,</code>
<code> </code><code>owner=></code><code>'root'</code><code>,</code>
<code> </code><code>group=></code><code>'root'</code><code>,</code>
<code> </code><code>mode=></code><code>'640'</code><code>,</code>
<code> </code><code>require=>Package[</code><code>'haproxy'</code><code>],</code>
<code>service{</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure=>running,</code>
<code> </code><code>enable</code><code>=></code><code>true</code><code>,</code>
<code>[root@dynamic tmp]</code><code># puppet apply ha_setup.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/haproxy/haproxy</code><code>.cfg]</code><code>/mode</code><code>: mode changed </code><code>'0644'</code> <code>to </code><code>'0640'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>24.91 seconds</code>
<code>[root@dynamic tmp]</code><code># ll /etc/haproxy/</code>
<code>-rw-r----- 1 root root 3142 Jul 10 2013 haproxy.cfg</code>
<code>[root@dynamic tmp]</code><code># service haproxy status</code>
<code>haproxy (pid 6266) is running...</code>
说明,package 资源属性一定要在service 之前应用,如果package没有应用成功,那么service 资源将不会被应用。
before:file资源一定要在service 资源之前执行
应用链次序链与通知链
->用于定义次序链
~>用于定义通知链
<code> </code><code>notify=>Exec[</code><code>'monitor'</code><code>]</code>
<code> </code><code>restart =></code><code>'/etc/rc.d/init.d/haproxy reload'</code>
<code>exec</code><code>{</code><code>'monitor'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>'echo "/tmp/haproxy.cfg己经重载" >> /tmp/hainfo.txt'</code><code>,</code>
<code> </code><code>path => </code><code>"/bin:/sbin:/usr/sbin:/usr/bin"</code>
<code>Package[</code><code>'haproxy'</code><code>]->File[</code><code>'/etc/haproxy/haproxy.cfg'</code><code>]->Exec[</code><code>'monitor'</code><code>]~>Service[</code><code>'haproxy'</code><code>]</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/haproxy/haproxy</code><code>.cfg]</code><code>/content</code><code>: content changed </code><code>'{md5}c6e95eb3da150a74e6c8c2e70488083e'</code> <code>to </code><code>'{md5}1f337186b0e1ba5ee82760cb437fb810'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[monitor]</code><code>/returns</code><code>: executed successfully</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[monitor]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.90 seconds</code>
<code>[root@dynamic tmp]</code><code># cat hainfo.txt</code>
<code>/tmp/haproxy</code><code>.cfg己经重载</code>
5、group: 系统上用户组
ensure:目标状态,present,absent
name:组名
gid:组ID
system:系统组
6、user:系统上用户
ensure:目标状态
name:用户名
uid:用户ID
system:系统用户
gid:组名或组ID
home:用户的家目录。必须是己创建的目录,如果没有创建,则不检查
shell:指定其shell
password:指定用户密码
mangehome: 是否建立家目录。true or false
<code>[root@dynamic tmp]</code><code># cat useradd.pp</code>
<code>group {</code><code>'groupadd'</code><code>:</code>
<code> </code><code>ensure =>present,</code>
<code> </code><code>gid =>1010,</code>
<code> </code><code>name =>essun,</code>
<code>}-></code>
<code>user {</code><code>'useradd'</code><code>:</code>
<code> </code><code>uid =>1010,</code>
<code> </code><code>shell =></code><code>"/bin/bash"</code><code>,</code>
<code> </code><code>home =></code><code>"/home/essun"</code><code>,</code>
<code> </code><code>managehome =></code><code>true</code><code>,</code>
<code> </code><code>password =></code><code>'$1$wvZ8j1$mPa3IT.9vTdCb6sOuvdeu/'</code>
<code> </code>
<code>[root@dynamic tmp]</code><code># puppet apply useradd.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Group</code><code>[groupadd]</code><code>/ensure</code><code>: created</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//User</code><code>[</code><code>useradd</code><code>]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.50 seconds</code>
<code>[root@dynamic tmp]</code><code># su essun</code>
<code>[essun@dynamic tmp]$ </code><code>whoami</code>
<code>essun</code>
<code>[essun@dynamic tmp]$ </code><code>cd</code>
<code>[essun@dynamic ~]$ </code><code>pwd</code>
<code>/home/essun</code>
<code>[essun@dynamic ~]$ </code><code>id</code> <code>essun</code>
<code>uid=1010(essun) gid=1010(essun) </code><code>groups</code><code>=1010(essun)</code>
7、notify:调试输出
常用参数
message :信息
name
notify {'notice': message => '/etc/fstab changed',}
8、cron :管理 cron
ensure :目标状态(present)
command:执行的命令
environment:运行时的环境变量
hour:小时
minute :分钟
month:月份
monthday:日
weekday 周
name:名字
user: 运行此周期性任务计划的用户,如果没有指出,默认为root
<code>[root@dynamic tmp]</code><code># cat cron.pp</code>
<code>cron</code> <code>{</code><code>'ntpdate'</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>command</code> <code>=> </code><code>'/usr/sbin/ntpdate cn.poolntp.org &> /dev/null'</code><code>,</code>
<code> </code><code>minute => </code><code>'*/5'</code><code>,</code>
<code>[root@dynamic tmp]</code><code># puppet apply cron.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Cron</code><code>[ntpdate]</code><code>/ensure</code><code>: created</code>
<code>[root@dynamic tmp]</code><code># date</code>
<code>Sun May 18 17:42:21 CST 2014</code>
<code></code>
本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1413244,如需转载请自行联系原作者