Slide 1

Slide 1 text

Chef LWRP @kentaro

Slide 2

Slide 2 text

@kentaro Software engineer Rubyist / Perl Monger Puppet Lover Kentaro Kuribayashi paperboy&co.

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

͓͞Β͍

Slide 5

Slide 5 text

γεςϜͷ͋Δ΂͖ঢ়ଶΛهड़ ͢ΔͨΊͷύʔπɻͨͱ͑͹ wpackageΠϯετʔϧ͞Ε͍ͯΔ΂ ͖ύοέʔδ wfile഑ஔ͞Ε͍ͯΔ΂͖ϑΝΠϧ wserviceಈ͍͍ͯΔ΂͖αʔϏε Resourceͱ͸

Slide 6

Slide 6 text

γεςϜΛऩଋ͢Δ࣮ࡍͷํ๏ Λఏڙ͢Δɻͨͱ͑͹package Ϧιʔεʹ͸ҎԼ͕͋Δ w apt w yum w portage w etc. Providerͱ͸

Slide 7

Slide 7 text

ಠࣗϦιʔεͷఆٛ

Slide 8

Slide 8 text

plenv_install "5.16.3" do user "kentaro" install_options "-Dusethreads" end ͜͏͍͏͜ͱΛ͍ͨ͠

Slide 9

Slide 9 text

• Definition • LWRP • LightWeight Resources and Providers

Slide 10

Slide 10 text

Definition

Slide 11

Slide 11 text

wؔ਺Έ͍ͨͳײ͡ͰಠࣗͷϦ ιʔεΛఆٛͰ͖Δ wಉ͡Α͏ͳॲཧΛ΍͍ͬͯΔ ͳͱࢥͬͨΒɺ͜ΕͰ؆୯ʹڞ ௨ԽͰ͖ΔͷͰศར wdefinitions/ҎԼʹεΫϦϓτ Λॻ͚ͩ͘

Slide 12

Slide 12 text

cpanm 'Path::Tiny' do force true end @naoyaஶʰೖ໳Chef SoloʱΑΓ ͜Μͳײ͡ʹ࢖͏΋ͷΛʜ

Slide 13

Slide 13 text

define :cpanm, :force => nil do bash "install-#{params[:name]}" do user node['user']['name'] cwd node['user']['home'] environment "HOME" => node['user']['home'] if params[:force] code <<-EOC source ~/perl5/perlbrew/etc/bashrc cpanm --force #{params[:name]} EOC else code <<-EOC source ~/perl5/perlbrew/etc/bashrc cpanm #{params[:name]} EOC end not_if <<-EOC, :user => node['user']['name'], :environment => { 'HOME' => node['user']['home'] } source ~/perl5/perlbrew/etc/bashrc && perl -m#{params[:name]} -e '' EOC end end @naoyaஶʰೖ໳Chef SoloʱΑΓ ͜͏ॻ͚Δ

Slide 14

Slide 14 text

wProvider͕ผΕͯͳ͍ͷͰɺ େ͖ͳن໛ʹͳΔͱͪ͝Όͬͱ ͳΔɻҰൠԽ͕೉͍͠ɻ wόϦσʔγϣϯΛࣗ෼Ͱ͕Μ ͹Βͳ͍ͱͳΒͳ͍ wႈ౳ੑ͸ࣗ෼Ͱ୲อ͢Δ ͜Ε ͸LWRPͷ৔߹΋ಉ͡ ɻ

Slide 15

Slide 15 text

LWRP

Slide 16

Slide 16 text

wಠࣗͷresourceͱproviderΛ ఆٛ͢ΔͨΊͷDSL wΑΓҰൠతͳఆٛΛ͍ͨ͠৔ ߹ʹ࢖͏ wύϥϝλͷόϦσʔγϣϯͷ ࢓૊Έ΋ఏڙ͞Ε͍ͯΔ

Slide 17

Slide 17 text

• example/resources/*.rb • example/providers/*.rb

Slide 18

Slide 18 text

ϑΝΠϧ໊ ରԠ͢Δ໊લ Resource Provider default.rb example Chef::Resource::E xample Chef::Provider::E xample custom.rb example_custom Chef::Resource::E xampleCustom Chef::Provider::E xampleCustom http://docs.opscode.com/essentials_cookbook_lwrp_file_locations.html

Slide 19

Slide 19 text

plenv_install "5.16.3" do user "kentaro" install_options "-Dusethreads" end https://github.com/kentaro/chef-plenv

Slide 20

Slide 20 text

actions :install, :uninstall default_action :install attribute :version, :kind_of => String, :name_attribute => true attribute :user, :kind_of => String attribute :install_options, :kind_of => String resouces/install.rb https://github.com/kentaro/chef-plenv/blob/master/resources/install.rb

Slide 21

Slide 21 text

• :default • :kind_of • :required • :regex • :equal_to • :name_attribute • :callbacks • :respond_to όϦσʔγϣϯ http://docs.opscode.com/essentials_cookbook_lwrp_resources_syntax.html#attributes-and-validation-parameters

Slide 22

Slide 22 text

action :install do converge_by("Install perl version #{new_resource.name} using plenv") do bash "plenv install #{new_resource.name}" do user new_resource.user environment "HOME" => "#{node["plenv"]["user_home_root"]}/ #{new_resource.user}" path ["#{node["plenv"]["user_home_root"]}/ #{new_resource.user}/.plenv/bin"] # `path` option seems to not work correctly... code <<-COMMAND #{node["plenv"]["user_home_root"]}/#{new_resource.user}/.plenv/bin/plenv install #{new_resource.name} #{new_resource.install_options} COMMAND not_if { Dir.exists?("#{node["plenv"]["user_home_root"]}/ #{new_resource.user}/.plenv/versions/#{new_resource.name}") } end end end providers/install.rb https://github.com/kentaro/chef-plenv/blob/master/providers/install.rb

Slide 23

Slide 23 text

Why-run

Slide 24

Slide 24 text

w͍ΘΏΔdry-runΦϓγϣϯ w10.14.0͔Βಋೖ͞Εͨ A key part of why-run is that it tells you why it makes the decision that it did, so you can reason about the current and proposed state of your system, hence the name. http://www.opscode.com/blog/2012/09/07/chef-10-14-0-released/

Slide 25

Slide 25 text

action :install do converge_by("install foo bar") do # ͜͜ʹɺ࣮ࡍʹγεςϜʹӨڹΛ༩͑ΔॲཧΛॻ͘ end end def whyrun_supported? true end Why-runʹରԠ͢Δ

Slide 26

Slide 26 text

w Why-runͷ࣮ߦ୯Ґ͸ɺresouceʹඥͮ͘ provider w ͳͷͰɺطଘͷresouceΛ࢖Θͳ͍ಠࣗͷ providerΛॻ͘ શ෦RubyͷίʔυͰ͕Μ͹Δͱ ͔ ৔߹͸ରԠ͓ͯ͘͠ํ͕͍͍ ͱ͍͏͔͢Δ΂ ͖ wChef͕ఏڙ͢ΔresourceΛ࢖ͬͯΔݶΓ͸ɺ ͦΕʹରԠ͢Δprovider͕ඞͣWhy-runରԠͯ͠ ͍ΔͷͰɺͳʹ΋͠ͳͯ͘΋࠷ऴతʹ͸Why-run ରԠ͍ͯ͠Δ͜ͱʹͳΔ wෳࡶͳͷͰઆ໌͕೉͍͠

Slide 27

Slide 27 text

·ͱΊ

Slide 28

Slide 28 text

wಠࣗͷϦιʔεΛఆٛ͢Δ࢓૊Έ ͱͯ͠DefinitionͱLWRPͱ͕͋Δ w؆୯ͳ΋ͷ͸DefinitionͰΑ͍ ͕ɺΑΓෳࡶͩͬͨΓҰൠతͩͬͨ Γ͢Δ΋ͷɺ͋Δ͍͸طଘͷ resouceΛ࢖Θͳ͍ಠࣗͷprovider Λ࡞Γ͍ͨ৔߹͸LWRP wόϦσʔγϣϯ΋͍͍ײ͡ʹՄೳ