prollerweg 发表于 2018-8-1 12:30:06

Puppet 之 流程控制介绍

  1概述
  puppet流程控制语句有四种,if,case,selector,unless(3.7版本后引入),由于unless是if单分支语句取反,因此,本文重点介绍if,case,selector三种语法的使用
  备注:本文的相关内容摘自文章:https://www.dwhd.org/20150609_155030.html
  
  2if语句
  if语句有三种分支的表示
  2.1if单分支
ifCONDITION {  
...
  
statement
  
....
  
}
  2.2if双分支
ifCONDITION {  
...
  
statement
  
...
  
} else {
  
...
  
statement
  
...
  
}
  其中,CONDITION的给定方式:
  (1) 变量
  (2) 比较表达式
  (3) 有返回值的函数
  例子
  安装apache服务包,判断系统的版本,其中osfamily这个变量是在factor里获得
vim installpkg.pp  
if $osfamily == 'RedHat' {
  
    $apachename = 'httpd'
  
} else {
  
    $apachename = 'httpd'
  
}
  
package {"$apachename":
  
    ensure => latest,
  
}
  2.3if多分支
ifCONDITION {  
...
  
statement
  
...
  
} elsif {
  
...
  
statement
  
....
  
}
  
else {
  
...
  
statement
  
...
  
}
  例子
vim installpkg.pp  
if $osfamily == 'RedHat' {
  
    $apachename = 'httpd'
  
} elsif $osfamily == 'Windows' {
  
    $apachename = 'apache'
  
} else {
  
    $apachename = 'httpd'
  
}
  
package {"$apachename":
  
    ensure => latest,
  
}
  综合例子:正则表达式匹配
  以下例子表示osfamily变量是否匹配debian
vim regex.pp  
if $osfamily =~ /(?i-mx:debian)/ {
  
    $webserver = 'apache2'
  
} else {
  
    $webserver = 'httpd'
  
}
  
package {"$webserver":
  
    ensure => installed,
  
    before => ,Service['httpd']],
  
}
  
file {'httpd.conf':
  
    path => '/etc/httpd/conf/httpd.conf',
  
    source => '/root/httpd.conf',
  
    ensure => file,
  
}
  
service {'httpd':
  
    ensure => running,
  
    path => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin',
  
    enable => true,
  
    restart => 'systemctl restart httpd.service',
  
    subscribe => File['httpd.conf'],
  
}
  3case语句
  每一个分支都是一个完整的代码段
case CONTROL_EXPRESSION {  
case1: { ... }
  
case2: { ... }
  
case3: { ... }
  
...
  
default: { ... }
  
}
  类似if语句,case语句会从多个代码块中选择一个分支执行,这跟 其他语言中的case语句功能一致
  case语句会接受一个控制表达式和一组case代码块,并执行打一个匹配到的控制表达式的块
  1)、控制表达式可以是puppet代码中的任何代码片段(可以是单个变量,可以是一个表达式例如算法表达式,可以是一个有返回值的函数)
  2)、各case分支可以是一个直接值、可以是个变量、可以是一个有返回单个值的函数、可以是一个正则表达式、可以是默认值default
  CONTROL_EXPRESSION:
  (1) 变量
  (2) 表达式
  (3) 有返回值的函数
  各case的给定方式:
  (1) 直接字串;
  (2) 变量
  (3) 有返回值的函数
  (4) 正则表达式模式;
  (5) default
  例子
  根据变量operatingsystem返回不同的通知
vimcase.pp  
case $operatingsystem {
  
    'Solaris':          {notice("Welcome to Solaris")}
  
    'RedHat','CentOS':{notice("Welcome to RedHat osfamily")}
  
    /^(Debian|Ubuntu)$/:{notice("Welcom to $1 linux")}
  
    default:            {notice("Welcome,alien *_*")}
  
}
  例子
  判断osfamily变量,安装web服务,复制配置文件并启动服务。
vim case.pp  
case $osfamily {
  
    "RedHat":{$webserver='httpd'}
  
    /(?i-mx:debian)/: {$webserver='apache2'}
  
    default : {$webserver='httpd'}
  
}
  
package {"$webserver":
  
    ensure => installed,
  
    before => ,Service['httpd']],
  
}
  
file {'httpd.conf':
  
    path => '/etc/httpd/conf/httpd.conf',
  
    source => '/root/httpd.conf',
  
    ensure => file,
  
}
  
service {'httpd':
  
    ensure => running,
  
    path => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin',
  
    enable => true,
  
    restart => 'systemctl restart httpd.service',
  
    subscribe => File['httpd.conf'],
  
}
  4selector语句
  和case的区别是selector的每一个分支是一个返回的值,而case每一个分支是完整的代码
CONTROL_VARIABLE ? {  
case1 => value1,
  
case2 => value2,
  
...
  
default => valueN,
  
}
  selector只能用于期望出现直接值(planin value)的地方,这包括变量赋值、资源属性、函数参数、资源标题、其他selector的值及表达式
  selector不能用于一个已经嵌套于selector的case中,也不能用于一个已经嵌套于case的case语句中
  (1)、整个selector语句会被当作一个单独的值,puppet会将控制变量按列出的次序与每个case进行比较,并在遇到一个匹配的case后,将其值作为整个语句的值进行返回,并忽略后其他的case
  (2)、控制变量与各case比较的方式与case遇见相同,但如果没有任何一个case与控制变量匹配时,puppet在编译时会将返回一个错误,因此实践中其必须提供defeat case
  (3)、selector的控制变量只能是变量或有返回值的函数,切记不能使用表达式
  (4)、其各case可以是直接值(需加引号)、 变量、能调用返回值的函数、正则表达式模式或default
  (5)、但与case语句所不同的是 selector的各case不能使用列表
  (6)、selector的各case的值可以是一个除了hash以外的直接值、变量、能调用返回值的函数或其他selector
  例子
  以下是不一样的方法,case和selector的对比
#use case  
case $osfamily {
  
    "RedHat":{$webserver='httpd'}
  
    /(?i-mx:debian)/: {$webserver='apache2'}
  
    default : {$webserver='httpd'}
  
}
  
#use selector
  
$webserver = $osfamily ?{
  
    "RedHat" => 'httpd',
  
    /(?i-mx:debian)/ => 'apache2',
  
    default => 'httpd',
  
}
  
package {"$webserver":
  
    ensure => installed,
  
}
  CONTROL_VARIABLE的给定方法:
  (1) 变量
  (2) 有返回值的函数
  各case的给定方式:
  (1) 直接字串;
  (2) 变量
  (3) 有返回值的函数
  (4) 正则表达式模式;
  (5) default
  注意:不能使用列表格式;但可以是其它的selecor;
$pkgname = $operatingsystem ? {  
/(?i-mx:(ubuntu|debian))/       => 'apache2',
  
/(?i-mx:(redhat|fedora|centos))/      => 'httpd',
  
default => 'httpd',
  
}
  
package{"$pkgname":
  
ensure=> installed,
  
}
  示例2:
$webserver = $osfamily ? {  
"Redhat" => 'httpd',
  
/(?i-mx:debian)/ => 'apache2',
  
default => 'httpd',
  
}
  
package{"$webserver":
  
ensure=> installed,
  
before=> [ File['httpd.conf'], Service['httpd'] ],
  
}
  
file{'httpd.conf':
  
path    => '/etc/httpd/conf/httpd.conf',
  
source=> '/root/manifests/httpd.conf',
  
ensure=> file,
  
}
  
service{'httpd':
  
ensure=> running,
  
enable=> true,
  
restart => 'systemctl restart httpd.service',
  
subscribe => File['httpd.conf'],
  
}
  
  5unless语句
  unless语句等价于和if单分支语句取反
  语法
unlessCONDITION {  
....
  
statement
  
....
  
}
  等价于如下的语句
if ! CONDITION {  
...
  
statement
  
....
  
}
页: [1]
查看完整版本: Puppet 之 流程控制介绍