Disclaimer: ziemlich neu zu Chef und ich habe eine Reihe von Koch Kochbüchern geerbt. Die folgenden Methoden sind nicht optimal, aber dafür muss ich jetzt arbeiten. Sei sanft, bitte. :) Bitte, bitte tragen Sie mit mir, wie ich versuche zu beschreiben, was ich brauche.Wie man vom Chef-Client-Zustand des letzten Blocklaufs schützt; Verwenden Sie keine Statusdatei
Bitte beachten Sie, dass wir den Chef-Client 11.16.4 verwenden. Aktualisierung auf 12.x ist vorerst keine Option.
tl; dr Gibt es eine Möglichkeit, eine Wache aus dem Stand der laufenden Block zu spezifizieren:
...
only_if { this_block_did_something }
notifies :run, 'bash[deploy-custom-docker-container]', :immediately
OK ....
Nehmen Sie dieses Stück Code in einem Rezept, das ich geerbt und ein wenig Refactoring benötigen ...
# The identities of the innocent have been changed for their
# protection. Please ignore odd things in this example:
application app[:name] do
path app[:deploy_path]
enable_submodules true
repository app[:repository]
owner OWNER
group GROUP
symlinks({
"file.py" => "path/file.py"
})
revision app[:branch]
deploy_key data_bag_item('deployment_keys', 'keyname')['private_key']
end
link "/path/to/file.py" do
to "/path/to/settings-%s.py" % [file]
end
# This is where I need some direction...I think.
# note that CMD is a valid constant and the custom docker
# container does not follow any industry standard docker
# conventions due to our strange use-case. So I had to resort
# using a bash block to call our custom start/stop/restart script
bash 'deploy-custom-docker-container' do
code <<-EO
#{CMD} restart
EO
# currently a subscribes but I've tried other methods which
# don't achieve what I'm trying to accomplish
subscribes :run, 'application[%s]' % [app[:name]]
end
die application app[:name]
setzt auf den Zielknoten Quellcode, wenn die Repo neuen Code muss synchronisiert werden . Der Block bash
startet einen sehr benutzerdefinierten und nicht standardmäßigen Andock-Container, der den Code verwendet.
In seiner jetzigen Form, was unerwünscht ist, wird der bash[deploy-custom-docker-container]
Block immer ausgeführt, unabhängig davon, ob application app[:name]
hat Code zu einem git repo bereitstellen oder nicht (IE repo Vs nicht aktuell auf dem neuesten Stand) auf dem Zielknoten . Ich bin mir sicher, dass ich einen Code erstellen konnte, der festlegte, ob der Repo aktualisiert wurde, eine Status-/Sperrdatei und dann guard
die Ausführung des Blocks bash
durch Überprüfen, ob diese Sperrdatei existiert. Für mich wäre das ein suboptimaler Weg, um mein Ziel zu erreichen. Was optimal wäre, ist, den Status des Kochs als die Methode zum Einstellen des Schutzes zu verwenden. Ist das möglich?? Lesen Sie weiter ...
Mit anderen Worten, wenn application app[:name]
während Koch-Client-Laufzeit getroffen wird, und ein Repo aktualisiert wurde (und damit auf dem Knoten implementiert), Koch-Client meldet die Schritte application app[:name]
den neuen Code bereitstellen . Wenn der Repo nicht aktualisiert werden musste, überspringt der Chef-Client den Block mit einer Nachricht "(aktuell)". Wenn das Repo aktualisiert werden muss, zeigt der Chef-Client die Schritte an, die zur Bereitstellung des Codes ausgeführt wurden. Der Chef-Klient kennt also den Status des gerade ausgeführten Code-Blocks.
Auch meine Beobachtungen, wie Koch-Client läuft in unserer Umwelt hat mir gezeigt, dass es nicht, wenn ich einen notifies
Block in application app[:name]
für bash[deploy-custom-docker-container]
stellen keine Rolle oder die subscribes
Methode (klebte oben) verwenden; Der bash
-Block wird unabhängig vom Status der application app[:name]
ausgeführt. Ich würde es vorziehen, dass der bash
Block nicht ausgeführt wird, wenn die application app[:name]
keine Aktualisierung ausführen muss.
Was ich befürchte ist, dass ich eine Statusdatei verwenden muss, um den Status der Aktualisierung des Repos aus dem application app[:name]
Block zu bestimmen. Ich würde lieber den Zustand der Laufzeit aus der Perspektive des Chefs des application app[:name]
Block nur schützen.
FIXED CODE
Wie von zts, meine action
s waren falsch oder fehlt. Mit dem folgenden Code konnte ich mein Problem lösen.
application app[:name] do
...
notifies :run, 'link[%s]' % [filetolink], :immediately
end
link filetolink do
to file
notifies :run, 'bash[deploy-custom-docker-container]', :immediately
end
bash 'deploy-custom-docker-container' do
code <<-EO
#{CMD} restart
EO
action :nothing
end
Dies funktioniert für mich jetzt.
Die alte Anwendung Kochbuch, das Sie verwenden, derjenige, der auf Chef arbeitet 11, war überhaupt nicht aufpassen, wie sie setzen die '' aktualisiert Fahnen?. Dies ist ein Teil davon, warum es vor etwa 6 Monaten komplett neu geschrieben wurde. – coderanger