2013-05-07 17 views
6

Ecco un esempio di una ricetta funzionante che scorre attraverso una serie di nomi di siti Web e li crea in IIS utilizzando la funzione createIisWebsite().Come si modularizza una ricetta dello Chef?

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 
Nella nostra soluzione reale questi dati vengono memorizzati altrove e accessibili tramite un'API Web.
websiteNames = ["website-2", "website-3", "website-4"] 

for websiteName in websiteNames do 
    createIisWebsite websiteName 
end 

Ora voglio essere in grado di chiamare la funzione createIisWebsite() da più ricette all'interno di questo ricettario.

Ho provato a lanciarlo in un modulo di supporto (libreria). Non riesco a ottenere il riferimento a iis_site per funzionare.

Ho provato a spostare la funzione su default.rb e quindi su include_recipe ":: default". Neanche sembra funzionare.

ottengo un "Impossibile trovare una risorsa per createIisWebsite sulla versione di Windows 6.2.9200"

La ragione per cui mi sto prendendo questo approccio è perché voglio avere una ricetta che contiene l'elenco dei siti web per cluster di server web . Ho la sensazione che non sto seguendo il percorso delle migliori pratiche.

Qualche idea?

+0

Ohai! Hai mai trovato una soluzione a questo problema? Qualcuna delle risposte è stata di aiuto? Si prega di non dimenticare di contrassegnare uno come corretto :) – sethvargo

risposta

5

Il problema è che la funzione viene definita all'interno di una ricetta e può essere utilizzata solo all'interno di quella ricetta. Il metodo include_recipe garantisce che una determinata ricetta sia caricata, ma non importa nulla nella ricetta che fa l'inclusione.

Poiché la funzione viene utilizzata per dichiarare una risorsa Chef con alcuni parametri calcolati, la cosa più vicina da guardare è lo Definition (Chef Docs). Le definizioni sono simili alle risorse, con un nome e un set di parametri facoltativi, ma sono in realtà semplici macro che vengono espanse nella ricetta quando viene compilata.

Nella directory libro di cucina, creare definitions/my_iis_website.rb contenente qualcosa come:

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 

Poi, sostituire il loop nella vostra ricetta con:

for websiteName in websiteNames do 
    my_iis_website websiteName 
end 

Se le ricette per ogni cluster di server potrebbe essere identico ma per l'elenco dei siti, potresti prendere in considerazione la possibilità di archiviare questi dati in attributes o data bags. Questo ti aiuta a evitare di ripeterti nelle tue ricette e ti permetterà anche di aggiungere siti senza aggiornare il tuo ricettario.

+4

Naturalmente si potrebbe anche verificare e creare un LWRP. C'è stata una discussione sulla rimozione di definizioni dallo chef nella mailing list dello chef. –

+0

Diversi segmenti della comunità dello chef hanno opinioni diverse sull'uso dello Chef. Mentre il valore di Definizioni (e ruoli) è stato discusso sulla mailing list più di una volta, non sono a conoscenza di piani per rimuovere entrambi. Se capita diversamente, per favore fatemelo sapere! – zts

+0

Grazie, darà una possibilità. Per far funzionare le cose ho appena lasciato la funzione nella ricetta. E sì, l'elenco del sito web è da qualche altra parte disponibile tramite una web API piuttosto che una borsa dati come gli altri sistemi devono accedere e l'API web di Chef non ha una lib di client .Net e l'auth sembrava un po 'su misura. – Janaka

Problemi correlati