2017-04-19 4 views
0

Ich habe eine benutzerdefinierte Ressource geschrieben sshd_allow_groups, dass es Aktionen einige der Attribute des Knotens ändern, und diese werden bei der Erstellung der verwendet Vorlage für /etc/sshd_config im Standardrezept (in dem die benutzerdefinierte Ressource gehostet wird). Da die benutzerdefinierte Ressource normalerweise von anderen Kochbüchern aus aufgerufen wird, kann ich jedoch nicht garantieren, dass die Vorlagenressource aufgerufen wird, nachdem die Änderungen an den Attributen vorgenommen wurden, wodurch eine Situation entsteht, in der zwei Kochdurchläufe benötigt werden gewünschte Änderung.CHEF: Richten Sie eine Ressource einmal am Ende auf einen Aufruf einer anderen (benutzerdefinierten) Ressource

Ich bin auf der Suche nach einer Möglichkeit zum Auslösen der Vorlage Ressource nach dem Aufruf der Ressource und am Ende ausgeführt werden (falls die Ressource mehrmals aufgerufen wird). notifies funktioniert nicht, weil die Aktion für die Vorlage nicht :nothing ist, noch sollte es sein, denn wenn für einen bestimmten Knoten diese Ressource nicht benötigt wird, muss die Vorlage noch geschrieben werden.

meine benutzerdefinierte Ressource:

sshd_allow_groups "bob" do 
    action :append 
end 
+0

Benachrichtigen Sie einfach verzögert von Ihrem benutzerdefinierten Ressourcenaufruf, wird es die Vorlage zweimal schließlich rendern, aber immer noch die richtige Datei am Ende. Das heißt, benutze kein normales Level, wenn du nicht genau weißt, was du tust, oder du wirst Überraschungen bekommen, wenn du jemanden aus der Gruppe entfernen willst. Alles in allem klingt das nach einem [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), wo Sie nach einer Lösung für eine nicht effektive Lösung fragen dein echtes Problem. – Tensibai

+0

Das 'notifies' hat nicht funktioniert (ich dachte irgendwann, dass ich dies verwenden muss, um zu beheben: http://StackOverflow.com/questions/21176576/how-to-i-get-a-chef-custom-lwrp- zu implementieren-benachrichtigt-und-nicht-wenn). Was ich wirklich will, ist, dass ich überhaupt nichts "benachrichtigen" muss, so dass die Ressource selbst sich darum kümmert (ein mehr DRY-Code).Und warum ist das Ihrer Meinung nach ein XY-Problem? Was denkst du ist mein X? –

+0

Soweit ich das beurteilen kann, möchten Sie die sshd_config-Datei verwalten. Sie teilen dies zwischen einer benutzerdefinierten Ressource auf, um Attribute zu aktualisieren, und einer Vorlage woanders. Wenn das Ziel darin besteht, die Attributaktualisierung zu erleichtern, dann gehen Sie zu einer Hilfsbibliothek, die für jedes Kochbuch zur Kompilierzeit verfügbar ist konvergiere das tatsächliche Problem, bei dem Attribute zu spät berechnet werden. – Tensibai

Antwort

0

in Ihrem Kochbuch Bibliothek Verzeichnis, in einer helpers.rb Datei (doc und ein blog post):

resource_name :sshd_allow_groups 
property :group, String, name_property: true 

default_action :append 

action :append do 
    currently = node['tom-ssh']['allow_groups'] 
    if currently 
    if !currently.include?(group) 
     node.normal['tom-ssh']['allow_groups'] = currently | [group] 
    end 
    else 
    node.normal['tom-ssh']['allow_groups'] = [group] 
    end 
end 

action :remove do 
    currently = node['tom-ssh']['allow_groups'] 
    if currently && currently.include?(group) 
    node.normal['tom-ssh']['allow_groups'] = currently - [group] 
    end 
end 

ein weiteres Rezept es so nennen sollte

module Sshd_allow_groups 
    module Helpers 
    def append(group) 
     node.normal['tom-ssh']['allow_groups'] = node['tom-ssh']['allow_groups'] | [group] 
    end 

    def remove(group) 
     node.normal['tom-ssh']['allow_groups'] = node['tom-ssh']['allow_groups'] - [group] 
    end 
    end 
end 

In Ihrem Rezept nennen Sie es:

Sshd_allow_group::Helpers.append("new_group") 

Oder wenn Ihr absolut sicher sind (und eine solche sollten die Methoden umbenennen) Sie können Ihre Helfer Methoden in das Rezept DSL umfassen:

::Chef::Recipe.send(:include, sshd_allow_groups::Helpers) 

ich ein wenig Code wie ich vereinfacht habe Fühlen Sie die zusätzlichen Überprüfungen nicht notwendig, Sie können immer noch eine Ausnahme auslösen, wenn das tom-ssh Attribut nicht existiert.

Ich würde versuchen, von node.normal wegzukommen, wie es auf dem Knoten bleibt, auch wenn Sie ein Rezept später eine Gruppe hinzufügen entfernen. Mehr Details zu den Attributen here

0

Kann noch nicht kommentieren so muss als Antwort schreiben .. nur ein wenig Nit, das ich beim Versuch zu folgen, Beispiele tensibai gab in Antwort. Der direkte Aufruf der Hilfsmethode funktioniert nicht mit der in Modulen definierten Hilfsmethode. Sie müssen die apphess/remove-Methodenklasseninstanzen erstellen. Fügen Sie self. vor append/remove hinzu. Dann wird dieser Aufruf arbeiten:

Sshd_allow_group::Helpers.append("new_group") 

Oder Sie können die Helfer Methoden in einer Klasse definieren Instanzmethoden zu verwenden, oder Helfer in einer Klasse.

Verwandte Themen