2013-04-19 11 views
5

Tworzę grupę różnych dostawców Chef, aby wdrożyć różne typy aplikacji. Dokumentacja szefa kuchni dla Extend a Lightweight Provider sugeruje, że jest to możliwe, ale tak naprawdę nie mówi, co robić. Ta strona sugeruje, że być może potrzebne jest połączenie z mixin, ale nie wiem, jaką strukturę powinien mieć mój kod w pliku pod numerem /libraries lub jak faktycznie włączyć ten kod do czegoś pod numerem /providers.Jak rozszerzyć lekkiego dostawcę w Chef

Oto przykłady tego, co chcę zrobić.

W mojej klasie bazowej pod /libraries:

repository "http://my.svn.server/#{deployment[:project]}/branches/#{node[:chef_environment]}/" 
user "deploy" 
scm_provider Chef::Provider::Subversion 
svn_username "svn_user" 
svn_password "password" 

W moim dostawcy aplikacji Rails dla Torquebox wdrożeń:

deploy_revision "/my/deployment/directory/#{deployment[:project]}" do 
    # Magically mixin the code from libraries 
    environment "RAILS_ENV" => node[:chef_environment] 
    restart_command "rake torquebox:deploy" 
end 

a potem oczywiście inne typy dostawców dla różnych typów aplikacji.

Czy ktoś może wskazać mi właściwy kierunek? Czy gdzieś brakuje mojej dokumentacji?

Odpowiedz

7

Szef kuchni wykona w czasie pracy automatically convert the LWRP DSL into a full-blown Ruby class. Jest to określone przez nazwę książki kucharskiej, po której następuje nazwa pliku (w ten sam sposób tworzona jest rzeczywista nazwa zasobu).

Więc jeśli masz książkę kucharską o nazwie bacon i LWRP w bacon/resources/eat.rb, powiązany LWRP to bacon_eat. Związana z tym klasa jest wielopiętrową, stałą wersją tego - Chef::Resource::BaconEat i Chef::Provider::BaconEat w tym przypadku.

Jest jeden wyjątek od tego wzoru - default. "Domyślne" jest szczególne w kraju Chef, ponieważ nie otrzymuje przedrostka. Więc jeśli masz książkę kucharską o nazwie bacon i LWRP w bacon/resources/default.rb, powiązana LWRP to bacon (nie bacon_default). Związana z tym klasa jest wielopiętrową, stałą wersją tego - Chef::Resource::Bacon i Chef::Provider::Bacon (nie "BaconDefault") w tym przypadku.

Dobra, więc po co ta historia? Aby rozszerzyć LWRP, chcesz dziedziczyć z klasy LWRP (Rubyism). Więc w katalogu libraries/, chcesz przedłużyć swój własny zasób:

class Chef 
    class Resource::MyResource < Resource::Bacon # <- this 
    end 
end 

więc, w przykładzie:

class Chef 
    class Resource::MyDeployRevision < Resource::DeployRevision 
    def initialize(name, run_context = nil) 
     super 

     # This is what you'll use in the recipe DSL 
     @resource_name = :my_deploy_revision 

     # Things like default action and parameters are inherited from the parent 

     # Set your default options here 
     @repository = "http://my.svn.server/#{node['deployment']['project']}/branches/#{node.chef_environment}/" 
     @user = 'deploy' 
     @scm_provider = Chef::Provider::Subversion 
     @svn_username = 'svn_user' 
     @svn_password = 'password' 
    end 
    end 
end 

Następnie użyj my_deploy_revision w receptur.

+1

Awesome, dziękuję za napisanie. Spróbuję zrobić trochę czasu, aby ponownie odwiedzić restaurację Chef-land wkrótce i wypróbować to. –

+0

@sethvargo tutaj odpowiedź wydaje się być w konflikcie z inną z twoich odpowiedzi na temat [rozszerzania LWRP] (http://stackoverflow.com/a/21152840/1995977), gdzie powiedziałeś, że dość trudno jest rozszerzyć LWRP. Czy możesz to wyjaśnić? Jestem bardzo zainteresowany robieniem tego z LWRP 'simple_iptables' ... –

+1

Trudne! = Niemożliwe ... – sethvargo

Powiązane problemy