puppet之流程控制介绍

author author     2022-10-02     135

关键词:

1  概述


puppet流程控制语句有四种,if,case,selector,unless(3.7版本后引入),由于unless是if单分支语句取反,因此,本文重点介绍if,case,selector三种语法的使用

备注:本文的相关内容摘自文章:https://www.dwhd.org/20150609_155030.html


2  if语句


if语句有三种分支的表示

2.1  if单分支

if  CONDITION {
...
statement
....
}

2.2  if双分支

if  CONDITION {
...
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.3  if多分支

if  CONDITION {
...
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 => [File['httpd.conf'],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'],
}

3  case语句


每一个分支都是一个完整的代码段

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返回不同的通知

vim  case.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 => [File['httpd.conf'],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'],
}


4  selector语句


和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'],
}


5  unless语句


unless语句等价于和if单分支语句取反

语法

unless  CONDITION {
....
statement
....
}

等价于如下的语句

if ! CONDITION {
...
statement
....
}



javascript基础之流程控制语句

第三部分:流程控制语句JavaScript代码是书写位置:JavaScript代码应该写在<scripttype=”text/javascript”></script>这一对标记中。或者作为外部引用<scriptsrc="JavaScript代码路径"></script>JavaScript的每一句代码请用分号作为... 查看详情

存储过程之流程控制语句

阅读目录:通过条件、循环语句,对处理程序进行流程控制条件控制    IF条件:条件为真,执行    CASE条件:匹配到,执行循环控制    WHILE循环:先判断后执行    REPEAT循环:先执行后判断    LOOP循环... 查看详情

mysql之流程控制语句

参考技术AMYSQL的流程控制语句也只能用于存储过程,主要有3类:跳转语句ITERATE:只能用在循环语句内,表示重新开始循环。LEAVE:可以用在循环语句内,或者以BEGIN和END包裹起来的程序体内,表示跳出循环或跳出程序体的操作。... 查看详情

python之流程控制(代码片段)

Python之流程控制if语句条件判断语句ifa==b:pass#满足条件再执行ifa==b:passelse:pass#满足条件执行第一种语句,不满足条件则执行第二种语句ifa==b:#条件1pass#语句1elifa>b:#条件2pass#语句2else:pass#语句3如果满足条件1,则执行语句1,语句2... 查看详情

java基础之流程控制

一、顺序结构    顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。  if-else-if语句语法:  if(条件){        当条件为true时,执行大括号内... 查看详情

java篇之流程控制语句

条件判断语句 条件语句:If(boolean类型)else   (打大括号避免出错)  switch(export)语句:export的类型必须是byte,short,char,int,Stringenum;Switch(export){Case(n):语句;Break;(不输入它的话会顺序执行下一分支,遇到才会跳... 查看详情

阿花宝宝java基础笔记之流程控制

1.语法:if(条件1){          //代码1       }elseif(条件2){          //代码块2& 查看详情

go语言基础之流程控制(代码片段)

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制... 查看详情

java程序猿之流程控制与数组

  分支语句  if括号里的只能是一个逻辑表达式,即这个表达式返回的值只能是true或false。  代码块用花括号括起来,一个代码块通常被当成一个整体来执行(除非遇到return、break、continue等关键字,或者遇到异常)。  ... 查看详情

2_基本语法之流程控制之循环结构

1.循环结构的四要素  ①初始化条件  ②循环条件--->是boolean类型  ③循环体  ④迭代条件  说明:通常情况下,循环结束都是因为②中循环条件返回false了。2.三种循环结构:  2.1for循环结构  for(①;②;④)  ... 查看详情

java学习之流程控制语句(选择结构)

 流程控制语句1选择结构ifif语句有三种语法格式,每一种格式都有它自身的特点。1.1if语句if语句是指如果满足某种条件,就进行某种处理。在Java中,if语句的具体语法格式如下:if(条件语句){   执行语句;  ... 查看详情

阿花宝宝java基础笔记之流程控制

1.各循环可互相嵌套   一般不超过三层   外层循环变量变化一次,内层循环变量要变化一遍  注意点:循环次数。(内层循环次数*外层循环次数)2.break语句的使用 break语句用于终止某个循环,使... 查看详情

go语言学习——go语言基础之流程控制二

使用switch语句方便对大量的值进行条件判断packagemainimport"fmt"//流程控制之跳出for循环funcmain()//当i=5时就跳出for循环fori:=0;i<10;i++ifi==5break//跳出for循环 查看详情

基本语法之流程控制之关键字:break和continue

break和continue关键字的使用   使用范围 循环中使用的作用(不同点) 相同点  break: switch-case   循环结构中 结束当前循环 关键字后面不能声明执行语句 continue: 循环结构中 结束当次循环 关键字后面不能声明... 查看详情

1.golang开发之流程控制(代码片段)

Golang开发之流程控制1.条件判断(if)Go语言if条件判断格式如下:if表达式1分支1elseif表达式2分支2else分支3Go规定与if匹配的左括号“”必须与if和表达式放在同一行,如果尝试将“”放在其它位置,将会触发编译错误,... 查看详情

django之流程

关键点路由视图模板orm中间件 查看详情

go语音基础之流程控制if语句

Go语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。顺序结构:程序按顺序执行,不发生跳转。 选择结构:依据是否满足条件,有选择的执行相应功能。循环结构:依据条件是否满足,循环多次执行某... 查看详情

3.go语言基础之流程控制(代码片段)

1.ifelse(分支结构)1.1if判断基本语法if条件判断的格式如下:if表达式1分支1elseif表达式2分支2else分支3Go语言规定与if匹配的左括号必须与if和表达式放在同一行,放在其他位置会触发编译错误。同理,与else匹配的也必须与else写在同... 查看详情