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).
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 apply regsubst.pp Notice: Compiled catalog for cookbook.strangled.net in environment production in 0.02 seconds Notice: The network part of 10.0.2.15 is 10.0.2.0
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:
10.0.2.15
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:
10.0.2.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.
The pattern function can be any regular expression, using the same (Ruby) syntax as regular expressions in if
statements.