如何从执行资源命令输出中设置节点属性值


execute 'my_commad' do
  command 'myvar=`curl http://example.com/blah/blah` && echo -n $myvar > /etc/value'
end
node.default[:attribute1] = ::File.read('/etc/value').chomp

这将失败,因为在收敛时首先检查节点属性,因此它将抛出以下错误:

错误:没有这样的文件或目录 @ rb_sysopen -/etc/value

如果您在配方本身而不是属性文件中设置节点属性,这可能对您有用。 不过,在我看来,有更好的方法可以做到这一点...

您可以使用ruby_block并使用 Ruby 代码从 URL 中获取所需的值,然后将其分配给节点属性。 它将是这样的:

ruby_block 'fetch value' do
  block do
    require 'net/http'
    require 'uri'
    url = 'http://example.com/blah/blah'
    val = Net::HTTP.get(URI.parse(url))
    node.default[:attribute1] = val
end

只需确保 attribute1 节点属性的每次读取都是在分配后进行的。 您可能需要重新排列节点运行列表,以确保在执行上述配方后,依赖于此配方的所有配方都将出现在节点运行列表中。

最新更新