Шеф-повар создает динамический файл Json - PullRequest
0 голосов
/ 22 мая 2018

У меня возникла проблема при создании файла json с использованием шаблона внутри шаблона chef.

Мне нужно создать файл 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

В блоке Шаблоны, что я должен сделать, чтобы сделать файл Json как plugin.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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Для создания правильного 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
0 голосов
/ 22 мая 2018

Во-первых.Вы должны установить любые переменные node по умолчанию внутри default.rb в вашей папке атрибутов.Например:

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

Атрибуты узла сбрасываются перед компиляцией и извлекаются из этого файла, а также из Ohai.Установка атрибутов узла внутри рецепта означает, что они не будут доступны для вашего шаблона (вы должны просмотреть этот Обзор клиента Chef ).

Далее, если вам просто нужно задать имя хостаили другую определенную часть файла шаблона, вы можете сделать это внутри вашего erb файла:

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

Ваш текущий файл erb пытается преобразовать @name (который вы пытаетесь установить в localhost1)json, не устанавливайте весь файл как ваш пример.

...