Puppet 之 流程控制介绍

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
....
}


Puppet 之 流程控制介绍

时间: 2024-07-31 22:17:28

Puppet 之 流程控制介绍的相关文章

shell的流程控制介绍

Lnux shell和Java.PHP等语言不一样,它有一套自己的流程控制语句,其中包括条件语句(if,case),循环语句(for,while,until),循环控制语句(continue,break,shift).下面我会通过一些简单明了的例子来介绍下各个语句的使用方法. 一.条件语句     1.if语句 (1)单分支结构 if 判断条件; then 条件为真的分支代码 fi 示例:testif1.sh     #!/bin/bash     a=5     if [[ a -gt 4 ]

第三章 流程控制

23.流程控制介绍 24.流程控制----if语句基本使用 //如果条件表达式为真,执行语句块1,否者不执行. /*if(条件表达式) { 语句块1 } 后续语句:*/ var age=18 if(age>10) { alert(age) } //如果条件表达式为真,执行语句块1,否者执行语句块2. /*if(条件表达式) { 语句块1 }else{ 语句块2 }*/ var age=20; if(age>18){ alert('可以上网') }else{ alert('不准上网') } //

Golang-程序流程控制 if、switch

程序流程控制介绍 在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句. 1)顺序控制 2)分支控制 3)循环控制 顺序控制 程序从上到下逐行地执行,中间没有任何判断和跳转. 一个案例说明,必须下面的代码中,没有判断,也没有跳转.因此程序按照默认的流程执行,即顺序控制. 顺序控制的一个流程图        顺序控制举例和注意事项 Golang 中定义变量时采用合法的前向引用.如: func main() { var num1 int = 10 //声明了 n

python基础1 介绍、数据类型、流程控制

一.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜,Python赶超PHP占据第4,成为除c\c++\java之外的全球第4大最流行的编程语言! Python是什么样的语言? 按照编译型.解释型列举出最常用的几种语言的分类 编译型.解释型各自优缺点: 编译型 优点:编译器一般会有预编译的过程对代码进行优化.因

【Xcode学C-3】if等流程控制、函数的介绍说明标记分组、#include以及LLVM

一.流程控制:if.while和for循环 (1)if括号中面常常遇到推断是否相等的情况,并且新手常常会把==写成=.所以建议的习惯是把常量放在前面.如a==10.写成10==a,这样就不易犯错. (2)利用for进行递归,但不建议递归太深. (3)详细而言,for循环使用最广泛.for嵌套也非常重要. 二.函数介绍 (1)函数的基本格式 (2)函数的声明和定义的差别,声明一般写在前面.定义写在后面.声明能够同名反复. (3)函数的说明标记分组可用pragma #pragma mark - 这种

NodeJS异步流程控制简单介绍

转自:http://www.jianshu.com/p/cc90f44bdf89 有这样一个需求,用户注册的时候,判断用户名和邮箱是否已经被占用. 用户注册 传统的实现思路 根据用户名查找记录,如果存在记录,证明用户名已被占用 根据邮箱查找记录,如果存在记录,证明又想已被占用 但是在nodejs中,大家都知道,各种的回调.简单的查询数据库都是异步的.你可能会这么写: User.findOne({username: user.username}, function (err, doc) { if(

Python的简单介绍/解释器/变量/变量的数据类型/用户交互及流程控制(if)

一.Python的简单介绍 1.python是一门 解释型弱类型编程语言. 2.特点: 简单.明确.优雅 二.python的解释器有哪些 CPython -- 官方提供的.,内部使用c语言来实现 IPython -- IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的.好多很多国产浏览器虽然外观不同,但内核其实都是调用了IE PyPy -- PyPy是另一个Python解释器,它的

Visual Basic快捷教程——流程控制

美籍匈牙利数学家冯·诺依曼于1946年提出"程序存储,顺序执行"的观念,为现代计算机奠定了重要基础.这一观点认为:应该把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存.电子计算机的数制宜采用二进制:计算机应该按照程序顺序执行.所以现在开发人员在编写的程序代码时,其实都隐含地认为计算机将来会一行一行按顺序来执行这些指令.但是在顺序执行的过程中,有时我们希望计算机根据条件判断来选择性地执行(或者不执行)一些代码--这时就需要用到选择结构(或称分支结构).另外一些时候,我们希

PHP100-第四讲 PHP5.4 运算符、流程控制

PHP中有丰富的运算符集,它们中大部分直接来自于C语言.按照不同功能区分,运算符可以分为:算术运算符.字符串运算符.赋值运算符.位运算符.条件运算符,以及逻辑运算符等.当各种运算符同在一个表达式中时,它们的运算是有一定的优先级的,下面将详细介绍.PPT下载请点击 PHP5.4 的流程控制语句if / switch-- PHP100-第四讲 PHP5.4 运算符.流程控制,布布扣,bubuko.com