Chef创建动态Json文件

时间:2018-05-21 22:09:07

标签: json chef chef-recipe

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

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

make check

此文件将由Newrelic插件

使用

模板文件plugin.json.erb:

MSYS2 MinGW 32-bit

我已经创建了这样的食谱: MySQL的-plugin.rb

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

在Template模块中,我应该怎样做一个像plugin.json这样的Json文件?

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

先谢谢。

2 个答案:

答案 0 :(得分:1)

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

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,而不是将整个文件设置为您的示例。

答案 1 :(得分:0)

生成正确的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) %>
    }
  ]
}

在模板Block我喜欢:

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