SlideShare une entreprise Scribd logo
1  sur  16
Télécharger pour lire hors ligne
Chef+serverspec+wercker
でインフラCIする話
@minamijoyo
インフラエンジニア勉強会@スペースマーケット
2015/4/9
自己紹介
• 森田 真之
• CrowdWorks Inc. 所属
• まだ入社して1週間ぐらい
• 先日まで某SIerでインフラ担当してた
• アカウント
• twitter: minamijoyo
• hatena:minamijoyo
• github:minamijoyo
• 最近作ったもの
• GitHubコミットメッセージの文例が検索できるサービス
• http://commit-m.minamijoyo.com/
@minamijoyo
Chef
• Infrastructure as a code
• インフラ構築の自動化
• インフラ構成をコードで管理
• 変更履歴がバージョン管理できる
• 変更内容をプルリクでレビューできる
• コミュニティーのクックブックが充実してるので、自分で書かなくてもある程
度それっぽいものは作れる。
• 中身がブラックボックスになりがちなので、自分で書いた方が分かりやすい
けど、ミドルウェアのバージョンアップのメンテとか考えると一長一短あり。
その他の構成管理ツール
• Puppet
• わりと昔からあるやつ。
• Ansible
• ChefやPuppetより後発でシンプルさ重視。
• ymlで書くので設定ファイルChefよりコード量は少ないイメージ。
• RubyっぽさがないのでRubyわからない人に抵抗がない。ツール自体はPython製。
• Itamae
• ChefっぽいDSL。
• serverspecで使われてるSpecInfraをバックエンドに使用。
• Cookpadの中の人が作ってるらしい。
serverspec
• インフラの状態をテストするツール
• 元々Puppetのリファクタリングする目的で作られたが、特にPuppetに
依存してるわけではなく、基本的にテスト対象にSSHできればOK。
• テストコードは構築コードと二重管理になりがちなので、どこまでテスト
を書くかは悩ましいところ。
• 基本的な考え方として、構成管理ツール(Chefなど)が正しく動くことは
信頼すべきで、構成管理ツールを使う人間(Chefのレシピを書く人)を
信頼しないというスタンスで使うのがよい。(とserverspecの作者が
言ってる)
• テストコードがあると安心してリファクタリングしやすい。
インフラCI環境の構築
• VirtualBoxのインストール(ローカル開発用)
• https://www.virtualbox.org/
• Vagrantのインストール(ローカル開発用)
• https://www.vagrantup.com/
• bundle install
• Gemfile後述
• berks vendor cookbooks
• Berksfile後述
• vagrant up またはaws ec2 run-instances xxx
• knife solo bootstrap (ユーザ名)@(IPアドレス) -i (SSH のパス) -N (chefのノード定義)
• serverspec
• vagrant destroy またはaws ec2 terminate-instances xxx
GitHubとwerckerを
連携させてCIする
push
レシピ
Webhook
cook
spec
GitHubにpushするといいかんじに
Chefのレシピのテストが走る
とあるwercker.ymlの例
box: wercker/ruby
build:
steps:
- bundle-install
- script:
name: make ssh dir
code: mkdir -m 700 -p $HOME/.ssh
- create-file:
name: put ssh private key
filename: $HOME/.ssh/aws-wercker.pem
overwrite: true
hide-from-log: true
content: $AWS_SSH_KEY_PRIVATE
- script:
name: chmod ssh private key
code: chmod 400 $HOME/.ssh/aws-wercker.pem
- script:
name: delete ec2.env file if exists
code: rm -f ec2.env
- script:
name: aws ec2 run-instances
code: bundle exec ruby ec2-run-instances.rb
- script:
name: print ec2.env for debug
code: cat ec2.env
- script:
name: export environments
code: source ec2.env
- script:
name: ssh connect test
code: ssh ec2-user@$TARGET_IP -i $HOME/.ssh/aws-wercker.pem -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null hostname
- script:
name: berks vendor cookbooks
code: bundle exec berks vendor cookbooks
- script:
name: knife solo bootstrap
code: bundle exec knife solo bootstrap ec2-user@$TARGET_IP -i $HOME/.ssh/aws-wercker.pem -N commitm-ap
- script:
name: serverspec
code: bundle exec rake serverspec:commitm-ap
- script:
name: aws ec2 terminate-instances
code: bundle exec ruby ec2-terminate-instances.rb
https://github.com/minamijoyo/commit-infra
Gemfileの例
source 'https://rubygems.org'
gem "chef", ' > 12.0.3'
gem "knife-solo", ' > 0.4.2'
gem "berkshelf", ' > 3.2.3'
gem "serverspec", ' > 2.8.2'
gem "aws-sdk", ' > 2.0.28'
Berksfileの例
source "https://supermarket.chef.io"
cookbook 'build-essential', ' >2.1.3'
cookbook 'git', ' >4.1.0'
cookbook 'rvm', ' >0.9.2'
cookbook 'sqlite', ' >1.1.0'
cookbook 'nodejs', ' >2.2.0'
cookbook 'mysql', ' >5.3.6'
roles
{
"name": "ap",
"chef_type": "role",
"json_class": "Chef::Role",
"default_attributes": {
"rvm": {
"user": "root",
"default_ruby": "ruby-2.2",
"user_default_ruby": "ruby-2.2",
"rubies": ["ruby-2.2"]
}
},
"override_attributes": {},
"run_list": [
"recipe[rvm::system]",
"recipe[sqlite]",
"recipe[nodejs]",
"recipe[mysql::client]"
]
}
nodes
{
"environment": "production",
"run_list": [
"role[base]",
"role[ap]"
]
}
Rakefileの例
require 'rake'
require 'rspec/core/rake_task'
require 'json'
require 'erb'
hosts = JSON.parse(ERB.new(File.read('hosts.json')).result)
desc "Run serverspec to all hosts"
task :serverspec => 'serverspec:all'
namespace :serverspec do
task :all => hosts.map { ¦host¦ 'serverspec:' + host['name'] }
hosts.each do ¦host¦
desc "Run serverspec to #{host['name']}"
RSpec::Core::RakeTask.new(host['name'].to_sym) do ¦t¦
ENV['TARGET_HOST'] = host['name']
t.pattern = 'spec/{' + host['roles'].join(',') + '}/*_spec.rb'
end
end
end
hosts.json
[
∼略∼
{
"name": "commitm-ap",
"host_name": "<%= ENV['TARGET_IP'] %>",
"user": "ec2-user",
"port": 22,
"keys": "<%= ENV['TARGET_SSH_KEYPATH'] %>",
"roles":["base", "ap"]
}
]
specファイルの例
require 'spec_helper'
describe "rvm spec" do
# rvm install
describe command('which rvm') do
let(:disable_sudo) { true }
its(:exit_status) { should eq 0 }
end
# ruby versions
describe command('ruby -v') do
let(:disable_sudo) { true }
its(:stdout) { should match /ruby 2.2.0p0.+/ }
end
end
質問
• 質問あれば

Contenu connexe

Tendances

Jenkinsの導入 vol.02 Bitbucketと連携する
Jenkinsの導入 vol.02 Bitbucketと連携するJenkinsの導入 vol.02 Bitbucketと連携する
Jenkinsの導入 vol.02 Bitbucketと連携する
regret raym
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
Sugawara Genki
 
Coffee script初めの一歩
Coffee script初めの一歩Coffee script初めの一歩
Coffee script初めの一歩
Misa Kondo
 

Tendances (20)

Getting Started With Ore-Ore Swift Standard Library +
Getting Started With Ore-Ore Swift Standard Library +Getting Started With Ore-Ore Swift Standard Library +
Getting Started With Ore-Ore Swift Standard Library +
 
Getting Started With Ore-Ore Swift Standard Library ++ ほんのり続報
Getting Started With Ore-Ore Swift Standard Library ++ ほんのり続報Getting Started With Ore-Ore Swift Standard Library ++ ほんのり続報
Getting Started With Ore-Ore Swift Standard Library ++ ほんのり続報
 
さくらのインフラコード
さくらのインフラコードさくらのインフラコード
さくらのインフラコード
 
Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1
 
Chef社内勉強会(第1回)
Chef社内勉強会(第1回)Chef社内勉強会(第1回)
Chef社内勉強会(第1回)
 
130412 kayac-cinnamon
130412 kayac-cinnamon130412 kayac-cinnamon
130412 kayac-cinnamon
 
SEゼミ2015 - リーダブルコード勉強会のアイスブレイク
SEゼミ2015 - リーダブルコード勉強会のアイスブレイクSEゼミ2015 - リーダブルコード勉強会のアイスブレイク
SEゼミ2015 - リーダブルコード勉強会のアイスブレイク
 
Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門
 
Jenkinsの導入 vol.02 Bitbucketと連携する
Jenkinsの導入 vol.02 Bitbucketと連携するJenkinsの導入 vol.02 Bitbucketと連携する
Jenkinsの導入 vol.02 Bitbucketと連携する
 
Vagrant & Dockerによるイマドキの開発環境構築
Vagrant & Dockerによるイマドキの開発環境構築Vagrant & Dockerによるイマドキの開発環境構築
Vagrant & Dockerによるイマドキの開発環境構築
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたち
 
サーバ側Swift
サーバ側Swiftサーバ側Swift
サーバ側Swift
 
Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれから
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたい
 
Haikara
HaikaraHaikara
Haikara
 
Coffee script初めの一歩
Coffee script初めの一歩Coffee script初めの一歩
Coffee script初めの一歩
 

Similaire à Chef+serverspec+werckerでインフラCIする話

Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
i7a
 

Similaire à Chef+serverspec+werckerでインフラCIする話 (20)

ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016
 
Server side Swift & Photo Booth
Server side Swift & Photo Booth Server side Swift & Photo Booth
Server side Swift & Photo Booth
 
S16 Microsoft Azure 上での Chef 環境の構成
S16 Microsoft Azure 上での Chef 環境の構成S16 Microsoft Azure 上での Chef 環境の構成
S16 Microsoft Azure 上での Chef 環境の構成
 
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
 
Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
 
Chef SoloからItamaeに完全移行した話+
Chef SoloからItamaeに完全移行した話+Chef SoloからItamaeに完全移行した話+
Chef SoloからItamaeに完全移行した話+
 
Google container builderと友だちになるまで
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまで
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみたKubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
 
Open Source x AI
Open Source x AIOpen Source x AI
Open Source x AI
 
Osc fukuoka xAI Meetup
Osc fukuoka xAI MeetupOsc fukuoka xAI Meetup
Osc fukuoka xAI Meetup
 
Tekton 入門
Tekton 入門Tekton 入門
Tekton 入門
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた
 
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウCircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
 

Chef+serverspec+werckerでインフラCIする話