先講講shell 與puppet的不同。
shell 腳本是過程式的,裡面描述的是指令執行的過程,shell 通常很短,可以很快寫出來,但是很快又會被抛棄,它常常依賴于特定作業系統環境。
puppet 語言是結果式的,使用者将自己想要達到的目的通過puppet文法描述給puppet,puppet去完成它,使用者不需要關心過程,整個過程完全被抽象化了。譬如安裝一個軟體包,隻需要ensure => present ,不需要關心作業系統是debian還是redhat 。
個人總結看來,puppet語言形式上的特點就是“花括号分類,冒号聲明,逗号結束”。
接下來講puppet的文法,主要是舉例(持續完善中,,,)
1、軟體包管理
安裝
1
<code>package {</code><code>"vim"</code><code>: ensure => present, }</code>
多個軟體包也可以一起寫,用中括号和逗号
2
3
4
<code>package {</code>
<code> </code><code>[</code><code>"httpd"</code><code>,</code><code>"mysql-server"</code><code>,</code><code>"php"</code><code>,</code><code>"php-mysql"</code><code>]:</code>
<code>ensure => present,</code>
<code>}</code>
解除安裝
<code>package {</code><code>"vim"</code><code>: ensure => absent, }</code>
2、權限管理
5
<code>file</code> <code>{ </code><code>"/etc/sudoers"</code><code>:</code>
<code> </code><code>owner => root,</code>
<code> </code><code>group => root,</code>
<code> </code><code>mode => 400,</code>
權限遞歸
<code>file</code> <code>{ </code><code>'/some/dir'</code><code>:</code>
<code> </code><code>mode => 644,</code>
<code> </code><code>recurse => </code><code>true</code><code>,</code>
<code> </code><code>}</code>
目錄裡的所有檔案會變成644,目錄就會755
3、服務
6
<code>service {</code><code>"sshd"</code><code>:</code>
<code> </code><code>hastatus => </code><code>true</code><code>,</code>
<code> </code><code>harestart => </code><code>true</code><code>,</code>
<code> </code><code>ensure => running,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
4、檔案管理
檔案托管
<code>file</code> <code>{</code><code>"/etc/my.cnf"</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>source</code> <code>=> </code><code>"puppet:///modules/mysql/my.cnf"</code>
<code> </code><code>owner => mysql,</code>
<code> </code><code>group => mysql,</code>
這裡有個地方比較蛋疼,檔案路徑是/etc/puppet/modules/mysql/files/my.conf,寫成puppet規則時files會被省略,寫成puppet:///modules/mysql/my.cnf
連結
<code>file</code> <code>{ </code><code>"/etc/inetd.conf"</code><code>:</code>
<code> </code><code>ensure => link,</code>
<code> </code><code>target => </code><code>"/etc/inet/inetd.conf"</code><code>,</code>
5、監視和審計
<code>file</code> <code>{ </code><code>"/etc/passwd"</code><code>:</code>
<code> </code><code>audit => [ owner, mode ],</code>
(當檔案的權限屬性發生變化時發出消息,而不修正權限)
6、執行指令
7
8
9
<code>exec</code> <code>{ </code><code>"reload nginx"</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>"/usr/sbin/nginx reload"</code><code>,</code>
<code> </code><code>require => Package[</code><code>"nginx"</code><code>],</code>
<code> </code><code>refreshonly => </code><code>true</code><code>,</code>
<code>file</code> <code>{ </code><code>"/etc/nginx/nginx.conf"</code><code>:</code>
<code> </code><code>source</code> <code>=> </code><code>"puppet:///modules/nginx/nginx.conf"</code><code>,</code>
<code> </code><code>notify => Exec[</code><code>"reload nginx"</code><code>],</code>
(notify表示配置檔案發生更改,就觸發nginx平滑重新開機)
7、定時任務crontab
<code>cron</code> <code>{ ntpdate:</code>
<code> </code><code>command</code> <code>=> </code><code>"/usr/sbin/ntpdate 192.168.1.3"</code><code>,</code>
<code> </code><code>user => root,</code>
<code> </code><code>hour => </code><code>'*/4'</code><code>,</code>
<code> </code><code>minute => </code><code>'1'</code><code>,</code>
<code> </code><code>ensure => present,</code>
(這樣會導緻流量瞬間擁擠,puppet很周到,提供一個僞随機的辦法)
<code> </code><code>minute => fqdn_rand( 60 ),</code>
(盡管是每四個小時運作一次,但是不同的機器還是會在不同的時刻去執行指令【分鐘數為0-60随機】,将流量分散開來。)
8、删除
<code>tidy { clean_temp:</code>
<code> </code><code>path => </code><code>"/tmp/temp"</code><code>,</code>
<code> </code><code>type</code> <code>=> </code><code>"ctime"</code><code>,</code>
<code> </code><code>recurse => </code><code>true</code><code>,</code>
<code> </code><code>rmdirs => </code><code>true</code><code>,</code>
<code> </code><code>age => </code><code>"1d"</code><code>,</code>
<code> </code><code>backup => </code><code>false</code><code>,</code>
(recurse表示遞歸)
進階用法之class
單獨的class
10
11
12
13
14
15
16
17
18
<code>class </code><code>ssh</code> <code>{</code>
<code>package {</code><code>"openssh-server"</code><code>:</code>
<code>file</code> <code>{</code><code>"/etc/ssh/sshd_config"</code><code>:</code>
<code> </code><code>source</code> <code>=> </code><code>"puppet:///files/sshd_config"</code><code>,</code>
<code> </code><code>notify => Service [</code><code>"sshd"</code><code>],</code>
<code> </code><code>hasstatus => </code><code>true</code><code>,</code>
<code> </code><code>hasrestart => </code><code>true</code><code>,</code>
合并的class(class可以被引用,成為另一個class的子集,用逗号分隔,結尾沒有逗号)
<code>class basic {</code>
<code> </code><code>include </code><code>ssh</code><code>, httpd</code>
節點的文法和引用class一樣
<code>node </code><code>"apache01.test.org"</code> <code>{</code>
<code> </code><code>include httpd,mysql,php</code>
使用者管理
19
<code>user { </code><code>"root"</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>name => </code><code>"root"</code><code>,</code>
<code> </code><code>password => </code><code>"SomeAlreadyEncryptedPassword"</code><code>;</code>
<code>user {</code><code>"admin"</code><code>:</code>
<code> </code><code>name =></code><code>"admin"</code><code>,</code>
<code> </code><code>shell => </code><code>"/bin/bash"</code><code>,</code>
<code> </code><code>home => </code><code>"/home/admin"</code><code>,</code>
<code> </code><code>groups</code> <code>=> </code><code>"admin,wheel"</code><code>,</code>
<code> </code><code>uid => 500,</code>
<code> </code><code>gid => 500,</code>
<code> </code><code>password => </code><code>'$1$Nnh0M0$t9s7Bbwx2fFer6IP/QGdA0'</code><code>,</code>
<code> </code><code>require => Group[</code><code>"admin"</code><code>],</code>
<code>group {</code><code>"admin"</code><code>:</code>
<code> </code><code>ensure =>present,</code>
(password也就是/etc/shadow中的已經加密的密碼,把它複制出來就好了,密碼中包含 $ 的話,一定要記得加單引号。)
puppet還可以獨立于master單獨運作,功能也足夠強大,幾乎所有能寫成puppet規則的語句,都可以直接在puppet指令行執行,例如:
1、安裝軟體包
<code>puppet resource package httpd ensure=present</code>
puppet 可以識别常見的linux發行版,自動調用yum或者apt去安裝軟體。
2、管理服務
<code>puppet resource service httpd ensure=running </code><code>enable</code><code>=</code><code>true</code>
puppet會調用/etc/init.d/下的啟動腳本,這個比常見的監控腳本強太多了。(puppet 2.7以上)
3、将規則寫入本地檔案來執行
<code>puppet apply </code><code>/opt/puppet/rules/init</code><code>.pp</code>
本文轉自 紫色葡萄 51CTO部落格,原文連結:http://blog.51cto.com/purplegrape/946362,如需轉載請自行聯系原作者