我有以下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": }
}
}