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

Puppet regular expression (grab path in var between quotation marks)

我有以下 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 来获取引号之间的值(正则表达式在 regex101.com 中有效)但在 Puppet 中不起作用:

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

更新,class:

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

I've used the following regular expression https://regex101.com/r/pVzseA/1 in order to grab the value between those quotation marks (the regex works in regex101.com) but doesn't work in Puppet:

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

正如我在评论中指出的那样,Puppet 使用 Ruby 风格的正则表达式。这不在 Regex101 明确支持的范围内,因此在那里工作的正则表达式不能与 Puppet 一起工作也不是不可能的。但是,Rubular 的 Ruby-flavor 在线正则表达式测试器显示您的特定正则表达式在 Ruby 中工作得很好,包括匹配组。

您没有在 Puppet 代码中说明您是如何尝试获取匹配组的,但 Puppet's regular expression docs 中给出了适当的过程。特别是:

Within conditional statements and node definitions, substrings withing [sic] parentheses () in a regular expression are available as numbered variables inside the associated code section. The first is </code>, the second is <code>, and so on. The entire match is available as [=16=]. These are not normal variables, and have some special behaviors: [...]

这也体现在the documentation for conditional statements

您只有一个捕获组,因此在您的条件语句正文中,您可以将捕获的内容引用为</code>。例如,</p> <pre><code>each($files) | $files_itm | { if $files_itm[1] =~ /"([^"]*)"/ { notify { "file seen": } } }

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

更新

但是问题的更新和您在评论中提供的错误消息表明您正在努力解决的问题是完全不同的。与 Hiera 键 role::project::conf::files 关联的值是一个 散列 ,具有字符串键和数组值,而您似乎期望根据编码到 [=54 中的参数默认值的数组=].当您遍历哈希并捕获单个变量中的条目时,该变量将采用 two-element 数组值,其中第一个(元素 0)是条目的键,第二个(元素 1)是相应的值。

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

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

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