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

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
时间: 2024-10-25 19:14:24

《Puppet实战手册》——2.10 使用选择器和case语句的相关文章

《Puppet实战手册》——2.9 在if语句中使用正则表达式

2.9 在if语句中使用正则表达式 正则表达式是可以在if语句和其他条件语句中进行测试的另一种表达式.正则表达式是使用模式匹配来比较字符串的一种强大的方式. 操作步骤下面是在条件语句中使用正则表达式的一个例子. 将下面的代码添加到清单文件中: if $::lsbdistdescription =~ /LTS/ { notify { 'Looks like you are using a Long Term Support version of Ubuntu.': } } else { notif

《Puppet实战手册》——导读

** 前言 **IT运维领域正在进行一场革命.新一代的配置管理工具可以在几秒内完成大量服务器的构建(配置)和整个网络自动化.为了充分利用云计算的强大功能,并且建立可靠.可扩展.安全.高性能的系统,拥有Puppet这样的工具是必不可少的.本书不仅讲解了Puppet的基础知识,而且深入探讨了Puppet的所有强大功能,详细展示了如何解决现实中的各种问题和应用场景.每一步操作都完整地展示了需要录入的命令,并且每一个技巧都有完整的代码示例. 本书带领读者从Puppet的基本知识开始,完整.专业地讲解Pu

《Puppet实战手册》——第2章 Puppet语言和风格 2.1简介

第2章 Puppet语言和风格 计算机语言设计就像是在公园里散步,而且是侏罗纪公园. -Larry Wall① 本章内容包括: 使用社区推荐的Puppet风格使用puppet-lint检查配置清单使用模块使用标准的命名约定/规范使用内联模板数组中多个元素的遍历编写功能强大的条件语句在if语句中使用正则表达式使用选择器和case语句使用in运算符使用正则表达式进行替换 2.1 简介 本章中讲解如何编写优雅的Puppet配置清单(Puppet用于配置服务器的程序代码被称为配置清单,以后均使用配置清单

《Puppet实战手册》——2.4 使用模块

2.4 使用模块 能够使Puppet配置清单清晰并且易于维护的最重要的方式之一就是将它们组织成模块. 模块是将相关的事物进行组合的一种简单方式.例如,一个webserver模块应该包括让一台机器作为Web服务器所必需的一切:Apache的配置文件.虚拟主机模板和一些必要的用来部署它们(Apache的配置文件.虚拟主机模板)的Puppet代码. 把代码拆分成不同的模块可以使它们更易于复用和共享,这也是组织配置清单的最合理的方式.下例将创建一个模块来管理memcached(一款在Web应用程序中非常

《Puppet实战手册》——1.7 使用cron运行Puppet

1.7 使用cron运行Puppet 通过已有的配置,已经可以做很多事情,包括在团队中管理Puppet清单,通过GitHub同步变更,使用papply脚本在机器上手动应用配置变更. 然而,截至目前还是需要手动登录到每台机器上更新Git仓库并重新运行Puppet.如果每台机器可以自动更新并应用变更,就更方便了.这样,只需要将修改推送至仓库,所有机器就会在一定时间范围内自动完成配置的变更. 做到这一点最简单的方法就是使用cron作业,定期从仓库更新配置文件并在有变更时运行Puppet. 准备工作 首

《Puppet实战手册》——2.5 使用标准的命名约定

2.5 使用标准的命名约定 为模块和类选择合适的和翔实的名称将为维护代码提供很大的帮助.如果其他人需要阅读和使用你的配置清单,更是如此. 操作步骤下面是关于如何在配置清单中进行命名的一些技巧. 1. 以所管理的软件或服务为模块命名,如apache或haproxy. 2. 以提供的功能或服务为模块中的类命名,如apache::vhosts或rails::dependencies. 3. 如果模块中的一个类是为了禁用该模块提供的服务,可将其命名为disabled.例如,一个禁用Apache的类应该名

《Puppet实战手册》——2.12 使用正则表达式进行替换

2.12 使用正则表达式进行替换 Puppet通过regsubst函数提供了一种简单的方式来处理文本,在字符串中进行搜索和替换,或者从字符串中提取所需模式(子串).人们经常需要用它来处理来自fact或来自外部程序的数据. 在这个例子中,读者将看到如何使用regsubst提取IPv4地址的前三位(网络部分,假设它是一个C类地址). 操作步骤按照下面的步骤来完成示例. 1. 在配置清单中添加下面的代码: $class_c = regsubst($::ipaddress, '(.*)\..*', '\

《Puppet实战手册》——2.8 编写功能强大的条件语句

2.8 编写功能强大的条件语句 Puppet的if语句允许用户基于变量或表达式的值来调整清单.有了它,用户可以根据相关节点的某些fact(如操作系统或内存大小)应用(生效)不同的资源或参数值. 此外,也可以通过在清单内设置变量来调整引入的类的行为.例如,在数据中心A的服务器可能需要使用与在数据中心B不同的DNS服务器,或者可能需要为Ubuntu系统使用一组类,而其他系统使用另一组不同的类. 操作步骤下面是一个非常有用的关于条件语句的例子. 在清单中添加下面的代码: if $::operating

《Puppet实战手册》——1.8 利用Rake部署变更

1.8 利用Rake部署变更 Rake是一个基于Ruby语言编写的实用工具,它可以帮助自动化完成Puppet的工作流程.虽然有很多其他方法支持在远程服务器上运行命令,但是Rake碰巧是本书使用的方法,它很容易扩展,可以非常方便地使用它做任何事. 此处要让Rake为做的第一件事情是:登录到远程服务器上,运行pull-updates脚本,将新修改的Puppet配置清单应用到该服务器上.做起来非常简单,下面来看看它是如何实现的. 准备工作 你可能已经安装了Rake(尝试运行rake命令进行检查),如果