Изменить значение узла в скрипте Chef-solo во время выполнения

1004
Danack

Я пытаюсь использовать 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"]в одном рецепте, для последующего использования в отдельном рецепте?

0

1 ответ на вопрос

1
nictrix

На самом деле я нашел способ сделать это, выполнив второе схождение шеф-повара, выполнив несколько вещей в рецепте. Я удивлен, что кому-то еще это нужно.

Это мое описание взлома повторной конвергенции

Ниже приведено то, что, по моему мнению, необходимо для этого, пожалуйста, просмотрите также и блог.

#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"))) 

Похожие вопросы