使用正则表达式替换

Change is inevitable, except from vending machines.

— Robert C. Gallagher

Puppet 的 regsubst 函数提供了一种处理文本的简单方法, 用于在字符串中查找和替换,或者从字符串提取匹配的模式。 例如,我们通常需要对从 facter 或者从外部程序获得的数据做这样的处理。

在本例中将会看到如何使用 regsubst 提取一个 IP 地址的前三个字节 (即网络地址部分,假定此 IP 地址是一个 C 类地址)。

操作步骤

  1. 在配置清单中添加如下的代码:

    $class_c = regsubst($ipaddress, "(.*)\..*", "\1.0")
    notify { $ipaddress: }
    notify { $class_c: }
    
  2. 运行 Puppet:

    notice: 10.0.2.15
    notice: 10.0.2.0
    

工作原理

regsubst 函数需要携带三个参数: 源字符串、匹配模式(pattern)和替换结果。 在本例中,我们指定的源字符串是 $ipaddress,这恰好是:

    10.0.2.15

我们还指定了 (.).. 作为匹配模式并且 \1.0 作为替换结果。

匹配模式将匹配整个 IP 地址,捕获的前三个字节放在一对圆括号内。 被捕获的文本可以在替换结果中使用 \1 来引用。

被匹配的全部文本(本例中是字符串 “10.0.2.15”)将使用替换结果(replacement)来替换。 这里是 \1 (从源字符串中捕获的文本)跟上字符串 .0, 最终获得:10.0.2.0。

更多用法

匹配模式中可以使用任何正则表达式,与在 if 语句中使用的正则表达式 (Ruby) 语法一致。

参见本书