设为首页 收藏本站
查看: 1047|回复: 0

[经验分享] Puppet 之 流程控制介绍

[复制链接]

尚未签到

发表于 2017-11-27 16:20:55 | 显示全部楼层 |阅读模式
                                                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单分支
1
2
3
4
5
if  CONDITION {
...
statement
....
}



2.2  if双分支
1
2
3
4
5
6
7
8
9
if  CONDITION {
...
statement
...
} else {
...
statement
...
}



其中,CONDITION的给定方式:
(1) 变量
(2) 比较表达式
(3) 有返回值的函数
例子
安装apache服务包,判断系统的版本,其中osfamily这个变量是在factor里获得
1
2
3
4
5
6
7
8
9
vim installpkg.pp
if $osfamily == 'RedHat' {
    $apachename = 'httpd'
} else {
    $apachename = 'httpd'
}
package {"$apachename":
    ensure => latest,
}



2.3  if多分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if  CONDITION {
...
statement
...
} elsif {
...
statement
....
}
else {
...
statement
...
}



例子
1
2
3
4
5
6
7
8
9
10
11
vim installpkg.pp
if $osfamily == 'RedHat' {
    $apachename = 'httpd'
} elsif $osfamily == 'Windows' {
    $apachename = 'apache'
} else {
    $apachename = 'httpd'
}
package {"$apachename":
    ensure => latest,
}



综合例子:正则表达式匹配
以下例子表示osfamily变量是否匹配debian
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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语句


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

1
2
3
4
5
6
7
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返回不同的通知
1
2
3
4
5
6
7
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服务,复制配置文件并启动服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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每一个分支是完整的代码

1
2
3
4
5
6
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的对比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
1
2
3
4
5
6
7
8
$pkgname = $operatingsystem ? {
/(?i-mx:(ubuntu|debian))/       => 'apache2',
/(?i-mx:(redhat|fedora|centos))/        => 'httpd',
default => 'httpd',
}
package{"$pkgname":
ensure  => installed,
}



  示例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$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单分支语句取反

语法

1
2
3
4
5
unless  CONDITION {
....
statement
....
}



等价于如下的语句

1
2
3
4
5
if ! CONDITION {
...
statement
....
}







                                       


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-419651-1-1.html 上篇帖子: Puppet--自动化运维工具基本功能介绍 下篇帖子: Puppet 之 八大资源介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表