puppet的语法:node
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/