if case selector
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 之 流程控制介绍
if case selector
原文:http://blog.51cto.com/ghbsunny/2044322
来源: http://www.bubuko.com/infodetail-2407525.html