问题
Puppet 拆分功能失败,因为 Puppet 已将 puppet 升级到版本3.5.1
,而此功能直到3.4.3
代码
1 $ports_regex = "80\\|443"
2
3 $ports_string = regsubst($ports_regex, '\\\|', ',', 'G')
4
5 notify{"CP1 ${ports_string}":}
6
7 $ports_array = split($ports_string, ',')
8
9 notify{"CP2 ${ports_array}":}
10
11 each($ports_array) |$port| {
12 notify{"CP3 ${port}":}
13
14 file {"${port}":
15 path => "c:/temp/puppettest/${port}",
16 ensure => present;
17 }
18 }
结果
3.4.3
Notice: /Stage[main]/Main/File[443]/ensure: created
Notice: CP2 80443
Notice: /Stage[main]/Main/Notify[CP2 80443]/message: defined 'message' as 'CP2 80443'
Notice: CP1 80,443
Notice: /Stage[main]/Main/Notify[CP1 80,443]/message: defined 'message' as 'CP1 80,443'
Notice: CP3 80
Notice: /Stage[main]/Main/Notify[CP3 80]/message: defined 'message' as 'CP3 80'
Notice: /Stage[main]/Main/File[80]/ensure: created
Notice: CP3 443
Notice: /Stage[main]/Main/Notify[CP3 443]/message: defined 'message' as 'CP3 443'
3.5.1
C:\Windows\system32>puppet apply --parser future --debug --verbose "C:\temp\puppettest\site.pp"
Error: Invalid tag cp2 at C:/temp/puppettest/site.pp:9 on node ...
Error: Invalid tag cp2 at C:/temp/puppettest/site.pp:9 on node ...
问题
如何解决这个问题?
答案1
工单已关闭并标记为“无法修复”,请参阅https://tickets.puppetlabs.com/browse/PUP-2612
Henrik Lindberg 添加了一条评论 - 2014/05/19 下午 3:43 - 已编辑
啊,下一个问题是哈希和数组的插值会产生与源等效的文本,而以前它只是将所有内容一起运行。
如果您将以下内容与当前和未来的解析器进行比较,您会发现:
$a = [1,2,3]
通知$a
通知“$a”
我不确定您在这里想要实现什么 - 原始版本似乎创建了“CP 2 80443”,而您现在得到的是“CP2 [80, 443]”,然后它会出错。然后,当您迭代 $ports_array 时,您将得到一个 $port,它首先是 80,然后是 443(当正则表达式已用 6 个反斜杠更正时)。这意味着您在目录中放置了 2 个通知;“CP3 80”,然后是“CP3 443”,然后创建 2 个文件资源,一个名为“80”,然后一个名为“443”。
资源实现负责标题字符串的解释,并且在面对标点符号、空格、数字和括号时会做出奇怪的事情。
提示是使用通知来获取中间结果的输出。我在第一部分使用了它:
$ports_regex = "80\|443"
$ports_string = regsubst($ports_regex, '\\\|', ',', 'G')
注意“ports_regex = '${ports_regex}'”
注意“ports_string = '${ports_string}'”
$ports_array = 拆分($ports_string,',')
注意“ports_array = '${ports_array}'”
$a = “CP1 ${ports_string}”
通知$a
通知{$a:}
$b = “CP2 ${ports_array}”
通知$b
通知{$b:}
如果您想要将数组的所有内容简单地运行到一个字符串中而不使用任何分隔符的旧行为,您应该使用 stdlib 中的 join 函数(即 join($ports_array, ''),但随后您只需用逗号单独替换即可。
您还可以按照不同的顺序执行此操作 - 例如:
$ports_array = $ports_regex.split('\\\|')
$ports_string = $ports_array.join('')
第一个函数将字符串拆分为一个数组,第二个函数将数字连接起来并构造一个字符串,中间不加标点和括号。然后,您可以使用该字符串插入以 CP 开头的标题。
或者,如果您不想输入那么多反斜杠,您可以直接使用正则表达式:
$ports_array = $ports_regex.split(/\|/)
$ports_string = $ports_array.join('')
希望有帮助