infrastrucure as a codeにおけるjenkinsの役割
TRANSCRIPT
「Infrastructure as a CodeにおけるJenkinsの役割」 〜環境構築も継続的インテグレーションを行う時代です〜
Copyright 2015 CYBIRD Co., Ltd. All Rights Reserved.
株式会社サイバード藤原 涼本田 恭
Jenkins ユーザ・カンファレンス 2015 東京
[PDF]
http://goo.gl/f96u5k[PowerPoint]
http://goo.gl/qqhdoo[関連資料]AutoScale×ゲーム http://goo.gl/i0cXfH (前半) http://goo.gl/MKgQPA (後半)
資料はこちらからも閲覧できます
Bootstrapping
● OSのインストールとサーバ起動● Configurationを実行するための準備
OSのプロビジョニング
BootstrappingConfigurationOrchestration
再 掲
Bootstrapping実践 -物理-
● Kickstartで実行○ OSインストール○ ディスクのパーティション設定○ NIC, Routingの設定○ SELinux無効化○ 管理ユーザーの作成(Chef実行ユーザー)
■ useradd■ authorized_keys
Bootstrapping実践 -クラウド-
● Kickstartの内容を実行しイメージ化○ OSインストール OSの選択○ ディスクのパーティション設定 Volume設定○ NIC, Routingの設定 Network Interface設定○ SELinux無効化○ 管理ユーザーの作成(Chef実行ユーザー)
■ useradd■ authorized_keys
Bootstrapとは物理 クラウド
共通
● SELinux無効● 管理ユーザー作成
● OSインストール● パーティション● NICやRouting
● OS選択● Volume設定● Network設定
Bootstrapping実践
● Kickstartをベースに作業○ 物理/クラウド両方で同じように考えられるように
● 最低限の作業のみ行う○ インストールや設定は他のレイヤーで行う○ Chefが実行できる状態にするだけ
Configuration
● ミドルウェアのセットアップ● 対象サーバの役割に応じた設定● サーバ単体で完結するような処理
システム構成のプロビジョニング
構成管理ツールが得意な領域BootstrappingConfigurationOrchestration
再 掲
Configuration実践
● Chef Solo○ Chef Server運用の問題を解決○ JenkinsがChefを管理できるように
● Jenkinsから対象のサーバに対してknife solo実行
Configuration実践
http://www.levihackwith.com/wp-content/uploads/2011/10/github-logo.png
Server
knife solo
レシピたち(一部抜粋)hostsiptablesuser(sshd, sudo)PHPImageMagickhttpdGlusterFSZabbix AgentFluentdSerf
ChefRepository
Configuration実践
● Chef Soloの利用○ Chef Server運用上発生した問題点を解決
● Jenkinsの利用○ Chefの実行がより簡単になった○ Chef実行結果がログに残る○ 成功/失敗の管理できる
Orchestration
● サーバ単体では完結しない処理を担う○ GlusterFSのClusterに追加○ Jenkinsからソースコードデプロイ○ zabbix-agentの起動など
アプリケーションのプロビジョニング
BootstrappingConfigurationOrchestration
デプロイツールなどが得意な領域
再 掲
Orchestration実践
http://pocketstudio.jp.s3.amazonaws.com/log3/wp-content/uploads/2013/11/serf-logo.png
S E R F
Orchestration実践
● Serf○ イベントを受けてそれぞれのNodeでやりたい処理を実
行させる
● Jenkins○ サーバのSerfクラスタ参加イベントを検知○ Serf経由でOrchestration処理イベント発火
Configurationおさらい
Server
knife solo
レシピたち(一部抜粋)hostsiptablesuser(sshd, sudo)PHPImageMagickhttpdGlusterFSZabbix AgentFluentdSerf
ChefRepository
Configurationおさらい
ChefRepository
Server
knife solo
レシピたち(一部抜粋)hostsiptablesuser(sshd, sudo)PHPImageMagickhttpdGlusterFSZabbix AgentFluentd
Serf
Orchestration実践
Server Server Server
Server
JoinしたServerのTagでJob内容切り分け
Web => Nginx startImg => httpd start
Orchestration実践
Server Server Server
Server 【query】httpd start
Serf query
● Serfの処理結果を取得できる● JenkinsがBuild Flowを途中で 止
められる
Orchestration実践
Server Server Server
Server 【query】httpd start
Serf query
● Serfの処理結果を取得できる● JenkinsがBuild Flowを途中で 止
められる
失敗したらそこで終了させる
SerfのTags例{
"node_name": "jenkins",
"encrypt_key": "XXXXXXXXXXXXXX",
"interface": "eth0",
"event_handlers" : [
"user:shell=/bin/sh",
"query:shell=/bin/sh"
],
"tags": {
"role": "img",
"place": "jenkins-conference",
"at": "tokyo"
}}
SerfのTags例{
"node_name": "jenkins",
"encrypt_key": "XXXXXXXXXXXXXX",
"interface": "eth0",
"event_handlers" : [
"user:shell=/bin/sh",
"query:shell=/bin/sh"
],
"tags": {
"role": "img",
"place": "jenkins-conference",
"at": "tokyo"
}}
Tagsの値に応じてJobの分岐
Orchestration実践
● SerfでConfigurationとOrchestrationを連携○ ChefでSerfをagentとして起動○ Serfの起動をJenkinsが受けて開始
● JenkinsがSerfを操作○ queryを使って成功/失敗の判断○ 処理内容はTagsで分岐○ Serf経由で実行するのでSSH必要なし
Releasalization(造語)
● Orchestrationの処理内容をテスト○ Serverspec
● サーバを本番環境に投入○ LBに追加
サービス提供のプロビジョニング
ConfigurationBootstrapping
ReleasalizationOrchestration
再 掲
Releasalization実践
Server Server Server
Serverspec
Server
● Orchestrationの内容をテスト● Configurationのテストとは別
○ CI環境の話で紹介
Serverspec
Releasalization実践
● Serverspecによるテスト○ 中途半端なサーバを本番投入しなくてすむ○ Orchestration処理の品質向上
● 全Build Flowが成功すると本番投入
ServerSerf
serf-members
ReleasalizationJOB JOB
OrchestrationJOB JOB
ConfigurationJOB JOB
Bootstrapping AMI/Kickstart
ReleasalizationJOB JOB
OrchestrationJOB JOB
ConfigurationJOB JOB
Server
【query】httpd start
Bootstrapping AMI/Kickstart
Server
ReleasalizationJOB JOB
OrchestrationJOB JOB
ConfigurationJOB JOB
Serverspec
Bootstrapping AMI/Kickstart
Jenkinsの役割 -今回-
● ソースコードのDeploy● UnitTestによるCI● サーバ構築の自動化管理
○ Chef○ Orchestration○ Serverspec
■ ChefのCI■ Releasalization
Chefの開発方法 -これまで-
● ChefのCookbook作成● レシピ開発● (Chef Serverに登録)● EC2やVagrantでInstance起動● Chef実行● GitHubにpush
● ChefのCookbook作成● レシピ開発● (Chef Serverに登録)● EC2やVagrantでInstance起動● Chef実行● GitHubにpush
Chefの開発方法 -これまで-
つらい
Chefの開発方法 -改善策-
● DockerとChef Zeroをインストール○ AWS EC2やローカルPC
● Chef Repositoryをコンテナにmount● コンテナ起動
○ Chefのレシピとかupload○ chef-client実行
● Serverspecでテスト実行
Chefの開発方法
ChefRepository
knife.rbKEY
/chef
/root/.chef
Container
Chef Zero
● upload● chef-client
Serverspec実行
Host
Chefの開発方法
ChefRepository
knife.rbKEY
/chef
/root/.chef
Container
Chef Zero
● upload● chef-client
Serverspec実行
Host
Chefのテスト駆動開発ができる
Chefの開発方法
ChefRepository
knife.rbKEY
/chef
/root/.chef
Container
Chef Zero
● upload● chef-client
Serverspec実行
Host
Jenkinsに同じことをさせる
JenkinsでChef CI
https://wiki.jenkins-ci.org/download/attachments/72418012/Capture+d%E2%80%99%C3%A9cran+2014-04-08+%C3%A0+12.12.37.pnghttps://octodex.github.com/images/jenktocat.jpg
ChefRepository
Pull Request
ghprb-pluginknife.rb
pem
/chef
/root/.chef
Container
Chef Zero
● upload● chef-client
Serverspec実行
JenkinsでChef CI
ChefRepository
Pull Request
ghprb-pluginknife.rb
pem
/chef
/root/.chef
Container
Chef Zero
● upload● chef-client
Serverspec実行
● Chefが実行するRoleの決め方○ すべてのRoleを実行するのは時間がかかる○ 他のレシピでFailしたら意味不明
JenkinsでChef CI
ChefRepository
Pull Request
ghprb-pluginknife.rb
pem
/chef
/root/.chef
Container
Chef Zero
● upload● chef-client
Serverspec実行
● Chefが実行するRoleの決め方○ すべてのRoleを実行するのは時間がかかる○ 他のレシピでFailしたら意味不明
● Branch名 ≒ Role名○ feature/fix_httpd_php○ roles/FIX_HTTPD_PHP.json
JenkinsでChef CI
Chefの開発方法 -結果-
● Chefの開発/レビューが格段に早くなる○ テストによって品質向上
● だれでもChefの開発に参入できる○ レシピの属人化消滅
● Chef以外にも使える仕組み○ 社内の他Provisioning Toolsにも対応可能
● Chefの開発/レビューが格段に早くなる○ テストによって品質向上
● だれでもChefの開発に参入できる○ レシピの属人化消滅
● Chef以外にも使える仕組み○ 社内の他Provisioning Toolsにも対応可能
Chefの開発方法 -結果-
ちょっとモダンな開発
Jenkinsの役割 -今回-
● ソースコードのDeploy● UnitTestによるCI● サーバ構築の自動化管理
○ Chef○ Orchestration○ Serverspec
■ ChefのCI■ Releasalization
Jenkinsの役割 -今回-
● ソースコードのDeploy● UnitTestによるCI● サーバ構築の自動化管理
○ Chef○ Orchestration○ Serverspec
■ ChefのCI■ ReleasalizationJenkinsが死んだら詰む
Jenkinsの冗長構成
XXX.XXX.XXX.XXX
Serf Clusterhttp://cdn.freshdesk.com/data/helpdesk/attachments/production/1000124656/original/base-aws_awscloud.png
Jenkinsの冗長構成 with Serf
● 仕組みが単純○ Heartbeatなどを入れる必要がない
○ Jenkinsサーバ自体のdownを検知すれば自動で切り替
わる
● Serfの検知/伝播力高い○ 100台のClusterでも2秒程度しかかからないので
https://www.serfdom.io/docs/internals/simulator.html
やってみた結果 -Configuration-
● Chefが独立してくれた○ 他サービスと連携しないからテストやCIもできる○ 他プロジェクトで使いまわし可能
● Provisioning Tools開発はDocker使うのいい○ 開発/検証早くなる
○ パッケージ入れ忘れがなくなるのでレシピの品質が高く
なる
● Chefが独立してくれた○ 他サービスと連携しないからテストやCIもできる○ 他プロジェクトで使いまわし可能
● Provisioning Tools開発はDocker使うのいい○ 開発/検証早くなる
○ パッケージ入れ忘れがなくなるのでレシピの品質が高く
なる
やってみた結果 -Configuration-
Chefに無理させないの大事
やってみた結果 -Orchestration-
● Serfのおかげ感がすごい○ バイナリ置くだけですぐ使い始められる○ やれることが柔軟で設定もシンプル○ TagsとQueryの万能感がすごい○ SSH経由からSerf経由に
やってみた結果 -Orchestration-
● Serfのおかげ感がすごい○ バイナリ置くだけですぐ使い始められる○ やれることが柔軟で設定もシンプル○ TagsとQueryの万能感がすごい○ SSH経由からSerf経由に
SerfとJenkins超仲良し
やってみた結果 -Releasalization-
● 本番投入前のテスト大事○ 一定の品質を担保できる○ 本番に変なサーバが入らないから心に優しい
● Serverspec便利○ Chefのテスト以外でも使える
やってみた結果 -Releasalization-
やっぱりテストは大事
● 本番投入前のテスト大事○ 一定の品質を担保できる○ 本番に変なサーバが入らないから心に優しい
● Serverspec便利○ Chefのテスト以外でも使える
やってみた結果 -Jenkins-
● レイヤーが明確化する
● Jobのログが残る○ 失敗したサーバで原因探す必要がない○ Jobが何をやっているかわかる
● Build Flowを途中で止められる○ 不完全なサーバが本番投入されない
● レイヤーが明確化する
● Jobのログが残る○ 失敗したサーバで原因探す必要がない○ Jobが何をやっているかわかる
● Build Flowを途中で止められる○ 不完全なサーバが本番投入されない
やってみた結果 -Jenkins-
構築自動化において重要人物
Jenkinsへのメッセージ
● Jenkinsがシステムの中心になりつつある○ Deploy, Build, CI以外の利用シーンがある○ Jenkinsが止まってはいけない○ 活用方法をもっと広く共有していきたい
Jenkinsへのメッセージ
執事から指揮官に出世
● Jenkinsがシステムの中心になりつつある○ Deploy, Build, CI以外の利用シーンがある○ Jenkinsが止まってはいけない○ 活用方法をもっと広く共有していきたい