Puppet正则表达式(在引号之间的var中抓取路径)



我有以下yaml:

role::project::conf::files:
entry_01:
- 'file "/var/project/some_file.txt" 5333;'
- 'echo no;'
entry_02:
- 'file "/var/project/some_other_file.txt" 5334;'
- 'echo yes;'
entry_03:
- 'file "/var/project/extra_file.txt" 5335;'
- 'echo yes;'

那么我使用了以下正则表达式https://regex101.com/r/pVzseA/1为了获取这些引号之间的值(regex在regex101.com中有效(,但在Puppet:中不起作用

each($files) | $files_itm | {
if $files_itm[1] =~ /"([^"]*)"/ {
#how to get only the path here in var
}
}

更新,类别:

class role::project::conf (
$files = [],
){
each($files) | $files_itm | {
if $files_itm[1] =~ /"([^"]*)"/ {
notify { "file ${1} seen": }
}
}
}

我使用了以下正则表达式https://regex101.com/r/pVzseA/1以便获取那些引号(regex在regex101.com中有效(,但没有木偶作品:

each($files) | $files_itm | {
if $files_itm[1] =~ /"([^"]*)"/ {
#how to get only the path here in var
}
}

正如我在评论中指出的,Puppet使用Ruby的正则表达式风格。这不是Regex101明确支持的正则表达式之一,因此在那里工作的正则表达式不适用于Puppet也不是不可能的。然而,Rubular的Ruby风格的在线正则表达式测试表明,您的特定正则表达式在Ruby中运行良好,包括匹配组。

您没有显示如何在Puppet代码中获得匹配的组,但Puppet的正则表达式文档中给出了适当的过程。特别是:

在条件语句和节点定义中,子字符串在[ic]中正则表达式中的括号()可用作编号关联代码段内的变量。第一个是$1第二个是$2,依此类推。整个匹配可用作$0。这些不是正常变量,并且有一些特殊行为:〔…〕

这也反映在条件语句的文档中。

您只有一个捕获组,因此在条件语句的正文中,您可以将捕获的内容称为$1。例如,

each($files) | $files_itm | {
if $files_itm[1] =~ /"([^"]*)"/ {
notify { "file ${1} seen": }
}
}

但是,请注意,捕获组变量只能在条件语句的主体中访问,并且在条件中有正则表达式匹配的任何嵌套条件之外访问。此外,如果在同一条件语句的条件中有两个或多个regex匹配表达式,则似乎没有记录其含义。

更新

但问题的更新和你在评论中出现的错误信息表明,你正在解决的问题完全不同。与Hiera键role::project::conf::files相关联的值是一个散列,包含字符串键和数组值,而您似乎期望根据类中默认编码的参数生成一个数组。当您迭代散列并捕获单个变量中的条目时,该变量将采用两个元素数组值,其中第一个(元素0(是条目的键,第二个(元素1(是相应的值。

因此,当问题中提供的Hiera数据绑定到$files参数时,表达式$files_itm[1]的计算结果为数组值,如['file "/var/project/some_file.txt" 5333;', 'echo no;']。这些操作数不适合=~运算符的左侧操作数,这正是错误消息告诉您的。

在这里很难说出你真正想要什么,但这至少应该避免错误(结合你的YAML数据(:

each($files) | $itm_key, $itm_value | {
if $itm_value[0] =~ /"([^"]*)"/ {
notify { "file ${1} seen": }
}
}

最新更新