Изменить значение узла в скрипте Chef-solo во время выполнения
Я пытаюсь использовать Chef-solo для развертывания некоторого программного обеспечения в виртуальной машине Vagrant, а также для возможности повторного использования тех же рецептов для развертывания на блоке Centos, работающем на EC2.
Я бы предпочел сгенерировать корневой пароль MySQL на коробке, а не включать его в загрузочный скрипт. Но как я могу установить значение узла в Chef во время выполнения?
например, в приведенном ниже рецепте скрипт buildInfo.php запишет некоторые данные JSON в файл /etc/chef/serverInfo.json
который я хотел бы, чтобы Chef читал и использовал.
execute 'build_info' do
cwd node[:source_folder] + "/tools"
command "php buildInfo.php /etc/chef/serverInfo.json"
node.override.merge!(JSON.parse(File.read("/etc/chef/serverInfo.json")))
command "echo 'password is " + node["MYSQL_PASSWORD"] + "' > /tmp/chefvartest.txt"
end
Однако, похоже, что любая команда для изменения значений через node.override.
и т. д. выполняются, когда Chef-solo запускается и анализирует рецепты, а не когда рецепты фактически запускаются.
Как я могу установить значение переменной узла, как node["MYSQL_PASSWORD"]
в одном рецепте, который будет использоваться позже в отдельном рецепте?
1 ответ
На самом деле я нашел способ сделать это, выполнив второе схождение шеф-повара, выполнив несколько вещей в рецепте. Я удивлен, что кому-то еще это нужно.
Это мое описание взлома повторной конвергенции
Ниже приведено то, что я считаю, что вам нужно для этого, пожалуйста, просмотрите сообщение в блоге тоже.
#some parts of your recipe can go up here
#Initialize a new chef client object
client = Chef::Client.new
client.run_ohai #you probably only need this if you need to get new data
client.load_node
client.build_node
#Intialize a new run context to evaluate later
run_context = if client.events.nil?
Chef::RunContext.new(client.node, {})
else
Chef::RunContext.new(client.node, {}, client.events)
end
#Initialize a chef resource that downloads the remote file
r = Chef::Resource::Execute.new("build_info", run_context)
r.cwd node[:source_folder] + "/tools"
r.command "php buildInfo.php /etc/chef/serverInfo.json"
r.run_action(:run)
#Converge and run the new resources
runner = Chef::Runner.new(run_context)
runner.converge
#Since the file is now created from the above hack, Chef will be able to read it
node.override.merge!(JSON.parse(File.read("/etc/chef/serverInfo.json")))