厨师正在创建动态 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
我在使用 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