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:
- Add the following code to your manifest:
$class_c = regsubst($::ipaddress, '(.*)\..*', '\1.0') notify { "The network part of ${::ipaddress} is ${class_c}": }
- 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