在我正在处理的模块中,我需要检查计算机上是否存在特定用户。 这个想法是创建一个包含所有用户数组的自定义事实。 在模块中,它应该遍历数组并检查特定用户是否是数组的一部分。
我的自定义事实:
Facter.add("users") do
setcode do
IO.readlines("/etc/passwd").collect do |line|
line.split(":").first
end
end
end
事实的输出是一个像这样的字符串: [“ user1”,“ user2”,“ user3”]
因为它只是一个字符串,没有数组,所以我无法在人偶模块中对其进行迭代。
然后我尝试
shell_split($::users).each |String $user| {
notify { "$user":}
}
但是现在,每个用户在用户名后都包含一个逗号。
您有一个可行且更好的解决方案的想法吗?
答案 0 :(得分:1)
事实的输出是一个像这样的字符串:[“ user1”,“ user2”,“ user3”]
不,不是。您在事实的setcode
块中提供的Ruby代码将评估为一个数组。该表达式提供了事实的价值。这是一个数组。
但是,Puppet可能会在从Facter接收到数组后,将其转换为字符串。木偶3默认情况下会执行此操作,但是具有布尔型stringify_facts
的配置设置可能会阻止该行为。人偶4保留了该设置,但已弃用该设置,并将其默认值反转为false
。人偶5删除了该设置,并且从不对事实值进行字符串化处理。
因此,如果您使用的(过时的)Puppet 3,则可以通过设置避免事实串化
stringify_facts = false
主服务器和所有代理程序上[main]
文件puppet.conf
部分中的。您可以在Puppet 4上执行相同的操作,但也可以只确保未明确设置stringify_facts
设置。
答案 1 :(得分:0)
假设,您将其作为Factor.add
的输出:
output = '["user1", "user2", "user3"]'
您可以借助JSON
将其转换为Array
:
require 'json'
JSON.parse output
=> ["user1", "user2", "user3"]