【问题标题】:Puppet : How to load file from agent - Part 2Puppet : 如何从代理加载文件 - 第 2 部分
【发布时间】:2017-05-05 15:42:40
【问题描述】:

我正在尝试加载 json 文件的内容并将它们分配给变量。 我的 json 文件如下所示:

{ "master":{ "key1":"value1", "key2":"value2", "key3":"value3" } }

在我的本地机器上,我能够使用以下清单来加载 json 文件并对其进行解析;它工作得很好。

$master_hash=loadjson('some_file.json')
$key1=$master_hash['master']['key1']
$key2=$master_hash['master']['key2']
$key3=$master_hash['master']['key3']

但是,当我将它移到 Puppet master 时,它会在 Puppet master 上查找 json 文件,这会失败!在我之前的请求Puppet : How to load file from agent 中,我被告知要使用一个函数,这对于一个事实来说效果很好,但在这种情况下,我需要根据 json 文件的内容生成其中的一些函数。我怎样才能做到这一点?

【问题讨论】:

  • 我想仔细检查几个错别字:“当我将其移至 Puppet Master 时”您的意思是将其移至我假设的节点;或者其他一些没有将 json 移动到主服务器的情况,因为这样会起作用。 “我被告知要使用一个函数”你实际上使用了一个自定义事实。无论如何,你最好的选择是外部事实:docs.puppet.com/facter/3.6/custom_facts.html#external-facts。查看该文档并决定如何继续。
  • 不,我是说主人。 +1 的建议。我现在需要阅读红宝石!

标签: puppet


【解决方案1】:

loadjson() 这样的函数在编译目录的机器上执行。在大多数情况下,这意味着该函数在主服务器上执行。由于 master 上不存在 some_file.json,它不会加载该文件。

如果您想将信息从代理传输到主控,那么您需要使用事实来执行此操作。事实被同步到代理机器并在运行开始时执行,它们的值被发送回主服务器。

您上一个问题的答案是一个很好的基础,但我会在这里稍微扩展一下:

# module_name/lib/facter/master_hash.rb
require 'json'
Facter.add(:master_hash) do
  setcode do
    # return content of foo as a string
    f = File.read('/path/to/some_file.json')
    master_hash = JSON.parse(f)
    master_hash
  end
end

setcode 块的最后一行作为事实值返回。在这种情况下,它会暴露一个 $::master_hash 事实,该事实将包含来自已解析 json 的哈希。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多