《Puppet实战手册》——2.10 使用选择器和case语句

简介: Puppet会比较$::operatingsystem和每个所提供的可能的值:Ubuntu、Debian等。这些值可以是正则表达式(例如,部分字符串匹配或通配符匹配),但在此例中,只使用文字字符串(或全字符匹配)。

本节书摘来自异步社区《Puppet实战手册》一书中的第2章,第2.10节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.10 使用选择器和case语句

虽然可以用if来编写任何条件语句,但Puppet还是提供提供了一些其他的形式来帮助用户更容易地编写表达条件语句:选择器(selecteor)和case语句。

操作步骤
下面是一些关于选择器和case语句的例子。

1. 把下面的代码加入到配置清单中:

$systemtype = $::operatingsystem ? {
 'Ubuntu' => 'debianlike',
 'Debian' => 'debianlike',
 'RedHat' => 'redhatlike',
 'Fedora' => 'redhatlike',
 'CentOS' => 'redhatlike',
 default => 'unknown',
}

notify { "You have a ${systemtype} system": }

2. 把下面的代码加入到清单文件中:

class debianlike {
 notify { 'Special manifest for Debian-like systems': }
}

class redhatlike {
 notify { 'Special manifest for RedHat-like systems': }
}

case $::operatingsystem {
 'Ubuntu',
 'Debian': {
  include debianlike
 }

 'RedHat',
 'Fedora',
 'CentOS': {
  include redhatlike
 }
 default: {
  notify { "I don't know what kind of system you have!": }
 }
}

工作原理
示例演示了选择器和case语句,接下来分别详细地了解一下它们如何完成这个工作。

选择器
在第一个例子中,使用了一个选择器(?操作符),根据$:: operatingsystem的值为$systemtype变量选择不同的值。这类似于C或Ruby中的三元运算符,但不是仅在两个可能的值之间进行选择,而是可以根据需要有尽可能多的可选值。

Puppet会比较$::operatingsystem和每个所提供的可能的值:Ubuntu、Debian等。这些值可以是正则表达式(例如,部分字符串匹配或通配符匹配),但在此例中,只使用文字字符串(或全字符匹配)。一旦找到了一个匹配的值,选择表达式就会返回任何与匹配的字符串相关联的值。例如,如果$::operatingsystem的值是Fedora,选择器表达式将返回字符串redhatlike并把其分配给变量$systemtype。

case语句
与选择器不同,case语句不返回一个值。case语句非常适合根据某个表达式的值选择执行不同的代码。在第二个例子中,使用case语句时,根据$operatingsystem的值,引入了debianlike类或redhatlike类。

此外,Puppet将$::operatingsystem的值与可能的匹配列表进行比较。这些可以是正则表达式,也可以是字符串,或如例子中一样的用逗号分隔的字符串列表。当它找到某一个匹配的选项时,则执行其对应的大括号之间的相关代码。

因此,如果$::operatingsystem的值是Ubuntu,那么代码include debianlike将被执行。

更多参考
一旦读者掌握了选择器和case语句的基本用法,就可以参考下面列出的有用的技巧。

正则表达式
类似于if语句,用户可以在选择器和case语句中使用正则表达式,还可以捕获匹配组的值,并使用$1、$2等引用它们。

case $::lsbdistdescription {
 /Ubuntu (.+)/: {
  notify { "You have Ubuntu version ${1}": }
 }
 /CentOS (.+)/: {
  notify { "You have CentOS version ${1}": }
 }
 default: {}
}

默认值
选择器和case语句都可以指定一个默认值,在没有其他的选项相匹配的情况下会自动选择默认值。

$lunch = 'Burger and fries'
$lunchtype = $lunch ? {
 /fries/ => 'unhealthy',
 /salad/ => 'healthy',
 default => 'unknown',
}

notify { "Your lunch was ${lunchtype}": }

Your lunch was unhealthy
相关文章
|
开发工具 git
《Puppet实战手册》——导读
IT运维领域正在进行一场革命。新一代的配置管理工具可以在几秒内完成大量服务器的构建(配置)和整个网络自动化。为了充分利用云计算的强大功能,并且建立可靠、可扩展、安全、高性能的系统,拥有Puppet这样的工具是必不可少的。
2207 0
|
Ruby
《Puppet实战手册》——2.12 使用正则表达式进行替换
Puppet通过regsubst函数提供了一种简单的方式来处理文本,在字符串中进行搜索和替换,或者从字符串中提取所需模式(子串)。人们经常需要用它来处理来自fact或来自外部程序的数据。
2066 0
|
Linux Spring Java
《Puppet实战手册》——2.11 使用in运算符
本节书摘来自异步社区《Puppet实战手册》一书中的第2章,第2.11节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1546 0
|
存储
《Puppet实战手册》——2.9 在if语句中使用正则表达式
正则表达式非常强大,但是很难理解和调试。如果感觉正在用的正则表达式太复杂,不能一眼看明白它在做什么,最好简化设计,使其更加简单化。但是,正则表达式捕获模式是个非常有用的功能。
2286 0
|
Ubuntu 数据中心 网络协议
《Puppet实战手册》——2.8 编写功能强大的条件语句
此外,也可以通过在清单内设置变量来调整引入的类的行为。例如,在数据中心A的服务器可能需要使用与在数据中心B不同的DNS服务器,或者可能需要为Ubuntu系统使用一组类,而其他系统使用另一组不同的类。
1732 0
|
存储
《Puppet实战手册》——2.7 数组中多个元素的遍历
当Puppet遇到数组作为一个资源的名称时,它会为数组中每个元素的创建一个资源。在这个例子中,$packages数组中的每一个软件包都会被Puppet创建一个新的package资源,并且使用相同的参数(ensure => installed)。这是一种简化相似资源书写的方式。
2015 0
|
Ruby 调度
《Puppet实战手册》——2.6 使用内联模板
任何传递给inline_template函数的字符串的内容都会被当作ERB模板来执行。也就是说,任何在<%=和%>分隔符之间的内容都将作为Ruby代码而执行,而其余的部分将被视为字符串。
1669 0
|
网络安全 Apache Ruby
《Puppet实战手册》——2.5 使用标准的命名约定
本节书摘来自异步社区《Puppet实战手册》一书中的第2章,第2.5节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1527 0
|
Apache 缓存
《Puppet实战手册》——2.4 使用模块
模块是将相关的事物进行组合的一种简单方式。例如,一个webserver模块应该包括让一台机器作为Web服务器所必需的一切:Apache的配置文件、虚拟主机模板和一些必要的用来部署它们(Apache的配置文件、虚拟主机模板)的Puppet代码。
1629 0
|
JavaScript 前端开发
《Puppet实战手册》——2.3 使用puppet-lint检查配置清单
使用一些风格约定是很有必要的,特别是代码编写工作存在协同的情况下。除非彼此能够在空格、跳格(Tab)、引用、对齐等方面达成一致的标准,否则,代码将会被认为非常丑陋并且难以阅读和维护。
2039 0