目前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
[root@sh-web1 ~] # cat apache.pp 
if  $operatingsystem ==  'CentOS'  {
     $packages =  'httpd'
} elsif $operatingsystem ==  'Redhat'  {
     $packages =  'httpd'
else  {
     $packages =  'apache2'
}
     package { "$packages" :
     ensure=>  "present" ,
}

本地应用puppet代码:

1
2
3
4
[root@sh-web1 ~] # puppet apply apache.pp 
Notice: Compiled catalog  for  sh-web1.localdomain  in  environment production  in  0.04 seconds
Notice:  /Stage [main] /Main/Package [httpd] /ensure : created
Notice: Finished catalog run  in  1.78 seconds

注意:"=="是等于的意思,完完全全匹配到对应的.


示例二:

if匹配hostname主机载入相应的puppet模块.(if在node.pp文件中匹配主机很少用,几乎都是用case.)

1
2
3
4
5
6
7
8
9
10
11
12
node base {
     include admin
}
node  /sh- (proxy|web)\d+/  inherits base {
     if  $ hostname  =~  /sh-proxy \d+/ {
         include apache
     } elsif $ hostname  =~  /sh-web \d+/ {
         include php
     else  {
         include nginx::nginxconf
     }
}


agent端更新puppet代码.

1
2
3
4
5
6
7
8
9
10
11
[root@sh-proxy2 ~] # puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog  for  sh-proxy2.localdomain
Info: Applying configuration version  '1506450177'
Notice:  /Stage [main] /Admin/Exec [selinux] /returns : executed successfully
Notice:  /Stage [main] /Install/Package [httpd] /ensure : created
Notice:  /Stage [main] /Service/Service [httpd] /ensure : ensure changed  'stopped'  to  'running'
Info:  /Service [httpd]: Unscheduling refresh on Service[httpd]
Notice: Finished catalog run  in  20.24 seconds


agent端更新puppet代码.

1
2
3
4
5
6
7
8
9
10
11
[root@sh-web1 ~] # puppet agent -t
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog  for  sh-web1.localdomain
Info: Applying configuration version  '1506450177'
Notice:  /Stage [main] /Admin/Exec [selinux] /returns : executed successfully
Notice:  /Stage [main] /Php/Package [php] /ensure : created
Notice:  /Stage [main] /Php/Package [php-devel] /ensure : created
Notice: Finished catalog run  in  4.01 seconds

注意:"=~"是匹配的意思,只要匹配到就行.


case语句应用:

示例:(之前文章一直都在用的匹配方法case)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
node base {
include admin
}
node  /sh- (proxy|web)\d+/  inherits base {
   case  $:: hostname  {
     /sh-proxy \d+/: {
          include apache
       }
      "sh-web1" : {
             include nginx::nginxconf
             include php
         
     }
}


agent端更新就不演示了,上面的case语句博客开始就是这样写的.

本文转自青衫解衣 51CTO博客,原文链接:http://blog.51cto.com/215687833/1969088