【问题标题】:How to assign file content to chef node attribute如何将文件内容分配给厨师节点属性
【发布时间】:2016-08-19 11:27:33
【问题描述】:

我在"#{node['abc.d']}/fingreprint.txt"位置有fingreprint.txt

文件内容如下:
time="2015-03-25T17:53:12C" level=info msg="SHA1 Fingerprint=7F:D0:19:C5:80:42:66"

现在我想检索指纹的值并将其分配给厨师属性
我正在使用以下红宝石块

ruby_block "retrieve_fingerprint" do  
    block do  
        path="#{node['abc.d']}/fingreprint.txt"  
        Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)  
        command = 'grep -Po '(?<=Fingerprint=)[^"]*' path '  
        command_out = shell_out(command)  
        node.default['fingerprint'] = command_out.stdout  
    end  
    action :create  
end  

由于command = 'grep -Po '(?&lt;=Fingerprint=)[^"]*' path ' 中缺少转义字符,它似乎无法正常工作。 请让我知道是否有其他方法可以将文件内容分配给节点属性

【问题讨论】:

    标签: ruby ruby-on-rails-3 chef-infra chef-recipe chef-solo


    【解决方案1】:

    有两种方法来回答这个问题:首先我会在 Ruby 中进行读取 (IO.read) 和解析(RegExp.new 和朋友),而不是使用 grep

    if IO.read("#{node['abc.d']}/fingreprint.txt") =~ /Fingerprint=([^"]+)/
      node.default['fingerprint'] = $1
    end
    

    其次,根本不要这样做,因为它可能不会像您期望的那样运行。您必须考虑两次加载过程以及每次运行都会重置默认属性的事实。如果您正在尝试制作 Ohai 插件,请改为这样做。如果您尝试在以后的资源中使用此数据,您可能希望将其存储在全局变量中并大量使用 lazy {} 帮助器。

    【讨论】:

    • 我从未使用过 Ohai 插件。请建议我如何将上述 ruby​​_block 转换为 OHAI 插件。还。使用 IO.read 我收到编译错误,因为文件在运行时才存在。
    • 你知道谷歌的东西吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多