0

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

我的自定义事实:

Facter.add("users") do
  setcode do
    IO.readlines("/etc/passwd").collect do |line|
      line.split(":").first
    end
  end
end

事实的输出是这样的字符串: ["user1", "user2", "user3"]

因为它只是一个字符串而不是数组,所以我无法在我的 puppet 模块中遍历它。

然后我尝试了

  shell_split($::users).each |String $user| {
    notify { "$user":}
  }

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

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

4

2 回答 2

2

事实的输出是这样的字符串: ["user1", "user2", "user3"]

不,不是。您在事实setcode块中提供的 Ruby 代码计算为一个数组。该表达式提供了事实的价值。它是一个数组。

但是,Puppet 可能会在从 Facter 接收到该数组后将该数组转换为字符串。Puppet 3 默认这样做,但有一个布尔stringify_facts配置设置可以防止这种行为。Puppet 4 保留了该设置,但弃用了它并将其默认值(改为false)。Puppet 5 删除了设置,并且从不将事实值字符串化。

因此,如果您使用的是(过时的)Puppet 3,那么您可以通过设置来避免事实字符串化

stringify_facts = false

在主服务器和所有代理[main]的文件部分中。puppet.conf您可以在 Puppet 4 上执行相同的操作,但您也可以确保stringify_facts根本没有明确设置该设置。

于 2018-07-03T14:08:20.537 回答
0

假设,你有这个作为输出Factor.add

output = '["user1", "user2", "user3"]'

您可以Array借助以下工具将其转换为JSON

require 'json'

JSON.parse output
 => ["user1", "user2", "user3"] 
于 2018-07-03T11:42:06.787 回答