从 Facter 获取字符串数组到 Puppet

Get array of strings from Facter into Puppet

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

我的自定义资料:

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

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

您有更好的工作解决方案的想法吗?

假设,您将此作为 Factor.add 的输出:

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

您可以在 JSON 的帮助下将其转换为 Array:

require 'json'

JSON.parse output
 => ["user1", "user2", "user3"] 

The output of the fact is a String like this: ["user1", "user2", "user3"]

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

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

因此,如果您使用的是(过时的)Puppet 3,那么您可以通过设置

来避免事实字符串化
stringify_facts = false

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