存档

文章标签 ‘puppet’

Puppet笔记:介绍及基本用法

2009年6月5日

Puppet是一个可以管理大量linux主机的系统,它的中心思想是让主机上的某个资源与配置文件(manifest)对该资源的设计一致,这里资源可以指一个文件、一个用户、一个软件包、一条cron中的任务等实体。例如下面的一段manifest:

 

file { “/etc/sudoers”:
    owner => root,
    group => root,
    mode => 440
}

它的作用就是指明了:/etc/sudoers这个文件,其owner应为root,group应为root,mod应为440。执行的时候,客户端会判断这三点是否符合,如果不符合,它会去设置user、group、mode等的值为设置的值。

安装

Puppet的结构也是一个唯一(以后会有failover冗余)的中心Server与所有的Client组成。

Puppet是基于Ruby写成的,所以安装前要准备好Ruby环境,并且需要安装RubyGems以用来安装。Server与Client的安装没有区别,都在相同的包内,只是中心的server上运行的是puppetmasterd,被管理机上运行的是puppetd。另外,每台主机上一定要配置好自己的hostname,之后每台机器要以hostname区分。

如果ruby环境和gems都装好了,执行下面几句就可以安装好puppet了:

wget puppet.proximic.cnpuppet/facter-1.5.5.gem
gem install facter-1.5.5.gem
wget puppet.proximic.cn/puppet/puppet-0.24.8.gem
gem install puppet-0.24.8.gem

使被管理机与中心机连接

server端首次运行前,编辑/etc/puppet/manifests/site.pp文件,内容可以用最基本的:

 

# site.pp
file { "/etc/sudoers":
    owner => root, group => root, mode => 440
}

 

启动server,执行:puppetmasterd –mkusers,这个参数是为了生成puppet运行所用用户,以后执行就不需要了。

然后在客户机上执行:puppetd –server <你的服务器地址> –waitforcert 60 –test,这时客户机会去连server,但是由于连接是在ssl上的,而Server还没有sign过客户的cert,这时客户机被被断开。到server上执行:puppetca –list,会显示出刚才这个客户的hostname为等待签名的客户,执行:puppetca –sign <客户hostname> 即可为其签名。这时再到客户机上执行上面的puppetd命令,即可看到客户在正常地连接server,并且检测上面关于sudoers文件的策略了。

向被管理机分发文件

通过puppet可以向被管理机上推送文件,方法是使用file类型的source属性,例如:

file {
    ”/etc/profile.d/java.sh”:
    source => “puppet://puppet.domain.com/profiles/javaprofile.sh”,
    owner => root,
    group => root,
    mode => 755
}

这里的文件来源是什么呢?puppetmasterd自带一个简易的文件服务器,配置方法是创建并编辑/etc/puppet/fileserver.conf ,其中每个section是一个module,module就是指上述puppet://路径中域名之后的第一段(即“profiles”),下面可以配置该module对应的server上的物理路径以及acl等,例如:

[profiles]
    path /home/misc/profiles
    allow *

这样如果客户端上该文件不存在,或者内容不同(通过checksum),就会从server上把这个文件拉过去。

执行脚本

很复杂的部署任务肯定不能完全靠puppet完成,这时我会写一个部署用的脚本。Puppet有一种“资源”叫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之类在客户上执行。

运维 ,