天天看點

puppet文法學習

先講講shell 與puppet的不同。

shell 腳本是過程式的,裡面描述的是指令執行的過程,shell 通常很短,可以很快寫出來,但是很快又會被抛棄,它常常依賴于特定作業系統環境。

puppet 語言是結果式的,使用者将自己想要達到的目的通過puppet文法描述給puppet,puppet去完成它,使用者不需要關心過程,整個過程完全被抽象化了。譬如安裝一個軟體包,隻需要ensure => present ,不需要關心作業系統是debian還是redhat 。

個人總結看來,puppet語言形式上的特點就是“花括号分類,冒号聲明,逗号結束”。

接下來講puppet的文法,主要是舉例(持續完善中,,,)

1、軟體包管理

安裝

1

<code>package {</code><code>"vim"</code><code>: ensure =&gt; 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 =&gt; present,</code>

<code>}</code>

解除安裝

<code>package {</code><code>"vim"</code><code>: ensure =&gt; absent, }</code>

2、權限管理

5

<code>file</code> <code>{ </code><code>"/etc/sudoers"</code><code>:</code>

<code>    </code><code>owner =&gt; root,</code>

<code>    </code><code>group =&gt; root,</code>

<code>    </code><code>mode =&gt; 400,</code>

權限遞歸

<code>file</code> <code>{ </code><code>'/some/dir'</code><code>:</code>

<code>      </code><code>mode =&gt; 644,</code>

<code>      </code><code>recurse =&gt; </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 =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>harestart =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>ensure =&gt; running,</code>

<code>    </code><code>enable</code> <code>=&gt; </code><code>true</code><code>,</code>

4、檔案管理

檔案托管

<code>file</code> <code>{</code><code>"/etc/my.cnf"</code><code>:</code>

<code>    </code><code>ensure =&gt; present,</code>

<code>    </code><code>source</code> <code>=&gt; </code><code>"puppet:///modules/mysql/my.cnf"</code>

<code>    </code><code>owner =&gt; mysql,</code>

<code>    </code><code>group =&gt; 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 =&gt; link,</code>

<code>      </code><code>target =&gt; </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 =&gt; [ owner, mode ],</code>

(當檔案的權限屬性發生變化時發出消息,而不修正權限)

6、執行指令

7

8

9

<code>exec</code> <code>{ </code><code>"reload nginx"</code><code>:</code>

<code>    </code><code>command</code> <code>=&gt; </code><code>"/usr/sbin/nginx reload"</code><code>,</code>

<code>    </code><code>require =&gt; Package[</code><code>"nginx"</code><code>],</code>

<code>    </code><code>refreshonly =&gt; </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>=&gt; </code><code>"puppet:///modules/nginx/nginx.conf"</code><code>,</code>

<code>    </code><code>notify =&gt; Exec[</code><code>"reload nginx"</code><code>],</code>

(notify表示配置檔案發生更改,就觸發nginx平滑重新開機)

7、定時任務crontab

<code>cron</code> <code>{ ntpdate:</code>

<code>    </code><code>command</code> <code>=&gt; </code><code>"/usr/sbin/ntpdate 192.168.1.3"</code><code>,</code>

<code>    </code><code>user =&gt; root,</code>

<code>    </code><code>hour =&gt; </code><code>'*/4'</code><code>,</code>

<code>    </code><code>minute =&gt; </code><code>'1'</code><code>,</code>

<code>    </code><code>ensure =&gt; present,</code>

(這樣會導緻流量瞬間擁擠,puppet很周到,提供一個僞随機的辦法)

<code>    </code><code>minute =&gt; fqdn_rand( 60 ),</code>

(盡管是每四個小時運作一次,但是不同的機器還是會在不同的時刻去執行指令【分鐘數為0-60随機】,将流量分散開來。)

8、删除

<code>tidy {  clean_temp:</code>

<code>    </code><code>path =&gt; </code><code>"/tmp/temp"</code><code>,</code>

<code>    </code><code>type</code> <code>=&gt; </code><code>"ctime"</code><code>,</code>

<code>    </code><code>recurse =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>rmdirs =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>age =&gt; </code><code>"1d"</code><code>,</code>

<code>    </code><code>backup =&gt; </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>=&gt; </code><code>"puppet:///files/sshd_config"</code><code>,</code>

<code>    </code><code>notify =&gt; Service [</code><code>"sshd"</code><code>],</code>

<code>    </code><code>hasstatus =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>hasrestart =&gt; </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   =&gt; present,</code>

<code>    </code><code>name     =&gt; </code><code>"root"</code><code>,</code>

<code>    </code><code>password =&gt; </code><code>"SomeAlreadyEncryptedPassword"</code><code>;</code>

<code>user {</code><code>"admin"</code><code>:</code>

<code>    </code><code>name =&gt;</code><code>"admin"</code><code>,</code>

<code>    </code><code>shell =&gt; </code><code>"/bin/bash"</code><code>,</code>

<code>    </code><code>home =&gt; </code><code>"/home/admin"</code><code>,</code>

<code>    </code><code>groups</code> <code>=&gt; </code><code>"admin,wheel"</code><code>,</code>

<code>    </code><code>uid =&gt; 500,</code>

<code>    </code><code>gid =&gt; 500,</code>

<code>    </code><code>password =&gt; </code><code>'$1$Nnh0M0$t9s7Bbwx2fFer6IP/QGdA0'</code><code>,</code>

<code>    </code><code>require =&gt; Group[</code><code>"admin"</code><code>],</code>

<code>group {</code><code>"admin"</code><code>:</code>

<code>    </code><code>ensure =&gt;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,如需轉載請自行聯系原作者