我在使用厨师模板中的模板生成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) %>
先谢谢。
答案 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