官术网_书友最值得收藏!

Using regular expression substitutions

Puppet's regsubst function provides an easy way to manipulate text, search and replace expressions within strings, or extract patterns from strings. We often need to do this with data obtained from a fact, for example, or from external programs.

In this example, we'll see how to use regsubst to extract the first three octets of an IPv4 address (the network part, assuming it's a /24 class C address).

How to do it…

Follow these steps to build the example:

  1. Add the following code to your manifest:
    $class_c = regsubst($::ipaddress, '(.*)\..*', '\1.0')
    notify { "The network part of ${::ipaddress} is ${class_c}": }
  2. Run Puppet:
    t@cookbook:~/.puppet/manifests$ puppet apply ipaddress.pp 
    Notice: Compiled catalog for cookbook.example.com in environment production in 0.02 seconds
    Notice: The network part of 192.168.122.148 is
     192.168.122.0
    Notice: /Stage[main]/Main/Notify[The network part of 192.168.122.148 is
     192.168.122.0]/message: defined 'message' as 'The network part of 192.168.122.148 is
     192.168.122.0'
    Notice: Finished catalog run in 0.03 seconds
    

How it works…

The regsubst function takes at least three parameters: source, pattern, and replacement. In our example, we specified the source string as $::ipaddress, which, on this machine, is as follows:

192.168.122.148

We specify the pattern function as follows:

(.*)\..*

We specify the replacement function as follows:

\1.0

The pattern captures all of the string up to the last period (\.) in the \1 variable. We then match on .*, which matches everything to the end of the string, so when we replace the string at the end with \1.0, we end up with only the network portion of the IP address, which evaluates to the following:

192.168.122.0

We could have got the same result in other ways, of course, including the following:

$class_c = regsubst($::ipaddress, '\.\d+$', '.0')

Here, we only match the last octet and replace it with .0, which achieves the same result without capturing.

There's more…

The pattern function can be any regular expression, using the same (Ruby) syntax as regular expressions in if statements.

See also

  • The Importing dynamic information recipe in Chapter 3, Writing Better Manifests
  • The Getting information about the environment recipe in Chapter 3, Writing Better Manifests
  • The Using regular expressions in if statements recipe in this chapter
主站蜘蛛池模板: 松桃| 陵水| 贺兰县| 长乐市| 农安县| 吉木乃县| 武乡县| 中西区| 石城县| 福清市| 玉树县| 奉新县| 永修县| 呼和浩特市| 岳西县| 彰化县| 常德市| 浮山县| 西和县| 五莲县| 观塘区| 锡林郭勒盟| 乐山市| 诸暨市| 固镇县| 新丰县| 三河市| 睢宁县| 迁西县| 南陵县| 商水县| 子洲县| 太白县| 太仓市| 长子县| 大化| 乌恰县| 平利县| 神农架林区| 利辛县| 深水埗区|