Puppet配置语法初步介绍及示例

实例一、文件分发

描述:通过puppet服务端可以向被管理机(客户端)上推送文件,方法是使用file类型的source属性

第一步:
#vi /etc/puppet/fileserver.conf
puppetmasterd自带一个简易的文件服务器,配置方法是编辑/etc/puppet/fileserver.conf,增加一个配置片段myfiles
------------------------------------
[myfiles]
path /opt/              // 设置待推送的文件/文件夹相对模块根目录,结合后面的体会含义
allow 192.168.1.0/24    // 设置准许连接到服务端的主机地址

第二步: 
#vi /etc/puppet/manifests/site.pp
-------------------------------------
file
{ 
"/bbb/redis-2.4.tar.gz":        //客户端将要生成的拷贝文件名称
source => "puppet://server.puppet/myfiles/redis-2.4.tar.gz"
    /*          
	source字段为服务器端一个被传送文件/文件夹,       
        puppet.server为puppet服务器名称,即hostname,生产环境下用内部的DNS上作解析,
        myfiles为上步中/etc/puppet/fileserver.conf文件中配置的module名称,每个module都有单独的path和allow等属性,这里的myfiles映射到path为/opt/的文件系统实际路径,
        redis-2.4.tar.gz为服务器端文件系统中一个相对于module中path的文件实际路径。
        综上:这段配置实际含义是把服务端/opt/redis-2.4.tar.gz文件传到客户端/bbb/redis-2.4.tar.gz。
    */
}

第三步: 在客户端执行更新命令,即可看到服务端的文件已经分发到客户端了。
#puppetd --test --server server.puppet


如果要分发文件夹,作如下配置

#vi /etc/puppet/manifests/site.pp
-------------------------------------
file
{ 
"/bbb/redisdir":      //客户端将要生成的拷贝文件目录名称
source => "puppet://server.puppet/myfiles/redisdir",
recurse=>true,        //递归拷贝
ensure=>directory,    //确保客户端/bbb/redisdir目录存在
force=>true           //强制删除或覆盖已存在目录
}
说明:使用上面配置,当服务端源文件夹内增加、更新文件时,客户端会自动 增加、更新,但 服务端源文件夹内删除文件后,客户端不会自动删除。不清楚Puppet是否支持。如果不支持,考虑使用https://github.com/onyxpoint/pupmod-rsync这个Puppet扩展模块。网址http://www.puppetfans.com/thread-321-1-1.html里是一个实例,可参考。

实例二、修改文件属性


描述:把客户端的/tmp/dd142/ puppet-2.6.13.tar.gz文件的权限改为puppet用户,并设置权限为666。

第一步:编辑服务端的site.pp 
#vi /etc/puppet/manifests/site.pp
------------------------------------------------------
file
{ "/tmp/dd142/puppet-2.6.13.tar.gz":
owner => "puppet",
group => "puppet",
mode => 666,
}


第二步:在客户端执行命令
#puppetd --test --server server.puppet


实例三、执行shell命令或shell脚本

描述:通过puppet分发执行shell脚本,在客户端的opt目录下新建一目录shelldir。

第一步:编辑服务端的site.pp
vi /etc/puppet/manifests/site.pp 
--------------------------------------------- 
exec { "exec-mkdir": 
cwd => "/opt",      //切换到命令行运行时目录
command => "sh /opt/lgh.sh", 
user => "root", 
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin", 
} 

第二步:在客户端编辑上一步command路径中指定的shell脚本,例如
vi /opt/lgh.sh 
---------------------------------------------
#!/bin/bash 
mkdir /opt/shelldir 

第三步:在客户端执行命令
# puppetd --test --server server.puppet 

在/opt目录下查看shelldir目录有没有建立。

简单说来exec资源就是在执行puppet的时 候,调用shell执行一条shell语句。通过exec可执行程序,还可以设置执行时的path,环境变量,user/group,是否记录output等,很方便,例如:

exec { “/root/puppet/nagiosclient/nrpe.sh”:
    cwd => “/root/puppet”,
    timeout => 7200,
    logoutput => on_failure,
    user => root,
    path => ["/sbin", "/usr/sbin", "/usr/local/sbin", "/root/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/lib64/jvm/jre/bin"],
    require => File["/root/puppet/nagiosclient/nrpe.sh"]
}

想在各客户机上执行时,我一般就是先用上述file资源的配置把该脚本推送到客户机上,然后用空上exec资源去执行它,注意exec中要配置好require 该file,否则无法保证exec在file之类在客户上执行。

有人说,“exec资源在不到万不得已的时候不要去用,如果能用脚本实现,尽量写成脚本通过file资源分发到服务器上面。然后用其他的方式来调用脚本。例如crontab。虽然puppet提供了crontab资源,但是你完全可以用file资源来把 crontab任务放到 /etc/ cron.d目录下来实现crontab资源的管理。使用puppet的时候,尽量用最简单的语法,越是花哨的语法也越容易出错


实例四、cron计划任务

描述:接上面的shell程序实例,在17:30执行/opt/lgh.sh。

第一步:编辑服务端的site.pp
vi /etc/puppet/manifests/site.pp 
--------------------------------------------- 
cron { "cron-shell": #title部分,可用来作为注释。 
command => "sh /opt/lgh.sh" #要执行的命令 
user => "root", #添加到root用户下的crontab中 
minute => "30", #即第一个星号 
hour => "17" #即第二个星号 
} 

第二步:在客户端执行命令
[root@client ~]# puppetd --test --server server.puppet 

然后在客户端使用#crontab -l查看效果

[root@client ~]# crontab -l
# HEADER: This file was autogenerated at Mon Nov 04 16:56:25 +0800 2013 by puppet.
# HEADER: While it can still be managed manually, it is definitely not recommended.
# HEADER: Note particularly that the comments starting with 'Puppet Name' should
# HEADER: not be deleted, as doing so could cause duplicate cron jobs.
# Puppet Name: cron-shell
30 17 * * * sh /opt/lgh.sh


实例五、服务检查及状态修改

    描述:可以通过puppet对一些服务进行检查。puppet是通过service命令操作的。所以,只能针对在/etc/init.d/目录下的服务 。下面演示把客户端的防火墙开启。

第一步:编辑服务端的site.pp
#vi /etc/puppet/manifests/site.pp  
---------------------------------------------- 
service 
{ iptables: 
ensure => "running", 
} 


第二步:在客户端执行命令
#puppetd --test --server server.puppet


参考 : 

http://blog.loudly.me/tag/puppet/

你可能感兴趣的:(Puppet配置语法初步介绍及示例)