厨师正在创建动态 Json 文件

Chef Creating dynamic Json File

我在使用 Chef 模板中的模板生成 json 文件时遇到问题。

我需要生成一个如下所示的 json 文件,名为 plugin.json:

{
  "agents": [
    {
      "name"    : "sqlhost",
      "host"    : "localhost",
      "metrics" : "status,newrelic",
      "user"    : "root",
      "passwd"  : "mysecret"
    }
  ]
}

Newrelic 插件将使用此文件

模板文件plugin.json.erb:

<%= Chef::JSONCompat.to_json_pretty(@name) %>

我创建了一个这样的食谱: mysql-plugin.rb

# Default Variables
newrelic = decrypt_databag('newrelic')
node.default['newrelic_npi']['license_key'] = newrelic['license_key']
plugin = 'com.newrelic.plugins.mysql.instance'
plugin_json_path = "/opt/newrelic-npi/plugins/com.newrelic.plugins.mysql.instance/newrelic_mysql_plugin-2.0.0/config/plugin.json" 
node.default['newrelic_npi']['name'] = "localhost1"

  execute 'fetch' do
    cwd node['newrelic_npi']['install_path']
    user node['newrelic_npi']['user']
    command "./npi fetch #{plugin} -y"
    not_if do
      ::File.exist? "#{node['newrelic_npi']['install_path']}/plugins/#{plugin}"
    end
  end

  execute 'prepare' do
    cwd node['newrelic_npi']['install_path']
    user node['newrelic_npi']['user']
    command "./npi prepare #{plugin}"
  end


 template "#{plugin_json_path}" do
    source 'plugin.json.erb'
    owner "root"
    group "root"
    mode "0644"
    variables  :name => node['newrelic_npi']['name']
    action :create
end

  execute 'add-service' do
    cwd node['newrelic_npi']['install_path']
    user node['newrelic_npi']['user']
    command "sudo ./npi add-service #{plugin} --start" # needs root privileges
    not_if do
      ::File.exist? "/etc/init.d/newrelic_plugin_#{plugin}"
    end
  end

在模板块中,我应该如何制作一个像 plugin.json 这样的 Json 文件?

template "#{plugin_json_path}" do
        source 'plugin.json.erb'
        owner "root"
        group "root"
        mode "0644"
        variables  :name => node['newrelic_npi']['name']
        action :create
    end

提前致谢。

首先。您应该在属性文件夹中的 default.rb 内设置任何默认 node 变量。像这样:

default['newrelic_npi']['license_key'] = newrelic['license_key']
default['newrelic_npi']['name'] = "localhost1"

节点属性在编译前重置,将从该文件和 Ohai 中提取。在配方中设置节点属性意味着它们将不适用于您的模板(您应该查看此 Chef Client Overview)。

接下来,如果您只需要设置主机名或模板文件的其他特定部分,您可以在 erb 文件中执行此操作:

{
  "agents": [
    {
      "name"    : "sqlhost",
      "host"    : "<%= @name %>",
      "metrics" : "status,newrelic",
      "user"    : "root",
      "passwd"  : "mysecret"
    }
  ]
}

您当前的 erb 文件正在尝试将 @name(您尝试将其设置为 localhost1)转换为 json,而不是像您的示例那样设置整个文件。

要生成正确的 plugin.json:

{
  "agents": [
    {
      "name"    : <%= Chef::JSONCompat.to_json_pretty(@name) %>,
      "host"    : <%= Chef::JSONCompat.to_json_pretty(@host) %>,
      "metrics" : <%= Chef::JSONCompat.to_json_pretty(@metrics) %>,
      "user"    : <%= Chef::JSONCompat.to_json_pretty(@user) %>,
      "passwd"  : <%= Chef::JSONCompat.to_json_pretty(@passwd) %>
    }
  ]
}

我喜欢的模板块:

template node['newrelic_npi']['plugin_json_path'] do
    source 'plugin.json.erb'
    owner 'root'
    group 'root'
    mode '0644'
    variables(
      :name => node['newrelic_npi']['name'],
      :host => node['newrelic_npi']['host'],
      :metrics => node['newrelic_npi']['metrics'],
      :user => node['newrelic_npi']['user'],
      :passwd => node['newrelic_npi']['myql_admin_password']
)
    action :create
end