- Puppet 3 Cookbook
- John Arundel
- 578字
- 2021-04-09 23:52:28
Using selectors and case statements
Although you could write any conditional statement using if
, Puppet provides a couple of extra forms to help you express conditionals more easily: the selector and the case
statement.
How to do it…
Here are some examples of selector and case
statements:
- Add the following code to your manifest:
$systemtype = $::operatingsystem ? { 'Ubuntu' => 'debianlike', 'Debian' => 'debianlike', 'RedHat' => 'redhatlike', 'Fedora' => 'redhatlike', 'CentOS' => 'redhatlike', default => 'unknown', } notify { "You have a ${systemtype} system": }
- Add the following code to your manifest:
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!": } } }
How it works…
Our example demonstrates both the selector and the case
statement, so let's see in detail how each of them works.
In the first example, we used a selector (the ?
operator) to choose a value for the $systemtype
variable depending on the value of $::operatingsystem
. This is similar to the ternary operator in C or Ruby, but instead of choosing between two possible values, you can have as many values as you like.
Puppet will compare the value of $::operatingsystem
to each of the possible values we have supplied: Ubuntu
, Debian
, and so on. These values could be regular expressions (for example, for a partial string match, or to use wildcards), but in our case we have just used literal strings. As soon as it finds a match, the selector expression returns whatever value is associated with the matching string. If the value of $::operatingsystem
is Fedora
, for example, the selector expression will return the string redhatlike
and this will be assigned to the variable $systemtype
.
Unlike selectors, the case
statement does not return a value. case
statements are handy where you want to execute different code depending on the value of some expression. In our second example, we used the case
statement to include either the class debianlike
or the class redhatlike
, depending on the value of $::operatingsystem
.
Again, Puppet compares the value of $::operatingsystem
to a list of potential matches. These could be regular expressions or strings, or as in our example, comma-separated lists of strings. When it finds a match, the associated code between curly braces is executed. So, if the value of $::operatingsystem
is Ubuntu
, then the code include debianlike
will be executed.
There's more…
Once you've got the grip with the basic use of selectors and case
statements, you may find the following tips useful:
As with if
statements, you can use regular expressions with selectors and case
statements, and you can also capture the values of the matched groups and refer to them using $1
, $2
, and so on:
case $::lsbdistdescription { /Ubuntu (.+)/: { notify { "You have Ubuntu version ${1}": } } /CentOS (.+)/: { notify { "You have CentOS version ${1}": } } default: {} }
Both selectors and case
statements let you specify a default
value, which is chosen if none of the other options match:
$lunch = 'Burger and fries' $lunchtype = $lunch ? { /fries/ => 'unhealthy', /salad/ => 'healthy', default => 'unknown', } notify { "Your lunch was ${lunchtype}": }
Your lunch was unhealthy
- Sphinx Search Beginner's Guide
- IBM Lotus Notes 8.5 User Guide: LITE
- SOLIDWORKS 2021中文版基礎入門一本通
- Illustrator 2024從入門到精通
- Vivado從此開始(進階篇)
- 中文版Photoshop CC平面設計實用教程
- 高等院校電腦美術教材:CorelDRAW X7中文版基礎教程
- After Effects 2022從入門到精通
- Photoshop CC完全自學教程:從入門到實踐(全新版)
- WCF Multi/tier Services Development with LINQ
- TopSolid Wood軟件設計技術與應用
- 金融精英PPT實操手冊:世界知名公司這樣展示研究報告
- Quality Assurance for Dynamics AX-Based ERP Solutions
- Funambol Mobile Open Source
- 新手學UG NX 8.0輔助設計