Я пытаюсь использовать 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 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .