【问题标题】:Get array of strings from Facter into Puppet将字符串数组从 Facter 获取到 Puppet
【发布时间】:2018-07-03 11:25:57
【问题描述】:

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

我的自定义事实:

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

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

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

【问题讨论】:

  • "事实的输出是这样的字符串:['user1', 'user2', 'user3']" - 它看起来不像字符串。它是一个数组。
  • @JagdeepSingh 是的,它看起来像一个数组。但关键是,它是一个包含数组内容的字符串。如果我使用 validate_array(),它也会告诉我它不是一个数组而是一个字符串。
  • 您需要详细说明“带有数组内容的字符串”。你能把你实际拥有的东西粘贴到你的终端吗?
  • 我无法重现此内容。该事实代码为我输出一个数组而不是字符串。我用.instance_of?(Array) 仔细检查了它以验证。您需要发布更多信息以验证您的问题是否符合您的情况。
  • 这几乎是一个教科书示例,说明了一种方法做了太多应该分解的方法,以便您可以更好地单独测试和理解组件。

标签: ruby puppet facter


【解决方案1】:

事实的输出是这样的字符串:["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 设置。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 抱歉我的错误输出。它已经像 ["user1", "user2", "user3"] 但输出只是一个包含上述内容的字符串。我只能将字符串从因子传递给木偶。事实上,我猜它是一个数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2016-06-11
    • 2020-11-06
    • 2018-12-21
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多