Ändern Sie zur Laufzeit den Knotenwert im Chef-Solo-Skript

1068
Danack

Ich versuche, Chef-solo zu verwenden, um einige Software in einer Vagrant-VM bereitzustellen, und ich kann dieselben Rezepte für die Bereitstellung auf einer auf EC2 ausgeführten Centos-Box wiederverwenden.

Ich würde es vorziehen, das Root-MySQL-Passwort in der Box zu generieren, anstatt es in das Boot-Skript aufzunehmen. Wie kann ich zur Laufzeit jedoch einen Knotenwert in Chef setzen?

Im folgenden Rezept schreibt das Skript buildInfo.php einige JSON-Daten in die Datei, /etc/chef/serverInfo.jsondie ich dann gerne von Chef lesen und verwenden möchte.

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 

Es scheint jedoch, dass ein Befehl zum Ändern der Werte durch node.override.usw. ausgeführt wird, wenn Chef-solo startet und die Rezepte analysiert, und nicht, wenn die Rezepte tatsächlich ausgeführt werden.

Wie kann ich den Wert einer Knotenvariablen wie node["MYSQL_PASSWORD"]in einem Rezept festlegen, um später in einem separaten Rezept verwendet zu werden?

0

1 Antwort auf die Frage

1
nictrix

Ich fand tatsächlich einen Weg, dies zu tun, indem ich eine zweite Chefkonvergenz durchführte, nachdem ich ein paar Dinge in einem Rezept durchgegangen war. Ich bin überrascht zu sehen, dass jemand anderes dies braucht.

Dies ist mein Bericht über den Re-Konvergenz-Hack

Nachfolgend finden Sie das, was ich glaube, um dies zu erreichen. Bitte lesen Sie auch den Blogpost.

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