puppet的语法:

puppet是用ruby编写的,因此puppet的语法也和ruby类似,都是很简单的面向对象的高级语言。
puppet把需要管理的内容抽象成资源,每种资源有不同的属性,因此puppet 语言就是描述这些资源的属性以及资源
之间关系的语言。
 
1.资源
定义一个资源,需要指定资源的类型和资源的title。
例1:
file {
"/tmp/test.txt":
name => "/tmp/test.txt",
owner => "test",
group => "test",
mode => 777,
}
 
file是指定资源的类型,"/tmp/test.txt"是资源的title,它的作用是让puppet能唯一标识这个资源。name指定了要对那个文件操作,默认情况下,name等于title,所以很多时候name可以省略。
例2:
file {
"sshdconfig":
name => $operatingsystem ? {
solaris => "/usr/local/etc/ssh/sshd_config",
default => "/etc/ssh/sshd_config",
},
owner => root,
group => root,
mode => 644,
}
 
资源的title是sshdconfig,但是name却可以通过判断操作系统自己选择合适的值。这样,当其他资源要依赖sshdconfig的时候,只需要说明依赖sshdconfig就行了,不需要关心文件到底在什么路径。如以下:
 
service { "sshd":
subscribe => File[sshdconfig],
}
 
指定了一个sshd的服务,这个服务如果发现文件资源sshdconfig有变动,就会自己reload配置文件。
 
还以可以把多个资源的title写在一起,如:
 
file {
["/tmp/test.txt", "/tmp/test1", "/tmp/test2.txt"]:
ensure => present,
owner => "test",
group => "test",
mode => 777,
}
 
还可以化繁为简,将file定义为默认的值,写在site.pp开头
 
File { owner => root, mode =>644 ,}
 
这样所有的file资源的owner是root,mode是644,默认值可以被后面的设置覆盖。
 
资源依赖
例如资源A依赖资源B,如果资源B不存在,资源A就不被执行。定义资源依赖的属性是require。
例:
file {
"/tmp/status.txt":
content => "mysql already running",
require => Service ["mysqld"],
}
service {
"mysqld"
ensure => running;
}
要求mysqld服务必须是运行的,才执行相应的操作。
 
2.类和函数
类的作用是把一组资源收集在一个盒子里,一起使用,使用把sshd和它的配置文件做成一个ssh类,其他的地方要用到就直接包含ssh类就可以了,这样代码方便、简洁、便于维护。
 
class ssh{
file {
"/etc/ssh/sshd_config":
source => "puppet://$fileserver/ssh/sshd_config.cfg";
}
package {
"ssh":
ensure => installed;
}
service {
"ssh":
ensure => running;
}
}
 
puppet官方没有函数这个说法,叫做define
例:
define svn_repo($path) {
exec {
"/usr/bin/svnadmin create $path/$title":
unless => "/bin/test -d $path",
}
}
 
svn_repo {
puppet_repo:
path => "/var/svn_puppet" }
svn_repo {
other_repo:
path => "/var/svn_other" }
 
define定义了一个svn_repo函数并带了两个$path和$title变量;后两句分别指定了$path和$title的值,使用定义好的函数创建了两个svn库。
 
3.节点
puppet使用node区分不同的客户端,以分配不同的manifest。
例:
node 'shell.example.com' {
file{"/tmp/al.txt":
content => "hello world",
owner => root,
group => root,
mode => 644,
}
}
以上是针对shell.example.com的node配置
 
node default {
file{"/tmp/aa.txt":
content => "Hello,World! \n",
mode => 644,
owner => root,
group => root,
}
}
以上是针对全局客户端的node配置
 
4.变量
puppet支持变量,用$定义变量,变量内容用双引号括起来
例:
node 'shell.example.com' {
$test="Hello World!!!!"
file{"/tmp/al.txt":
content => $test;
owner => root,
group => root,
mode => 644,
}
 
puppet还可以使用由facter提交的变量,facter在客户端收集系统信息整理成不同的变量提交给puppet服务端。可以通过直接运行facter命令查看相关的变量值。
 
5.模块
引入模块,结构化代码,便于分享和管理。在管理大量服务器中,起到巨大的作用,模块文件会在site.pp都引用。
模块目录/etc/puppet/modules需要手动创建,一个模块目录结构,通常包括以下目录:
[root@server modules]# pwd
/etc/puppet/modules
[root@server modules]# ls
files  manifests  templates
 
manifests里面必须要包括一个模块初始文件init.pp,导入一个模块的时候,会从init.pp开始执行。可以把所有的代码都写在init.pp里面,也可以分成多个pp文件,init再去包含其他文件。
files模块的文件发布目录。
templates目录包含erb模型文件,这个和file资源的template属性有关。
 
简单的模块:
a.建立目录结构
[root@server ~]# mkdir -p /etc/puppet/modules/test/{manifests,files,templates}
[root@server ~]# cd /etc/puppet/modules/
[root@server modules]# cd test/
[root@server test]# ls
files  manifests  templates
 
b.建立init.pp文件
[root@server test]# vim manifests/init.pp
class test {
file { "/tmp/modules.txt":
        content => "This is a test files",
        ensure => present,
        owner => "root",
        group => "root",
        mode => 644,
     }
}
 
c.在/etc/puppet/manifests中建立node配置文件
[root@server test]# cd /etc/puppet/manifests/
[root@server manifests]# vim nodes.pp 
node "client.example.com" {
        include test
}
 
d.在/etc/puppet/manifests中配置site.pp
[root@server manifests]# vim site.pp
import "nodes.pp"
 
e.在客户端上测试
[root@client ~]# puppetd -t --server server.example.com
info: Caching catalog for client.example.com
info: Applying configuration version '1332780551'
notice: /Stage[main]/Test/File[/tmp/modules.txt]/ensure: created
notice: Finished catalog run in 0.01 seconds
You have new mail in /var/spool/mail/root
[root@client ~]# cat /tmp/modules.txt 
This is a test files
 
 
参考:http://puppet.wikidot.com/