2016-05-13 2 views
0

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.

+1

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

Antwort

2

Benachrichtigungen werden nur ausgelöst, wenn sich die Benachrichtigungsressource geändert hat (und andersherum werden Abonnements nur ausgelöst, wenn sich die abonnierte Ressource geändert hat).

Der Grund dafür, dass der bash-Block unabhängig von der Benachrichtigung ausgeführt wird, besteht darin, dass standardmäßig bash-Blöcke ausgeführt werden. Wenn Sie möchten, dass eine Ressource nur bei einer Benachrichtigung ausgeführt wird, stellen Sie sicher, dass sie action :nothing enthält.

dh:

bash 'deploy-custom-docker-container' do 
    code <<-EO 
    #{CMD} restart 
    EO 

    action :nothing 
    subscribes :run, 'application[%s]' % [app[:name]] 
end 
+0

Danke @zts. Ich habe den Beitrag aktualisiert, um zu zeigen, wie ich den Code umstrukturiert habe. – Jim

Verwandte Themen