Slide 1

Slide 1 text

MItamae Hacking Guide Roppongi.rb #2 @k0kubun

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ • 1. Itamaeͱ͸ • 2. Itamae Goͱ͸ • 3. MItamaeͷ͝঺հ

Slide 4

Slide 4 text

1. Itamaeͱ͸

Slide 5

Slide 5 text

Itamaeͱ͸ • https://github.com/itamae-kitchen/itamae • ChefϥΠΫͳߏ੒؅ཧπʔϧ • αʔόʔͷߏ੒ΛRuby DSLͰهड़͢Δ

Slide 6

Slide 6 text

Itamae DSL package 'nginx' do action :install end service 'nginx' do action [:enable, :start] end

Slide 7

Slide 7 text

ItamaeΛ࢖͏ͱԿ͕خ͍͠ͷ͔ • Puppet, Ansibleͱҧ͍ઃఆϑΝΠϧ͕Ruby • มͳDSLͱ͔YAMLΑΓRubyΛಡΉɾॻ͘ํָ͕͍͠ • Chefʹൺ΂ͯγϯϓϧͳπʔϧͳͷͰอक͕͠΍͍͢ • Chefʹൺ΂ίʔυϕʔε͕খ͘͞ɺ͙͢ʹ࢓૊ΈΛ೺Ѳ Ͱ͖Δ • Berkshelfͷ͔ΘΓʹrubygemsΛ࢖͏

Slide 8

Slide 8 text

ΫοΫύουʹ͓͚ΔItamae • αʔόʔͷߏ੒؅ཧʹ࢖ΘΕ͍ͯΔ • ݹ͍΋ͷ͸Puppet͕ͩItamaeʹҠߦத • ৽͍͠αʔόʔ͸جຊతʹItamaeͰ؅ཧ͞Ε͍ͯΔ • ͨͩ͠AppαʔόʔͳͲঢ়ଶΛ࣋ͨͳ͍΋ͷ͸Docker • ։ൃऀͷϚγϯͷηοτΞοϓʹ࢖ΘΕΔʮ༧ఆʯ • RubyͰॻ͔Εͨ಺੡πʔϧ͔ΒItamaeϕʔεͷ΋ͷʹҠߦத

Slide 9

Slide 9 text

Itamaeͷӡ༻Ͱൃੜͨ͠՝୊ • Itamaeͷ࣮ߦͷͨΊʹrubyΛηοτΞοϓ͠ͳ͚Ε͹ͳͳ͍ • itamae ssh(sshܦ༝ͷద༻)͕஗͍ͷͰαʔόʔଆʹItamaeΛೖΕ࣮ͯߦ͢ Δ • ։ൃ؀ڥͷηοτΞοϓʹ͓͍ͯɺLinuxͩͱruby͕ೖͬͯͳ͍͜ͱ͕͋Δ • ItamaeͷͨΊ͚ͩʹrubyͷ؀ڥҰࣜΛύοέʔδϯά͢Δͷ͸໘౗ͩ͠ɺ͔ ͱ͍ͬͯී௨ʹ࢖͏rubyͷ؀ڥ΋Ԛͨ͘͠ͳ͍ • ύοέʔδ͸طʹ͋Δ΋ͷͷɺ࠷ॳ͔ΒγϯάϧόΠφϦͰ࡞ΒΕͨ Itamae͕͋Δͱखܰͦ͏

Slide 10

Slide 10 text

2. Itamae Goͱ͸

Slide 11

Slide 11 text

Itamae Go • https://github.com/k0kubun/itamae-go • GolangͰγϯάϧόΠφϦItamaeΛ࡞ͬͨ

Slide 12

Slide 12 text

࡞ͬͨಈػ

Slide 13

Slide 13 text

Itamae Goͷ࢓૊Έ • mrubyͷVMΛ mitchellh/go-mruby Ͱ૊ΈࠐΜͰ͍Δ • mrubyͷΦϒδΣΫτΛҾ਺ʹGoͷstructΛ࡞ΔGoͷؔ ਺Λmrubyͷϝιουͱͯ͠ఆٛͨ͠ΫϥεΛ࡞Γɺͦ ͷΫϥε্ͰItamaeϨγϐΛinstance_eval • ͜Ε͕ItamaeͷDSLʹͳΔ • ࡞ΒΕͨGoͷstructΛݟͯGoͷؔ਺ͰΦϖϨʔγϣϯ

Slide 14

Slide 14 text

Itamae Goͷϝϯςਏ͍ • GoͷίʔυͰRubyͷϝιουΛఆ͍ٛͯ͘͠ ͷ͕͔ͳΓ໘౗ • SpecinfraΛGoͰ࠶࣮૷͢Δͷେม • libmruby.aΛϦϯΫ͠ͳ͕ΒCGOόΠϯσΟϯ άͷΫϩείϯύΠϧ͢Δͷଟ෼ී௨ʹͰ͖Δ ͚Ͳ໘౗

Slide 15

Slide 15 text

go-mrubyͷ࣮༻ྫͱͯ͠͸໘ന͍͕… • ͦ΋ͦ΋GoΛ࢖͏ඞཁ͋Δͷ͔ʁ • ผʹGo͡Όͳ͍ͱ࢖͑ͳ͍ϥΠϒϥϦͱ͔ݴޠػೳΛ࢖ͬͯ ͳ͍ • mruby-cliͱ͍͏ɺRubyΛධՁͰ͖ΔγϯάϧόΠφϦΛ࡞Δผ ͷιϦϡʔγϣϯ͕͋ͬͨ • ͍ͯ͏͔ͿͬͪΌ͚ڈ೥ͷRubyConfͰ஌͚ͬͯͨͲPokemon Goʹ͔͚ͨํ͕ྲྀߦΔͱࢥ͍ͬͯͭ΍ͬͯ͠·ͬͨ

Slide 16

Slide 16 text

3. MItamaeͷ͝঺հ

Slide 17

Slide 17 text

MItamae • https://github.com/k0kubun/mitamae • mruby-cliΛ࢖ͬͨItamaeͷpure mruby࣮૷ • ʮݟڅ͑ʯʁ • ΤϜ(mruby)ɾΠλϚΤͰ͢

Slide 18

Slide 18 text

mruby-cliͱ͸ • https://github.com/hone/mruby-cli • mrubyͰγϯάϧόΠφϦΛ࡞ΔͨΊͷϘΠϥʔϓϨʔτ • ίϚϯυϥΠϯҾ਺ΛmrubyͷArrayʹม׵͠ɺmrubyͰఆٛ͞Εͨ __main__ Λݺͼग़͢Cݴޠͷmainؔ਺ • ͜ͷ __main__ ͷ࣮૷͚ͩ͢Ε͹ྑ͍ͷͰɺRubyҎ֎Λॻ͔ͣʹࡁΉ • macOS, Windows޲͚ʹΫϩείϯύΠϧ͢ΔͨΊͷ؀ڥΛ࣋ͭ Dockerfile • ࣮ମ: https://github.com/hone/mruby-cli-docker

Slide 19

Slide 19 text

MItamae: ΅͕͔͘Μ͕͍͖͑ͨ͞ΐ͏ͷItamae • ruby΍gemʹґଘ͠ͳ͍ͨΊɺόΠφϦΛμ΢ϯϩʔυ͢Δ͚ͩͰଈ࣮ߦՄೳ • CRubyΛ࢖͏৔߹ͱҧͬͯίϯύΠϧࡁͳͷͰɺىಈ͕ߴ଎ • ιʔείʔυΛύʔεͯ͠YARV iseqʹίϯύΠϧ͢Δ·Ͱͷίετ͕ͳ͍ • 2.5GHz Intel Core i7Ͱɺitamae: 499ms, mitamae: 23ms (21.7ഒ଎) • itamae sshΛαϙʔτ͍ͯ͠ͳ͍ͷͰɺSpecinfra(ඞͣԿΒ͔ͷίϚϯυΛ࢖͏) ͷ͔ΘΓʹී௨ʹCͷؔ਺Λ࢖͏͜ͱͰߴ଎Խ͕Մೳ • Ͳ͏ͤitamae ssh͸஗͍ͷͰɺαʔόʔ΁ͷItamaeͷॳճΠϯετʔϧͱ͔ʹ ͔͠࢖Θͳ͍͠ɺ΍Δʹͯ͠΋ผͷπʔϧʹͯ͠Αͦ͞͏

Slide 20

Slide 20 text

MItamaeͷεςʔλε • େମͷػೳ͸͋Δ • https://github.com/k0kubun/mitamae#supported-features • fileͷedit, host inventory, verify, subscribes(notifies͸͋Δ)͕ͳ͍ • remote_directory, http_request, local_ruby_block ͕ͳ͍ • Arch Linux, CentOS, Debian, Gentoo, macOS, UbuntuΛαϙʔτ • ItamaeຊՈͷ݁߹ςετ͕େମ௨Δ • Travis্ͰDockerίϯςφʹapplyͯ͠ServerspecͰςετͯ͠Δ

Slide 21

Slide 21 text

Itamae 2ʁ • ҿΈձͰryotarai͞Μ(Itamae࡞ऀ)͕itamae- mruby(MItamaeͷ౰࣌ͷ໊લ)ΛItamae 2ʹ͢Δͬͯ ݴͬͯͨ • ͱΓ͋͑ͣػೳ͕ἧͬͯར༻࣮੷΋૿͑Δඞཁ͕͋Γ ͦ͏ • ͳͷͰɺ͓͢͢Ίͷ༻్ͱɺMItamaeͷ಺෦ઃܭ΍ ։ൃํ๏ʹ͍ͭͯઆ໌͠·͢

Slide 22

Slide 22 text

MItamaeͷ༻్

Slide 23

Slide 23 text

๻ͷMItamaeͷ༻్ • dotfilesͷద༻ • https://github.com/k0kubun/dotfiles • ϨγϐΛࢀߟʹ͍ͨ͠ํ͸ https://github.com/k0kubun/ legacy-dotfiles ΋Ͳ͏ͧ • ࣗ୐Ͱ΋ձࣾͰ΋σεΫτοϓϚγϯʹLinuxΛ࢖͍ͬͯΔ͕ɺ ࠷ॳͷηοτΞοϓલʹrubyΛ͍ΕΔඞཁ͕ͳͯ͘ඍົʹॿ͔Δ • ىಈ଎͍͠ɺgem install / bundle install΋ෆཁͩ͠Կ͔ͱָ

Slide 24

Slide 24 text

ΫοΫύουͰͷར༻ঢ়گ • ։ൃ؀ڥͷηοτΞοϓπʔϧΛItamaeϕʔεͷ΋ͷʹҠߦதͰɺͦ͜ʹ MItamae͕࠾༻͞Ε͍ͯΔ • αʔόʔͷߏ੒؅ཧ޲͚ʹ͸·ͩ࢖ΘΕͯͳ͍ • ࣾ಺޲͚ͷपลπʔϧ͕Itamaeͱ݁߹͍ͯͯ͠Ҡߦ͕एׯେม • ͦ΋ͦ΋Itamaeͩͱ໘౗ͳͷ͸ύοέʔδϯά͕ͩɺࣾ಺Ͱ࢖͍ͬͯΔ αʔόʔ޲͚ʹ͸طʹύοέʔδ͕͋ΔͷͰͦΕ΄ͲϞνϕʔγϣϯ͕ͳ ͍ • Ͱ΋γϯάϧόΠφϦͰΫϦʔϯ͔ͭ଎͍ͷͰ͜Ε͔Βಋೖ͢Δํʹ͸͓ ͢͢Ί

Slide 25

Slide 25 text

Inside MItamae

Slide 26

Slide 26 text

MItamaeͷ಺෦࣮૷ • جຊతʹ͸mruby-cli࢖ͬͯΔ͚ͩ • Itamae෦෼͸εΫϥον • Specinfra෦෼͸΄΅ͦͷ··͖࣋ͬͯͨ • ΋ͪΖΜAuthorsͱLICENSEදهʹmizzy͞Μ ͕͍·͢

Slide 27

Slide 27 text

MItamaeͱItamaeͷ࣮૷ͷҧ͍ • resourceͱresourceΛద༻͢Δ੹຿͕෼཭͞Ε͍ͯͯɺresource ͸ͨͩͷϞσϧʹ͗͢ͳ͍ • ryotarai͞ΜͷΞΠσΞ • ๻ͷझຯ͕ೖ͍ͬͯΔ • ͳΔ΂͘method_missingΛආ͚ϕλॻ͖͢Δ(΋͏গ͠ݮΒͤ Δ͚Ͳ)ɺͳͲ • defineͨ͠resourceʹωετͨ͠resource಺Ͱparams͕࢖͑Δ

Slide 28

Slide 28 text

defineͨ͠resourceʹωετͨ͠ resource಺Ͱparams͕࢖͑Δ ???? # Itamae ͷ৔߹ define :ruby do version = params[:name] execute "..." do not_if "... #{version}" end end ruby '2.3.1'

Slide 29

Slide 29 text

defineͨ͠resourceʹωετͨ͠ resource಺Ͱparams͕࢖͑Δ ???? # MItamaeͷ৔߹ (Itamaeͩͱparams͕ࢀরෆೳ) define :ruby do execute "..." do not_if "... #{params[:name]}" end end ruby '2.3.1'

Slide 30

Slide 30 text

Hacking MItamae

Slide 31

Slide 31 text

cloneͯ͠ίϯύΠϧ࣮ͯ͠ߦ $ git clone https://github.com/k0kubun/mitamae $ cd mitamae $ rake compile $ mruby/build/host/bin/mitamae local recipe.rb

Slide 32

Slide 32 text

ςετͷ࣮ߦ # Ϣχοτςετͷ࣮ߦ $ rake test:mtest # DockerͱServerspecΛ࢖ͬͨςετ $ rake test:integration

Slide 33

Slide 33 text

ΫϩείϯύΠϧ # mitamae-buildσΟϨΫτϦʹ࡞ΒΕΔ $ rake release:build

Slide 34

Slide 34 text

·ͱΊ • MItamae͸଎ͯ͘Πϯετʔϧ͕؆୯ͳͷͰ ࢖ͬͯཉ͍͠ • ։ൃ؀ڥ͸੔ͬͯΔͷͰMItamaeͷ։ൃʹࢀ Ճ͠Α͏!