런타임시 Chef-solo 스크립트의 노드 값 변경


0

Chef-solo를 사용하여 Vagrant VM 내부에 일부 소프트웨어를 배포하고 동일한 요리법을 다시 사용하여 EC2에서 실행되는 Centos 상자에 배포 할 수있게하려고합니다.

부팅 스크립트에 포함시키지 말고 상자에 루트 MySQL 암호를 생성하는 것을 선호합니다. 하지만 런타임에 Chef에서 노드 값을 설정하려면 어떻게해야합니까?

예 : 아래의 레서피에서 스크립트 buildInfo.php는 파일에 JSON 데이터를 씁니다. /etc/chef/serverInfo.json 나는 요리사가 읽고 사용하기를 바랄 것입니다.

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

사실 요리법에서 몇 가지를 실행 한 후 두 번째 Chef 융합을 실행하여이 작업을 수행 할 수있는 방법을 찾았습니다. 나는 다른 누군가가 이것을 필요로하는 것을보고 놀랐다.

이것은 다시 컨버전스 해킹을 써라.

아래는 내가 당신이 이것을 달성하는 데 필요한 것입니다, 블로그 게시물도 검토하시기 바랍니다.

#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")))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.