2013-05-07 4 views
6

Hier ist ein Beispiel für ein Arbeitsrezept, das eine Reihe von Website-Namen durchläuft und sie in IIS mit der Funktion createIisWebsite() erstellt.Wie modularisieren Sie ein Chefrezept?

def createIisWebsite(websiteName) 
    iis_site websiteName do 
    protocol :http 
    port 80 
    path "#{node['iis']['docroot']}/#{websiteName}" 
    host_header "#{websiteName}.test.kermit.a-aws.co.uk" 
    action [:add,:start] 
    end 
end 
In unserer aktuellen Lösung werden diese Daten an anderer Stelle gespeichert und über eine Web-API abgerufen.

Jetzt möchte ich die Funktion createIisWebsite() aus mehreren Rezepten innerhalb dieses Kochbuchs aufrufen können.

Ich habe versucht, es in ein Hilfsmodul (Bibliothek) zu werfen. Dort kann ich nicht den Verweis auf iis_site zum Arbeiten bekommen.

Ich habe versucht, die Funktion auf default.rb zu verschieben und dann Include_recipe ":: default". Das scheint auch nicht zu funktionieren.

ich eine „Kann nicht eine Ressource für createIisWebsite auf Windows-Version finden 6.2.9200“

Der Grund, warum ich diesen Ansatz nehme, weil ich ein Rezept enthält die Liste der Websites pro Cluster von Web-Servern haben möchten . Ich habe das Gefühl, dass ich nicht die Best-Practice-Route nehme.

Irgendwelche Ideen?

+0

Ohai! Haben Sie jemals eine Lösung für dieses Problem gefunden? Hat eine der Antworten geholfen? Bitte vergiss nicht, einen als korrekt zu markieren :) – sethvargo

Antwort

5

Das Problem ist, dass die Funktion innerhalb eines Rezepts definiert wird und nur in diesem Rezept verwendet werden kann. Die Methode include_recipe stellt sicher, dass ein bestimmtes Rezept geladen wird, importiert jedoch nichts in das Rezept, das das Einschließen durchführt.

Da Ihre Funktion verwendet wird, um eine Chef-Ressource mit einigen berechneten Parametern zu deklarieren, ist die nächste Sache die Definition (Chef Docs). Definitionen ähneln Ressourcen, haben einen Namen und eine Reihe von optionalen Parametern, sind jedoch einfache Makros, die beim Kompilieren in das Rezept expandiert werden.

in Ihrem Kochbuch-Verzeichnis erstellen definitions/my_iis_website.rb enthält so etwas wie:

define :my_iis_website do 
    iis_site websiteName do 
     protocol :http 
     port 80 
     path "#{node['iis']['docroot']}/#{websiteName}" 
     host_header "#{websiteName}.test.kermit.a-aws.co.uk" 
     action [:add,:start] 
    end 
end 

Dann mit der Schleife in Ihrem Rezept ersetzen:

for websiteName in websiteNames do 
    my_iis_website websiteName 
end 

Wenn für jeden Cluster von Server Ihre Rezepte identisch sein würde aber für die Liste der Websites möchten Sie vielleicht in Erwägung ziehen, diese Daten stattdessen in attributes oder data bags zu speichern. Auf diese Weise vermeiden Sie, sich in Ihren Rezepten zu wiederholen, und Sie können Websites hinzufügen, ohne Ihr Kochbuch zu aktualisieren.

+4

Natürlich könntest du auch einen LWRP auschecken und erstellen. Es gab eine Diskussion über das Entfernen von Definitionen vom Chef auf der Koch-Mailing-Liste. –

+0

Verschiedene Segmente der Chef-Community haben unterschiedliche Meinungen über die Verwendung von Chefkoch. Während der Wert von Definitionen (und Rollen) mehr als einmal in der Mailingliste diskutiert wurde, sind mir keine Pläne bekannt, diese zu entfernen. Wenn Sie etwas anderes wissen, lassen Sie es mich wissen! – zts

+0

Danke, wird dies eine Chance geben. Damit die Dinge funktionieren, habe ich die Funktion im Rezept verlassen. Und ja, die Liste der Website ist irgendwo anders verfügbar über eine Web-API als eine Datensammlung, wie andere Systeme zugreifen müssen und die Chef-Web-API hat keine. NET-Client-Bibliothek und die Auth schien etwas maßgeschneidert. – Janaka

Verwandte Themen