2013-05-07 2 views
6

は、ウェブサイト名の配列をループし、機能createIisWebsiteを(使用してIISでそれらを作成する作業レシピ)の一例です。シェフレシピをどのようにモジュール化していますか?ここ

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 
実際の解決策では、このデータは別の場所に保存され、Web APIを介してアクセスされます。
websiteNames = ["website-2", "website-3", "website-4"] 

for websiteName in websiteNames do 
    createIisWebsite websiteName 
end 

今、このクックブック内の複数のレシピからcreateIisWebsite()関数を呼び出せます。

私はヘルパーモジュール(ライブラリ)にそれを投げて試してみました。そこでは、iis_siteへの参照を機能させることができません。

私はdefault.rbに関数を移動して、「::デフォルトの」include_recipeをやって試してみました。それはどちらもうまくいかないようです。

私はWebサーバのクラスタあたりWebサイトのリストを含むレシピを持っていると思いますので、私はこのアプローチを取っている理由がある

を「Windowsのバージョン6.2.9200にcreateIisWebsiteのためのリソースを見つけることができません」を取得

。私はベストプラクティスのルートを取っていないと感じる。

アイデア?

+0

Ohai!あなたはこの問題の解決法を見つけましたか?答えのどれが助けになりましたか?正しいものとしてマークすることを忘れないでください:) – sethvargo

答えて

5

問題は、関数は、レシピ内で定義されていることであり、そしてそのレシピ内でのみ使用することができます。 include_recipeメソッドは、与えられたレシピがロードされることを保証しますが、レシピをレシピにインポートすることはありません。

あなたの関数は、いくつかの計算されたパラメータを持つシェフのリソースを宣言するために使用されているので、見て最も近いものはDefinition (Chef Docs)です。定義は名前とオプションパラメータのセットを持つリソースと似ていますが、コンパイル時にレシピに展開される実際のシンプルなマクロです。あなたの料理のディレクトリで

、のようなもの含むdefinitions/my_iis_website.rbを作成します。次に

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 

を、とあなたのレシピでループを置き換える:サーバーの各クラスタのためのあなたのレシピが同一である場合

for websiteName in websiteNames do 
    my_iis_website websiteName 
end 

サイトのリストについては、代わりにattributesまたはdata bagsにこのデータを保存することを検討してください。これはあなたのレシピで自分自身を繰り返すことを避けるのに役立ちます、また、あなたはあなたの料理本を更新せずにサイトを追加することができます。

+4

もちろん、LWRPをチェックアウトして作成することもできます。シェフメーリングリストのシェフから定義を削除することについての議論がありました。 –

+0

シェフのコミュニティのさまざまな部分は、シェフの使用について異なる意見を持っています。定義(とロール)の価値はメーリングリストで複数回議論されていますが、私はどちらかを削除する予定はないと考えています。あなたが他のことを知っている場合、私に知らせてください! – zts

+0

ありがとう、これはショットを与えるでしょう。物事を働かせるために、私はレシピに関数を残しました。 はい、ウェブサイトのリストは、他のシステムがアクセスする必要があるデータバッグではなく、Web API経由で利用できるほか、Chef Web APIには.Netクライアントのlibがなく、authはやや特注のようです。 – Janaka

関連する問題