Slide 1

Slide 1 text

DMBTTNFUIPEKQ %PDLFS TFSWFSTQFDͰ࡞Δ DPOGJHTQFD$* %PDLFS.FFUVQ5PLZP   Ϋϥεϝιουגࣜձࣾ ࠤʑ໦ɹେี

Slide 2

Slide 2 text

classmethod.jp 2 ! ! ࣗݾ঺հ

Slide 3

Slide 3 text

3 @smokeymonkey

Slide 4

Slide 4 text

classmethod.jp 4 ࣗݾ঺հ ࠤʑ໦ɹେี !TNPLFZNPOLFZ ! Ϋϥεϝιουגࣜձࣾ "84ίϯαϧςΟϯά෦ ιϦϡʔγϣϯΞʔΩςΫτ

Slide 5

Slide 5 text

classmethod.jp 5 ! ๺ւಓੜ·Ε ๺ւಓҭͪ

Slide 6

Slide 6 text

classmethod.jp 6

Slide 7

Slide 7 text

classmethod.jp 7 ͸͡Ίʹ w๻ʮ%PDLFS৮Γ࢝Ί·ͨ͠ɺ໘ ന͍Ͱ͢Ͷʯ ! w!UBLJQPOʮࠓ౓%PDLFSͷษڧձ ΍Δ͚Ͳ-5΍Δʁʯ ! w๻ʮ͸͊ɺ͡Ό͋΍Γ·͢ʯ

Slide 8

Slide 8 text

classmethod.jp 8 ((((  ;゚Д゚)))ガクガクブルブル

Slide 9

Slide 9 text

classmethod.jp 9 ͸͡Ίʹ w%PDLFSͰϓϩϏδϣχ ϯάπʔϧΛ$*͢Δͷ͸ ͋Γ͕ͪ w1VQQFU $IFG  "OTJCMFʜ

Slide 10

Slide 10 text

classmethod.jp 10 ͸͡Ίʹ wઌ೔ͷ+"84%":4 ͰٶԼ߶ี͞Μͷ ൃදΛฉ͍ͯDPOGJHTQFD ʹڵຯΛ࣋ͬͨ

Slide 11

Slide 11 text

classmethod.jp 11 ͸͡Ίʹ w΍ͬͯΈͨ

Slide 12

Slide 12 text

classmethod.jp 12 ͝ΊΜͳ͍͞ w$*͸ݴ͍ա͗·ͨ͠ wDPOGJHTQFDͰ؀ڥ࡞Δ wTFSWFSTQFDͰςετ͢Δ wͦΕΛ࢖͍ࣺͯίϯςφ Ͱ΍Δ w͍ͭͰʹࣗಈԽ͢Δ

Slide 13

Slide 13 text

classmethod.jp 13 ΍ͬͨ͜ͱ  w"NB[PO-JOVYͰ&$Λ-BVODI w%PDLFSΛΠϯετʔϧ w"NB[PO-JOVYͷ%PDLFS*NBHF Λ࡞੒ wެ։伴ೝূͰ TTI઀ଓग़དྷΔ Α͏ʹ͓ͯ͘͠ Amazon   Linux   Docker  Image Docker

Slide 14

Slide 14 text

classmethod.jp 14 ΍ͬͨ͜ͱ  wDPOGJHTQFDˠTFSWFSTQFDΛҰؾ ௨؏Ͱ࣮ߦ͢Δ3BLFGJMFΛ࡞੒ wHJUQVTI͓ͯ͘͠

Slide 15

Slide 15 text

classmethod.jp 15 ΍ͬͨ͜ͱ  Amazon  Linux     Container (1)git  push (2)webhook (3)rake  -‐‑‒>  docker-‐‑‒api (4)Launch          Container (5)rake  -‐‑‒>            configspec (6)rake  -‐‑‒>            serverspecspec

Slide 16

Slide 16 text

classmethod.jp 16 "NB[PO-JOVY%PDLFS*NBHF wૉͷ"NB[PO-JOVY&$Λ-BVODI4UPQ w7PMVNFΛ%PDLFS͕Πϯετʔϧ͞Εͨ&$ʹ "UUBDIɺNPVOU wҎԼͷϑΥϧμɺϑΝΠϧΛ࡟আ wWBSMPH  CZUFʹ  wWBSDBDIFZVN  wIPNFFDVTFSTTIBVUIPSJ[FE@LFZT wJNQPSU͢Δ UBSOVNFSJDPXOFSDKQcEPDLFSJNQPSUMPDBMBN[O

Slide 17

Slide 17 text

classmethod.jp 17 "NB[PO-JOVY%PDLFS*NBHFXJUI44) w%PDLFSGJMF ! ! ! ! ! ! ! ! ! ! ! w EPDLFSCVJMEUMPDBMBN[OTTI FROM  local/amzn   ! #  PAM設定を変えておかないとsshがいきなり切切れる   RUN  sed  -‐‑‒ri  's/UsePAM  yes/#UsePAM  yes/g'  /etc/ssh/sshd_̲config   RUN  sed  -‐‑‒ri  's/#UsePAM  no/UsePAM  no/g'  /etc/ssh/sshd_̲config   RUN  passwd  -‐‑‒f  -‐‑‒u  ec2-‐‑‒user   ! #  start-‐‑‒stopしてhost_̲keyを作る   RUN  service  sshd  start   RUN  service  sshd  stop   ! ADD  ./authorized_̲keys  /home/ec2-‐‑‒user/.ssh/authorized_̲keys   ! EXPOSE  22

Slide 18

Slide 18 text

classmethod.jp 18 TNPLFZNPOLFZTQFDDJ wUSFF . ├── README.md ├── Rakefile └── spec ├── configspec_helper.rb ├── serverspec_helper.rb ├── web_config │ └── nginx_spec.rb └── web_test └── nginx_spec.rb Roleのconfig Roleのtest

Slide 19

Slide 19 text

classmethod.jp 19 3BLFGJMF  require 'rake' require 'rspec/core/rake_task' require 'docker' ! hosts = [ { :name => 'docker', :roles => %w( web ), :image => 'local/amznssh' } ] ! hosts = hosts.map do |host| { :name => host[:name], :short_name => host[:name].split('.')[0], :roles => host[:roles], :image => host[:image], } docker-‐‑‒api 対象Hostの指定の中で Docker  Imageを指定

Slide 20

Slide 20 text

classmethod.jp 20 3BLFGJMF  namespace :spec do task :all => hosts.map {|h| 'spec:' + h[:short_name] } hosts.each do |host| container = Docker::Container.create( 'Cmd' => ['/usr/sbin/sshd', '- D'], 'Image' => host[:image], 'PortSpecs' => '22' ) container.start('PortBindings' => {'22/tcp' => [{'HostIp' => '0.0.0.0'},{'HostPort' => '54322'}]}) host毎にsshdを実⾏行行して   ContainerをCreate

Slide 21

Slide 21 text

classmethod.jp 21 3BLFGJMF  # configspec RSpec::Core::RakeTask.new(host[:short_name].to_sym) do |t| t.pattern = 'spec/{' + host[:roles].join(',') + '} _config/*_spec.rb' end ! # serverspec RSpec::Core::RakeTask.new(host[:short_name].to_sym) do |t| t.pattern = 'spec/{' + host[:roles].join(',') + '} _test/*_spec.rb' end container.stop configspec実⾏行行 serverspec実⾏行行 Containerをstop

Slide 22

Slide 22 text

classmethod.jp 22 DPOGJHTQFD@IFMQFSSC require 'configspec' require 'net/ssh' require 'net/scp' ! include SpecInfra::Helper::Ssh include SpecInfra::Helper::RedHat ! RSpec.configure do |c| c.sudo_password = '' c.host = ENV['TARGET_HOST'] options = Net::SSH::Config.for(c.host) user = options[:user] || Etc.getlogin c.ssh = Net::SSH.start(c.host, user, options) c.scp = Net::SCP.start(c.host, user, options) end

Slide 23

Slide 23 text

classmethod.jp 23 TFSWFSTQFD@IFMQFSSC require 'serverspec' require 'pathname' require 'net/ssh' ! include SpecInfra::Helper::Ssh include SpecInfra::Helper::RedHat ! RSpec.configure do |c| c.sudo_password = '' c.host = ENV['TARGET_HOST'] options = Net::SSH::Config.for(c.host) user = options[:user] || Etc.getlogin c.ssh = Net::SSH.start(c.host, user, options) end

Slide 24

Slide 24 text

classmethod.jp 24 TVEPSBLF /usr/bin/ruby2.0 -S rspec spec/web_config/ nginx_spec.rb . ! Finished in 0.52104 seconds 1 example, 0 failures /usr/bin/ruby2.0 -S rspec spec/web_test/ nginx_spec.rb . ! Finished in 0.09493 seconds 1 example, 0 failures

Slide 25

Slide 25 text

classmethod.jp 25 +FOLJOTͷઃఆ w(JU1MVHJOΛ࢖ͬͯ·͢

Slide 26

Slide 26 text

classmethod.jp 26 (JUIVCଆͷઃఆ w8FCIPPLT

Slide 27

Slide 27 text

27 ΍ͬͯΈΔ wHJUQVTI

Slide 28

Slide 28 text

28 ΍ͬͯΈΔ wFSSPSʹͳΔ৔߹

Slide 29

Slide 29 text

29 ΍ͬͯΈΔ w͋ͱ͸ @TQFDSCΛ࡞ͬͨΓ मਖ਼ͨ͠Γͯ͠HJUQVTI͢Δ ͚ͩ w׬੒ͨ͠Β"NB[PO-JOVY &$ͷϓϩϏδϣχϯάʹ࢖ ͑͹ྑ͍

Slide 30

Slide 30 text

classmethod.jp 30 ·ͱΊ w ௒ٱ͠ͿΓʹ3VCZॻ͍ͨ w "NB[PO-JOVY".*Ͱ %PDLFS(Pʹͳͬͨ w "84 $POUBJOFS%FQMPZ͕zී௨z ʹͳΔͷ΋͍ۙʁ w ΋ͪΖΜ(PPHMF$MPVE1MBUGPSN Ͱ΋Ͷʂ w ࠓޙͷۀ຿ʹ׆͔ͤΔͱ͍͍ͳ͊

Slide 31

Slide 31 text

No content