将字符串数组从Facter放入Puppet

时间:2018-07-03 11:25:58

标签: ruby puppet facter

在我正在处理的模块中,我需要检查计算机上是否存在特定用户。 这个想法是创建一个包含所有用户数组的自定义事实。 在模块中,它应该遍历数组并检查特定用户是否是数组的一部分。

我的自定义事实:

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":}
  }

但是现在,每个用户在用户名后都包含一个逗号。

您有一个可行且更好的解决方案的想法吗?

2 个答案:

答案 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"]