目前puppet2.7以上版本都支援if...elif ...else...、selecter和case語句.它們的條件判斷分為兩類:一類為條件執行(if...elif ...else...、selecter)通過邏輯判斷來選擇要執行的特定代碼或加載代碼;另一類(case)是循環執行類,依照代碼規則來執行代碼或加載代碼.
if條件判斷語句:
示例一:
if判斷系統發行版本安裝apache軟體包:
1
2
3
4
5
6
7
8
9
10
11
<code>[root@sh-web1 ~]</code><code># cat apache.pp </code>
<code>if</code> <code>$operatingsystem == </code><code>'CentOS'</code> <code>{</code>
<code> </code><code>$packages = </code><code>'httpd'</code>
<code>} elsif $operatingsystem == </code><code>'Redhat'</code> <code>{</code>
<code>} </code><code>else</code> <code>{</code>
<code> </code><code>$packages = </code><code>'apache2'</code>
<code>}</code>
<code> </code><code>package {</code><code>"$packages"</code><code>:</code>
<code> </code><code>ensure=> </code><code>"present"</code><code>,</code>
本地應用puppet代碼:
<code>[root@sh-web1 ~]</code><code># puppet apply apache.pp </code>
<code>Notice: Compiled catalog </code><code>for</code> <code>sh-web1.localdomain </code><code>in</code> <code>environment production </code><code>in</code> <code>0.04 seconds</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Main/Package</code><code>[httpd]</code><code>/ensure</code><code>: created</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>1.78 seconds</code>
注意:"=="是等于的意思,完完全全比對到對應的.
示例二:
if比對hostname主機載入相應的puppet子產品.(if在node.pp檔案中比對主機很少用,幾乎都是用case.)
12
<code>node base {</code>
<code> </code><code>include admin</code>
<code>node </code><code>/sh-</code><code>(proxy|web)\d+/ inherits base {</code>
<code> </code><code>if</code> <code>$</code><code>hostname</code> <code>=~ </code><code>/sh-proxy</code><code>\d+/ {</code>
<code> </code><code>include apache</code>
<code> </code><code>} elsif $</code><code>hostname</code> <code>=~ </code><code>/sh-web</code><code>\d+/ {</code>
<code> </code><code>include php</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>include nginx::nginxconf</code>
<code> </code><code>}</code>
agent端更新puppet代碼.
<code>[root@sh-proxy2 ~]</code><code># puppet agent -t</code>
<code>Info: Retrieving pluginfacts</code>
<code>Info: Retrieving plugin</code>
<code>Info: Loading facts</code>
<code>Info: Caching catalog </code><code>for</code> <code>sh-proxy2.localdomain</code>
<code>Info: Applying configuration version </code><code>'1506450177'</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Admin/Exec</code><code>[selinux]</code><code>/returns</code><code>: executed successfully</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Install/Package</code><code>[httpd]</code><code>/ensure</code><code>: created</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Service/Service</code><code>[httpd]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>Info: </code><code>/Service</code><code>[httpd]: Unscheduling refresh on Service[httpd]</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>20.24 seconds</code>
<code>[root@sh-web1 ~]</code><code># puppet agent -t</code>
<code>Notice: Ignoring --listen on onetime run</code>
<code>Info: Caching catalog </code><code>for</code> <code>sh-web1.localdomain</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Php/Package</code><code>[php]</code><code>/ensure</code><code>: created</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Php/Package</code><code>[php-devel]</code><code>/ensure</code><code>: created</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>4.01 seconds</code>
注意:"=~"是比對的意思,隻要比對到就行.
case語句應用:
示例:(之前文章一直都在用的比對方法case)
13
14
<code>include admin</code>
<code> </code><code>case</code> <code>$::</code><code>hostname</code> <code>{</code>
<code> </code><code>/sh-proxy</code><code>\d+/: {</code>
<code> </code><code>include apache</code>
<code> </code><code>}</code>
<code> </code><code>"sh-web1"</code><code>: {</code>
<code> </code><code>include nginx::nginxconf</code>
<code> </code><code>include php</code>
<code> </code><code>} </code>
agent端更新就不示範了,上面的case語句部落格開始就是這樣寫的.
本文轉自青衫解衣 51CTO部落格,原文連結:http://blog.51cto.com/215687833/1969088