SlideShare a Scribd company logo
1 of 31
Download to read offline
ぼくのかんがえた
Itamae/Serverspec
構成フレームワーク
∼ 板前の献立 ∼
!
2015/12/09
@sonots
Itamae meetup 1
自己紹介
• 瀬尾直利 @sonots
• DeNA 分析基盤
• Fluentd コミッタ
• Ruby コミッタ NEW!
• Specinfra のコミット権も あまり活動でき
てない🙇
• 日本語職業シリーズ OSS 同盟
(Haikanko, Yohoushi)
アジェンダ
• 弊社での Itamae 利用
• Itamae のディレクトリ構成
• うちでのディレクトリ構成
• Chef vs Itamae 感想
弊社での Itamae 利用
• 全社的に使っているわけではない🙇
• 全社的には Chef
• (古い環境では) Touryo も現役
• オレのオレによるオレのためのプロビジョニング(みたいな扱い)
• うちのチームで作ったアプリの環境を作るのに使用
• 整って来たので他の所にも使い始めている
• ディープラーニングなチームのためのインフラ構築, etc
うちでの実行方式
• デプロイサーバから itamae ssh で実行
• ホスト数がそんなに多くない (10~20台程度)
• 増えても並列実行の仕組みでカバー
• tar ボールを s3 にあげて、各ホストでダウンロードして
local 実行、みたいなナウいことはやってない
deploy
Itamae のディレクトリ構成
Itamae 標準ディレクトリ構成
• itamae の基本はレシピ指定
!
!
!
• 標準ディレクトリ構成は決まってない
• chef のような run_list (どのレシピを流すのか)や
roles (役割) をどこで決めるのかは決まっていない
$ itamae ssh --host host001 
recipe.rb -y node.yml
Itamae 推薦ディレクトリ構成 (1)
• wiki にオススメ構成は書いてある
├── cookbooks
│ └── nginx
│ ├── default.rb
│ ├── files
│ │ └── etc
│ │ └── nginx
│ │ └── conf.d
│ │ └── static.conf
└── roles
└── web.rb
Itamae 推薦ディレクトリ構成(2)
• cookbooks の下に middleware レシピを書く
• roles の下に role レシピを書いて、include_recipe でど
の middleware を入れるのか指定
!
!
• $ itamae ssh --host host001 roles/web.rb
include_recipe "../cookbooks/nginx/default.rb"
├── cookbooks
│ └── nginx
│ └── default.rb
└── roles
└── web.rb
ちょっと足りない
• ホストとロールの紐付け補助が欲しい → 究極的にはホ
ストの指定だけで流したい
!
!
!
• serverspec と itamae を同じレポジトリで管理して、
レシピとテストを対に書きたい → role とレシピの紐
付けを itamae の仕組み (include_recipe) で行えない
ので、汎用マークアップ言語で記述
$ itamae ホスト名
$ serverspec ホスト名
ぼくのかんがえた
Itamae/Serverspec
構成フレームワーク
Yet another nodes
management framework (?)
for itamae/serverspec
Kondate
(献立)
https://github.com/sonots/kondate
kondate ディレクトリ構成
├── .kondate.conf # kondate configuration
├── hosts.yml # manages hostnames and its roles
├── properties # manages run_lists and attributes
│ ├── nodes # host specific properties
│ ├── roles # role properties
│ └── environments # environment properties
├── recipes # itamae recipes
│ ├── middleware # middleware recipes
│ └── roles # role recipes
└── spec # serverspec specs
├── middleware # middleware recipes specs
├── roles # role recipes specs
$ kondate init
.kondate.conf
• kondate の設定ファイル
• ディレクトリツリーの変更が(ある程度)できる
• Host Plugin ディレクトリの指定と設定(後述)
middlware_recipes_dir: recipes/middleware
roles_recipes_dir: recipes/roles
middleware_recipes_serverspec_dir: spec/middleware
roles_recipes_serverspec_dir: spec/roles
nodes_properties_dir: properties/nodes
roles_properties_dir: properties/roles
environments_properties_dir: properties/environments
secret_nodes_properties_dir: secrets/properties/nodes
secret_roles_properties_dir: secrets/properties/roles
secret_environments_properties_dir: secrets/properties/environments
plugin_dir: lib
host_plugin:
type: file
path: hosts.yml
hosts.yml
• デフォルトの `File` Host Plugin の設定ファイル
• ホストのロールを定義
!
!
• $ kondate itamae ホスト名 と実行すると、hosts.yml
から role 一覧を取得し、properties/roles/ロール.yml
に定義されたレシピ一覧を実行する
• ※ Host Plugin は独自に作成することができる
ホスト名: [ role1, role2 ]
properties ディレクトリ
• chef でいう nodes, roles, environments ディレクトリ
!
!
!
!
!
• environments/環境.yml、roles/ロール.yml、nodes/ホスト名.yml
といったファイルに、どのレシピを実行するのか定義する
• nodes > roles > environments の強さでマージされる
├── properties # manages run_lists and attributes
│ ├── nodes # host specific properties
│ ├── roles # role properties
│ └── environments # environment properties
property ファイルの書き方(1)
• attributes 下に、「レシピ名: 属性値のハッシュ」の形式で書く
!
!
!
!
!
!
!
• レシピ名になっている attributes のキーから run_list を取得
• itamae のレシピ内では、node['attributes']['ruby']['versions'] のよう
に attributes にアクセス可能
• 長いので attrs['ruby']['versions'] という書き方も用意している
attributes:
ruby:
versions: [2.2.3]
node:
versions: [v0.12.2]
global: v0.12.2
nginx:
property ファイルの書き方(2)
• vs Chef
!
!
!
!
!
!
!
!
!
• chef では run_list 定義と attributes 定義が別々だったが統一
• 「attributes のキー名にはレシピ名を使う事」のような俺々ルールにい
つもしているので、kondate ではそれが強制される設計になっている
$ cat node.json
{
"name": "localhost",
"run_list": [
"recipe[ruby]"
],
"default_attributes": {
"ruby" : { "versions": [2.2.3] }
}
}
recipes
• middleware レシピと role レシピという概念
!
!
!
• middleware レシピはミドルウェアをインストールす
る普通のレシピで、nginx/default.rb などがおかれる
場所
• roles レシピはロール固有のレシピをおく場所
├── recipes # itamae recipes
│ ├── middleware # middleware recipes
│ └── roles # role recipes
Role レシピという概念
• 最初は recipes 直下に全部書いていた
• 例えば /var/log/app1 を作る、という処理
• 最初は app1 レシピを作ってそこに書いていた → 他の
role から再利用されないレシピであることに違和感
!
!
!
!
• Role レシピという新しい概念に分離し、その role でのみ実
行するようにした
recipes
├─ nginx/default.rb
└─ app1/default.rb
spec
• recipes に対応した serverspec テスト
!
!
!
• $ kondate itamae ホスト名

に対して
• $ kondate serverspec ホスト名

のように実行。role を取得して、必要な recipe に対
する serverspec テストのみ流す
└── spec # serverspec specs
├── middleware # middleware recipes specs
└── roles # role recipes specs
Host Plugin (1)
• デフォルトは hosts.yml に定義を書く file プラグ
インを利用
• AWS EC2 の Roles タグから role 一覧を取得した
い、社内のホスト管理APIサーバから role 一覧を
取得したい、というケースがありそう
• 自由に定義できるように Host Plugin という仕組
みを用意した。
Host Plugin (2)
# lib/kondate/host_plugin/file.rb
require 'yaml'
module Kondate
module HostPlugin
class File < Base
# @param [HashWithIndifferentAccess] config
def initialize(config)
super
end
!
def get_environment(host)
ENV['ENVIRONMENT'] || 'development'
end
!
def get_roles(host)
YAML.load_file(@config.path)[host]
end
end
end
end
その他悩んだ設計ポイント
複数ロール問題について(1)
• 一つのホストに複数の role を付けられる設計
• roles/ロール1.yml と roles/ロール2.yml をどのようにマージするの
かという問題 ← hash の deep_merge だと片方を上書きしてしまう
attributes:
ruby:
versions: [1.9.3, 2.2.3]
nginx:
attributes:
ruby:
versions: [2.0.0, 2.2.3]
nginx:
roles/app1.yml roles/app2.yml
どっちが強いのか定義できない
複数ロール問題について(2)
• 現在の kondate は role 毎に itamae を実行(2つ
role があれば、2回実行)することにしている
• 遅いけど、そもそも1つのホストに2つロールを
付けるんじゃない(怒)というスタンス
感想&まとめ
Chef vs Itamae 感想 (1)
• 前提:弊社の chef は knife-solo、berkshelf 利用
• knife-solo は一度 berkshelf で cookbook を全て落と
して来て、リモートに転送して、リモートでchef-solo
実行する → 遅い、分かりにくい
• Itamae は rubygems を使っていて、Itamae ssh で手
元から実行する → 分かりやすい、デバガを仕込める
• 今の小さい規模には Itamae が fit している
Chef vs Itamae 感想 (2)
• Itamae は Chef のようにディレクトリ構成を規定
してくれていない
• でも、Chef の場合も結局ラッパーを書いて動かし
たりする (弊社にも dena-chef ラッパーがいる)
• 各々で構成決められるので良いのでは
まとめ
• Kondate という枠組みを用意して Itamae 使って
ます
• 各社好みで構成を決めたくなると思うので、その
時に参考にしてみてください🙏
• Kondate の構成がフィットするならそのままご利
用ください :D

More Related Content

What's hot

ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
Sugawara Genki
 
明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy
Takeshi Komiya
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
Yuuki Namikawa
 

What's hot (20)

Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
 
入門 Chef Server #biglobetechtalk
入門 Chef Server #biglobetechtalk入門 Chef Server #biglobetechtalk
入門 Chef Server #biglobetechtalk
 
Serverspecを使ってみた話
Serverspecを使ってみた話Serverspecを使ってみた話
Serverspecを使ってみた話
 
Apache Module
Apache ModuleApache Module
Apache Module
 
serverspecでサーバ環境のテストを書いてみよう
serverspecでサーバ環境のテストを書いてみようserverspecでサーバ環境のテストを書いてみよう
serverspecでサーバ環境のテストを書いてみよう
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
Puppetのススメ
PuppetのススメPuppetのススメ
Puppetのススメ
 
明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy
 
ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!
 
NDS#31
NDS#31NDS#31
NDS#31
 
Serverspec at Testing Framework Meeting
Serverspec at Testing Framework MeetingServerspec at Testing Framework Meeting
Serverspec at Testing Framework Meeting
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
 
Niigata.pm #1
Niigata.pm #1Niigata.pm #1
Niigata.pm #1
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
 
Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれから
 
130412 kayac-cinnamon
130412 kayac-cinnamon130412 kayac-cinnamon
130412 kayac-cinnamon
 

Viewers also liked

HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
Naotoshi Seo
 
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Naotoshi Seo
 
ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争
goccy
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要
Kazuyuki Mori
 

Viewers also liked (19)

The story became happy with itamae
The story became happy with itamaeThe story became happy with itamae
The story became happy with itamae
 
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
 
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストServerspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
 
Puppet of-2015-forupload
Puppet of-2015-foruploadPuppet of-2015-forupload
Puppet of-2015-forupload
 
自由なデータ
自由なデータ自由なデータ
自由なデータ
 
Sphinx拡張 探訪 2014 #sphinxjp
Sphinx拡張 探訪 2014 #sphinxjpSphinx拡張 探訪 2014 #sphinxjp
Sphinx拡張 探訪 2014 #sphinxjp
 
Deploying Carrier Ethernet Features on Cisco ASR 9000
Deploying Carrier Ethernet Features on Cisco ASR 9000Deploying Carrier Ethernet Features on Cisco ASR 9000
Deploying Carrier Ethernet Features on Cisco ASR 9000
 
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~
 
Jenkinsのおっさんを眺めるだけ
Jenkinsのおっさんを眺めるだけJenkinsのおっさんを眺めるだけ
Jenkinsのおっさんを眺めるだけ
 
ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争
 
Drone.io のご紹介
Drone.io のご紹介Drone.io のご紹介
Drone.io のご紹介
 
スタートアップの 3 分ピッチテンプレート
スタートアップの 3 分ピッチテンプレートスタートアップの 3 分ピッチテンプレート
スタートアップの 3 分ピッチテンプレート
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要
 
DeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechconDeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechcon
 
DeNAの動画配信サービスを支えるインフラの内部 #denatechcon
DeNAの動画配信サービスを支えるインフラの内部  #denatechconDeNAの動画配信サービスを支えるインフラの内部  #denatechcon
DeNAの動画配信サービスを支えるインフラの内部 #denatechcon
 
DeNA private cloudのその後 #denatechcon
DeNA private cloudのその後 #denatechconDeNA private cloudのその後 #denatechcon
DeNA private cloudのその後 #denatechcon
 
サービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechconサービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechcon
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 

Similar to ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜

R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
Kosei ABE
 
20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた
Shugo Numano
 
20130723 ecシステムにchefを導入してみた v1.0
20130723 ecシステムにchefを導入してみた v1.020130723 ecシステムにchefを導入してみた v1.0
20130723 ecシステムにchefを導入してみた v1.0
NIFTY Cloud
 
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Takeshi Komiya
 
Power shellmemo
Power shellmemoPower shellmemo
Power shellmemo
ytanno
 

Similar to ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜 (20)

Redmine Ansible
Redmine AnsibleRedmine Ansible
Redmine Ansible
 
ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門
 
Yohes kitchen
Yohes kitchenYohes kitchen
Yohes kitchen
 
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
 
What is chef
What is chefWhat is chef
What is chef
 
Chef
ChefChef
Chef
 
仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法
 
130207 kyotorb
130207 kyotorb130207 kyotorb
130207 kyotorb
 
Rails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIRails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) API
 
20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた
 
20130723 ecシステムにchefを導入してみた v1.0
20130723 ecシステムにchefを導入してみた v1.020130723 ecシステムにchefを導入してみた v1.0
20130723 ecシステムにchefを導入してみた v1.0
 
社内Chef勉強会
社内Chef勉強会社内Chef勉強会
社内Chef勉強会
 
Chef入門
Chef入門Chef入門
Chef入門
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
 
PHP フィールドインジェクションに挑戦する PHP勉強会2014
PHP フィールドインジェクションに挑戦する PHP勉強会2014PHP フィールドインジェクションに挑戦する PHP勉強会2014
PHP フィールドインジェクションに挑戦する PHP勉強会2014
 
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
Power shellmemo
Power shellmemoPower shellmemo
Power shellmemo
 

More from Naotoshi Seo

InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
Naotoshi Seo
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415
Naotoshi Seo
 
Serf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraSerf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfra
Naotoshi Seo
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3
Naotoshi Seo
 
Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013
Naotoshi Seo
 
Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531
Naotoshi Seo
 
Fluentdcasual 02-haikanko
Fluentdcasual 02-haikankoFluentdcasual 02-haikanko
Fluentdcasual 02-haikanko
Naotoshi Seo
 
capistrano-colorized-stream
capistrano-colorized-streamcapistrano-colorized-stream
capistrano-colorized-stream
Naotoshi Seo
 

More from Naotoshi Seo (11)

Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415
 
Serf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraSerf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfra
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3
 
Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013
 
Yohoushi
YohoushiYohoushi
Yohoushi
 
Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531
 
Fluentdcasual 02-haikanko
Fluentdcasual 02-haikankoFluentdcasual 02-haikanko
Fluentdcasual 02-haikanko
 
capistrano-colorized-stream
capistrano-colorized-streamcapistrano-colorized-stream
capistrano-colorized-stream
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 

Recently uploaded

Recently uploaded (12)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜

  • 2. 自己紹介 • 瀬尾直利 @sonots • DeNA 分析基盤 • Fluentd コミッタ • Ruby コミッタ NEW! • Specinfra のコミット権も あまり活動でき てない🙇 • 日本語職業シリーズ OSS 同盟 (Haikanko, Yohoushi)
  • 3. アジェンダ • 弊社での Itamae 利用 • Itamae のディレクトリ構成 • うちでのディレクトリ構成 • Chef vs Itamae 感想
  • 4. 弊社での Itamae 利用 • 全社的に使っているわけではない🙇 • 全社的には Chef • (古い環境では) Touryo も現役 • オレのオレによるオレのためのプロビジョニング(みたいな扱い) • うちのチームで作ったアプリの環境を作るのに使用 • 整って来たので他の所にも使い始めている • ディープラーニングなチームのためのインフラ構築, etc
  • 5. うちでの実行方式 • デプロイサーバから itamae ssh で実行 • ホスト数がそんなに多くない (10~20台程度) • 増えても並列実行の仕組みでカバー • tar ボールを s3 にあげて、各ホストでダウンロードして local 実行、みたいなナウいことはやってない deploy
  • 7. Itamae 標準ディレクトリ構成 • itamae の基本はレシピ指定 ! ! ! • 標準ディレクトリ構成は決まってない • chef のような run_list (どのレシピを流すのか)や roles (役割) をどこで決めるのかは決まっていない $ itamae ssh --host host001 recipe.rb -y node.yml
  • 8. Itamae 推薦ディレクトリ構成 (1) • wiki にオススメ構成は書いてある ├── cookbooks │ └── nginx │ ├── default.rb │ ├── files │ │ └── etc │ │ └── nginx │ │ └── conf.d │ │ └── static.conf └── roles └── web.rb
  • 9. Itamae 推薦ディレクトリ構成(2) • cookbooks の下に middleware レシピを書く • roles の下に role レシピを書いて、include_recipe でど の middleware を入れるのか指定 ! ! • $ itamae ssh --host host001 roles/web.rb include_recipe "../cookbooks/nginx/default.rb" ├── cookbooks │ └── nginx │ └── default.rb └── roles └── web.rb
  • 10. ちょっと足りない • ホストとロールの紐付け補助が欲しい → 究極的にはホ ストの指定だけで流したい ! ! ! • serverspec と itamae を同じレポジトリで管理して、 レシピとテストを対に書きたい → role とレシピの紐 付けを itamae の仕組み (include_recipe) で行えない ので、汎用マークアップ言語で記述 $ itamae ホスト名 $ serverspec ホスト名
  • 12. Yet another nodes management framework (?) for itamae/serverspec
  • 14. kondate ディレクトリ構成 ├── .kondate.conf # kondate configuration ├── hosts.yml # manages hostnames and its roles ├── properties # manages run_lists and attributes │ ├── nodes # host specific properties │ ├── roles # role properties │ └── environments # environment properties ├── recipes # itamae recipes │ ├── middleware # middleware recipes │ └── roles # role recipes └── spec # serverspec specs ├── middleware # middleware recipes specs ├── roles # role recipes specs $ kondate init
  • 15. .kondate.conf • kondate の設定ファイル • ディレクトリツリーの変更が(ある程度)できる • Host Plugin ディレクトリの指定と設定(後述) middlware_recipes_dir: recipes/middleware roles_recipes_dir: recipes/roles middleware_recipes_serverspec_dir: spec/middleware roles_recipes_serverspec_dir: spec/roles nodes_properties_dir: properties/nodes roles_properties_dir: properties/roles environments_properties_dir: properties/environments secret_nodes_properties_dir: secrets/properties/nodes secret_roles_properties_dir: secrets/properties/roles secret_environments_properties_dir: secrets/properties/environments plugin_dir: lib host_plugin: type: file path: hosts.yml
  • 16. hosts.yml • デフォルトの `File` Host Plugin の設定ファイル • ホストのロールを定義 ! ! • $ kondate itamae ホスト名 と実行すると、hosts.yml から role 一覧を取得し、properties/roles/ロール.yml に定義されたレシピ一覧を実行する • ※ Host Plugin は独自に作成することができる ホスト名: [ role1, role2 ]
  • 17. properties ディレクトリ • chef でいう nodes, roles, environments ディレクトリ ! ! ! ! ! • environments/環境.yml、roles/ロール.yml、nodes/ホスト名.yml といったファイルに、どのレシピを実行するのか定義する • nodes > roles > environments の強さでマージされる ├── properties # manages run_lists and attributes │ ├── nodes # host specific properties │ ├── roles # role properties │ └── environments # environment properties
  • 18. property ファイルの書き方(1) • attributes 下に、「レシピ名: 属性値のハッシュ」の形式で書く ! ! ! ! ! ! ! • レシピ名になっている attributes のキーから run_list を取得 • itamae のレシピ内では、node['attributes']['ruby']['versions'] のよう に attributes にアクセス可能 • 長いので attrs['ruby']['versions'] という書き方も用意している attributes: ruby: versions: [2.2.3] node: versions: [v0.12.2] global: v0.12.2 nginx:
  • 19. property ファイルの書き方(2) • vs Chef ! ! ! ! ! ! ! ! ! • chef では run_list 定義と attributes 定義が別々だったが統一 • 「attributes のキー名にはレシピ名を使う事」のような俺々ルールにい つもしているので、kondate ではそれが強制される設計になっている $ cat node.json { "name": "localhost", "run_list": [ "recipe[ruby]" ], "default_attributes": { "ruby" : { "versions": [2.2.3] } } }
  • 20. recipes • middleware レシピと role レシピという概念 ! ! ! • middleware レシピはミドルウェアをインストールす る普通のレシピで、nginx/default.rb などがおかれる 場所 • roles レシピはロール固有のレシピをおく場所 ├── recipes # itamae recipes │ ├── middleware # middleware recipes │ └── roles # role recipes
  • 21. Role レシピという概念 • 最初は recipes 直下に全部書いていた • 例えば /var/log/app1 を作る、という処理 • 最初は app1 レシピを作ってそこに書いていた → 他の role から再利用されないレシピであることに違和感 ! ! ! ! • Role レシピという新しい概念に分離し、その role でのみ実 行するようにした recipes ├─ nginx/default.rb └─ app1/default.rb
  • 22. spec • recipes に対応した serverspec テスト ! ! ! • $ kondate itamae ホスト名
 に対して • $ kondate serverspec ホスト名
 のように実行。role を取得して、必要な recipe に対 する serverspec テストのみ流す └── spec # serverspec specs ├── middleware # middleware recipes specs └── roles # role recipes specs
  • 23. Host Plugin (1) • デフォルトは hosts.yml に定義を書く file プラグ インを利用 • AWS EC2 の Roles タグから role 一覧を取得した い、社内のホスト管理APIサーバから role 一覧を 取得したい、というケースがありそう • 自由に定義できるように Host Plugin という仕組 みを用意した。
  • 24. Host Plugin (2) # lib/kondate/host_plugin/file.rb require 'yaml' module Kondate module HostPlugin class File < Base # @param [HashWithIndifferentAccess] config def initialize(config) super end ! def get_environment(host) ENV['ENVIRONMENT'] || 'development' end ! def get_roles(host) YAML.load_file(@config.path)[host] end end end end
  • 26. 複数ロール問題について(1) • 一つのホストに複数の role を付けられる設計 • roles/ロール1.yml と roles/ロール2.yml をどのようにマージするの かという問題 ← hash の deep_merge だと片方を上書きしてしまう attributes: ruby: versions: [1.9.3, 2.2.3] nginx: attributes: ruby: versions: [2.0.0, 2.2.3] nginx: roles/app1.yml roles/app2.yml どっちが強いのか定義できない
  • 27. 複数ロール問題について(2) • 現在の kondate は role 毎に itamae を実行(2つ role があれば、2回実行)することにしている • 遅いけど、そもそも1つのホストに2つロールを 付けるんじゃない(怒)というスタンス
  • 29. Chef vs Itamae 感想 (1) • 前提:弊社の chef は knife-solo、berkshelf 利用 • knife-solo は一度 berkshelf で cookbook を全て落と して来て、リモートに転送して、リモートでchef-solo 実行する → 遅い、分かりにくい • Itamae は rubygems を使っていて、Itamae ssh で手 元から実行する → 分かりやすい、デバガを仕込める • 今の小さい規模には Itamae が fit している
  • 30. Chef vs Itamae 感想 (2) • Itamae は Chef のようにディレクトリ構成を規定 してくれていない • でも、Chef の場合も結局ラッパーを書いて動かし たりする (弊社にも dena-chef ラッパーがいる) • 各々で構成決められるので良いのでは
  • 31. まとめ • Kondate という枠組みを用意して Itamae 使って ます • 各社好みで構成を決めたくなると思うので、その 時に参考にしてみてください🙏 • Kondate の構成がフィットするならそのままご利 用ください :D