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/