Slide 1

Slide 1 text

Itamae ࢖ͬͯΈͨ YOSHIKAWA Ryota (@rrreeeyyy) 1 ը૾ͷ͓ण࢘͸৽॓۠ͷ "Ეؙ" ͱ͍͏͓ళͷ෺Ͱ͢ɻඒຯ͔ͬͨ͠ ! ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 1

Slide 2

Slide 2 text

ࣗݾ঺հ 4 ٢઒ ཽଠ (Twitter: @rrreeeyyy → ) 4 ϋʔτϏʔπ(ձ৔)ͱ͍͏ձࣾͷ৽ଔͰ͢ 4 ͱݴ͍ͭͭۈଓ 4 ೥໨͙Β͍ʹͳΓ·͢2 4 ۀ຿ͷ൒෼͸ @koemu ͞Μͱಉ͡෦ॺͰࣗಈԽΞϨίϨ 4 ΋͏൒෼͸ MSP ͷۀ຿Ͱαʔόͷ؂ࢹɾ؅ཧ 2 ֶੜελοϑͱͯ͠ೖࣾͨ͠ͷ͕ 18 ࡀ (େֶ 1 ೥ੜͷ 10 ݄) ͙Β͍Ͱɺࠓ೥ֶ෦Λଔۀ͠·ͨ͠ɻ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 2

Slide 3

Slide 3 text

OSC 2014 Tokyo Fall Ͱ஻Γ·͢ 3 3 ಥવͷએ఻େมࣦྱக͠·ͨ͠ɻΑΖ͓͘͠ئ͍͠·͢ɻۓுͯ͠·͢ɻ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 3

Slide 4

Slide 4 text

͓அΓͱँࡑ ITΠϯϑϥ "ۀ຿"ࣗಈԽݱঢ়֬ೝձͳͷʹ ۀ຿Ͱ࢖͍ͬͯΔπʔϧͷ࿩Λ͠·ͤΜ 4 ۀ຿ͷ࿩͸ @koemu ઌੜʹ͓೚ͤ͠·ͨ͠(ద౰Ͱ͢ɻ͢Έ·ͤΜɻ) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 4

Slide 5

Slide 5 text

Provisioning Tools ͷ࿩ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 5

Slide 6

Slide 6 text

Provisioning Tools ݴ͑Δ͔ͳ 4 Chef 4 Ansible 4 Salticid 4 Puppet 4 SaltStack 4 : ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 6

Slide 7

Slide 7 text

Popular Chef Ansible ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 7

Slide 8

Slide 8 text

I like... Ansible ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 8

Slide 9

Slide 9 text

Why Ansible? - ΤʔδΣϯτϨεʂ - γϯϓϧʂ - ύϫϑϧʂ 5 ύϫϑϧ͸͋Μ·Γײͨ͜͡ͱແ͍Ͱ͕͢γϯϓϧͰΤʔδΣϯτϨεͳ࡞Γ͸޷͖Ͱ͢ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 9

Slide 10

Slide 10 text

and Testing tool is... ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 10

Slide 11

Slide 11 text

6 Yes, I like. (͓आΓͯ͠·͢ http://serverspec.org/images/logo.png ) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 11

Slide 12

Slide 12 text

Կ͕ى͜Δ͔ 4 Provisioning Tool 4 Ansible (Python) 4 Testing Tool 4 Serverspec (Ruby) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 12

Slide 13

Slide 13 text

! 99 ݴޠ͕౷Ұ͞Ε͓ͯΒͣɺvirtualenv, bundler ౳ͷπʔϧΛ֮͑ͨΓ ansible ίϚϯυ΍ bundle exec rake spec ౳ͷίϚϯυΛ͍֮͑ͯΔ࣌ͷإ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 13

Slide 14

Slide 14 text

Itamae 7 ը૾͸ http://bokete.jp/odai/340329 ͔Β͓आΓ͓ͯ͠Γ·͕͢ ໰୊͋Γ·ͨ͠Β͝࿈བྷԼ͍͞ɻ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 14

Slide 15

Slide 15 text

Itamae 4 https://github.com/ryotarai/itamae (@ryot_a_rai) 4 https://speakerdeck.com/ryotarai/itamae-infra-as- code-xian-zhuang-que-ren-hui 4 Infrataster ࡞ͬͯΒͬ͠ΌΔํ 4 ઌिͷ Infra as Code ݱঢ়֬ೝձͰϓϨθϯ͞Εͨ (ׂͱલ͔Β͋ͬͨͷͰউखʹ࢖ͬͯͨ) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 15

Slide 16

Slide 16 text

Կ͕͍͍ͷ 4 ΤʔδΣϯτϨε 4 γϯϓϧ 4 Ruby DSL (not YAML!) like a Chef 8 4 specinfra(serverspec ͷ core)ͷ্Ͱ੒ཱ 4 Ϩγϐ͕ gem Ͱ؅ཧͰ͖Δ (Berkshelf ཁΒͣ) 8 Not compatible. ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 16

Slide 17

Slide 17 text

Կ͕͍͍ͷ 4 ႈ౳ 4 --dry-run 4 node attributes ͸ json Ͱ؅ཧ 9 4 : 9 yaml Ͱ΋؅ཧ͍ͨ͠ؾ࣋ͪ͸͋Δ(ग़དྷΔͷ͔ͳʁ) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 17

Slide 18

Slide 18 text

ී௨ͷྫ package 'httpd' do action :install end template '/etc/httpd/httpd.conf' do source 'httpd.conf.erb' variables(maxclients: 256) end itamae execute -j node.json -h 192.168.0.1 -p 22 -u yoshikawa -i ~/.ssh/id_rsa recipe.rb ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 18

Slide 19

Slide 19 text

࣮ߦྫ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 19

Slide 20

Slide 20 text

خ͍͠ࣄ 4 Ruby DSL ͕ॻ͖΍͍͢10 4 ςετͱϓϩϏδϣχϯάͰݴޠ͕ἧ͏ 4 ྫ͑͹ Rake λεΫͰ ɹϓϩϏδϣχϯάˠςετ͕Ұؾʹग़དྷΔ 10 ݸਓͷײ૝Ͱ͢ɻ๻͸ͨ·ͨ· Ruby ͕޷͖ͳͷͰɻ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 20

Slide 21

Slide 21 text

࣮ࡍͷྫ(Properties) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 21

Slide 22

Slide 22 text

{ "db-01": { "roles": ["common", "db"], "private_key": "~/.ssh/yoshikawa-test_rsa", "ssh_port": 22, "server_id": 1 }, "web-01": { "roles": ["web", "common"], "domain": "rrreeeyyy.com" } } ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 22

Slide 23

Slide 23 text

࣮ࡍͷྫ(Rakefile) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 23

Slide 24

Slide 24 text

require 'rake' require 'json' require 'rspec/core/rake_task' properties_file = 'properties.json' properties = JSON.parse(File.read(properties_file)) properties.keys.each do |key| desc "Run provision to #{key}" namespace :itamae do desc "Run itamae to #{key}" task key.split('.')[0] do command = "bundle exec itamae ssh" command << " -h #{key}" command << " -i #{properties[key]['private_key']}" command << " -p #{properties[key]['ssh_port']}" command << " -j #{properties_file}" properties[key]['roles'].each {|role| command << " provision/#{role}/#{role}.rb"} puts command system command end end namespace :serverspec do desc "Run serverspec to #{key}" RSpec::Core::RakeTask.new(key.split('.')[0].to_sym) do |t| ENV['TARGET_HOST'] = key t.pattern = 'spec/{' + properties[key]['roles'].join(',') + '}/*_spec.rb' end end end 11 https://gist.github.com/rrreeeyyy/84efc2907814c56a2b4a ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 24

Slide 25

Slide 25 text

ݺͼग़͠ํ bundle exec rake itamae:db-01 ࣍ͷΑ͏ʹ͢ΔͱҰؾʹͰ͖Δ bundle exec rake itamae:db-01 serverspec:db-01 ※ ΋ͪΖΜ Rakefile ಺ͰҰؾʹ΍ΔλεΫΛఆٛͯ͠΋Α͍ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 25

Slide 26

Slide 26 text

࣮ࡍͷྫ(Directoryߏ଄) ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 26

Slide 27

Slide 27 text

# ls Gemfile Rakefile provision vendor Gemfile.lock properties.json spec # cd provision && tree ├── common │ ├── common.rb │ ├── recipes │ │ ├── dstat.rb │ │ └── ntp.rb │ └── templates │ └── ntp.conf.erb ├── db │ ├── db.rb │ ├── recipes │ │ └── mysql.rb │ └── templates │ └── my.cnf.erb : ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 27

Slide 28

Slide 28 text

# db/db.rb include_recipe "recipes/mysql.rb" include_recipe "..." : # db/recipes/mysql.rb package 'mysql' do action :install end template '/etc/my.cnf' do action :create source '../templates/my.cnf.erb' variables(host: ENV['TARGET_HOST'], server_id: node[ENV['TARGET_HOST']]['server_id']) end ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 28

Slide 29

Slide 29 text

͕࣌ؒ͋Ε͹σϞ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 29

Slide 30

Slide 30 text

·ͱΊ 4 Itamae ࢖ͬͯΈͯͨ 4 RubyDSLɾAgentlessɾSimpleɾlight... Ͱྑ͍πʔϧ 4 Itamae ͱ Serverspec ΛҰؾʹ࣮ߦ͢Δ΍Γํ 4 Itamae ͷσΟϨΫτϦߏ଄ྫΛ঺հ ITΠϯϑϥ ۀ຿ࣗಈԽݱঢ়֬ೝձ (2014/10/07) - YOSHIKAWA Ryota (@rrreeeyyy) 30