使用正则表达式替换
Change is inevitable, except from vending machines.
— Robert C. Gallagher
Puppet 的 regsubst 函数提供了一种处理文本的简单方法, 用于在字符串中查找和替换,或者从字符串提取匹配的模式。 例如,我们通常需要对从 facter 或者从外部程序获得的数据做这样的处理。
在本例中将会看到如何使用 regsubst 提取一个 IP 地址的前三个字节 (即网络地址部分,假定此 IP 地址是一个 C 类地址)。
操作步骤
在配置清单中添加如下的代码:
$class_c = regsubst($ipaddress, "(.*)\..*", "\1.0") notify { $ipaddress: } notify { $class_c: }
运行 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) 语法一致。
参见本书
第 4 章的 导入动态信息 一节
第 4 章的 获得系统的环境信息 一节
第 3 章的 在 if 语句中使用正则表达式 一节