如何在木偶上使用参数化正则表达式(例如/${user}/)进行测试?

how to test with parameterized regex (e.g. /${user}/) on puppet?

我需要获取用户的主目录。我决定通过解析 ::getent_passwd 字符串(这是一个自定义事实构建为 /etc/passwd 的内容的串联) 并借助正则表达式提取相关信息。

当我使用固定字符串 ("adam") 测试 ::getent 时,提取有效:

if "$::getent_passwd" =~ /\|adam:x:[^:]+:[^:]+:[^:]*:([^:]*):/ {
  $user_home = 
  notify{"This works":}
}

但是当我使用 $user 变量构建正则表达式时,没有任何匹配项:

if "$::getent_passwd" =~ /\|${user}:x:[^:]+:[^:]+:[^:]*:([^:]*):/ {
  $user_home = 
} else {
  fail{"this fails":}
}

客户端和服务器在 Ubuntu 14.04 64 位上使用 Puppet 3.7.3。 Puppetserver 使用 puppetdb。

看来,在 puppet 正则表达式中使用普通变量是不可能的: https://docs.puppetlabs.com/puppet/latest/reference/lang_datatypes.html#regular-expressions https://projects.puppetlabs.com/issues/4155

上面 link 中提出了解决方法:

regex.erb:

<% if /(^|\s+)#{string2}(\s+|$)/.match(string1) then %>yes<% else %>no<% end %>

manifest:

$testre = template('regex.erb')
if $testre == "yes\n" { notify{"success!": } }

五年后的答案,但现在有一个简单的方法。 对于其他登陆此处的人...尝试 regexp constructor 从字符串构建正则表达式:

if("abcd" =~ Regexp("${myvar}") { (...) }