infrastrucure as a codeにおけるjenkinsの役割

107
Infrastructure as a CodeにおけるJenkinsの役割」 〜環境構築も継続的インテグレーションを行う時代です〜 Copyright 2015 CYBIRD Co., Ltd. All Rights Reserved. 株式会社サイバード 藤原 本田 Jenkins ユーザ・カンファレンス 2015 東京

Upload: takashi-honda

Post on 16-Jul-2015

608 views

Category:

Technology


0 download

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 (後半)

資料はこちらからも閲覧できます

Agenda

〜概念編〜 サーバ構築フローとJenkinsの役割

〜実践編〜 サーバ構築の実践例とCI環境

自己紹介

● 本田 恭● 2012年新卒入社 (3年目)● Twitter: @Altsencturely● インフラ系男子

Agenda 〜実践編〜

1: 各レイヤーの実践方法

2: JenkinsによるChef CI

3: Jenkins冗長化

4: やってみた結果

Agenda 〜実践編〜

1: 各レイヤーの実践方法

2: JenkinsによるChef CI

3: Jenkins冗長化

4: やってみた結果

Bootstrapping

Releasalization

Orchestration

Configuration

再 掲

レイヤー

● Bootstrapping

● Configuration

● Orchestration

● Releasalization

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が実行できる状態にするだけ

レイヤー

● Bootstrapping

● Configuration

● Orchestration

● Releasalization

Configuration

● ミドルウェアのセットアップ● 対象サーバの役割に応じた設定● サーバ単体で完結するような処理

システム構成のプロビジョニング

構成管理ツールが得意な領域BootstrappingConfigurationOrchestration

再 掲

Configuration実践

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実行結果がログに残る○ 成功/失敗の管理できる

レイヤー

● Bootstrapping

● Configuration

● Orchestration

● Releasalization

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処理イベント発火

Serfって何?

● Go言語製オーケストレーションツール○ メンバーシップ○ 障害検知と復旧○ カスタムイベント伝播

● ゴシッププロトコル

Serfって何?

serf 使い方

これまでのSerfの利用方法

http://www.awssummittokyo.com/

S E R F

slideshare autoscale ゲーム

http://goo.gl/MKgQPA

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

serf-members

serf join

Server

Serf ClusterSerf

Orchestration実践

Server Server

Server

【event】member-join

Server

Orchestration実践

Server Server

Server

【event】member-join

Server

Orchestration実践

Server Server

Server

OrchestrationBuild Flow実行

Server

Orchestration実践

Server Server Server

Server

JoinしたServerのTagでJob内容切り分け

Web => Nginx startImg => httpd start

Orchestration実践

Server Server Server

Server

【query】httpd start

※-nodeで対象指定

Orchestration実践

Server Server Server

Server 【query】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

● Configuration(Chef)で設定○ Orchestrationの処理内容はChefのRoleと密接に関係

● TagsはChefのRoleの要約

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必要なし

レイヤー

● Bootstrapping

● Configuration

● Orchestration

● Releasalization

Releasalization(造語)

● Orchestrationの処理内容をテスト○ Serverspec

● サーバを本番環境に投入○ LBに追加

サービス提供のプロビジョニング

ConfigurationBootstrapping

ReleasalizationOrchestration

再 掲

Serverspec

● サーバ環境の自動テストフレームワーク○ RSpecの機能を使って書ける

○ http://serverspec.org/

Orchestrationのおさらい

Server Server Server

Server 【query】httpd start

Server Server Server

Releasalization実践

Server

Serverspec

Releasalization実践

Server Server Server

Serverspec

Server

● Orchestrationの内容をテスト● Configurationのテストとは別

○ CI環境の話で紹介

Serverspec

Server Server Server

Releasalization実践

LB追加

Server

Server Server Server

Releasalization実践

Server

LB01 LB02

Server Server Server

Releasalization実践

Server

LB01 LB02

すべて成功したら本番環境投入

Releasalization実践

● Serverspecによるテスト○ 中途半端なサーバを本番投入しなくてすむ○ Orchestration処理の品質向上

● 全Build Flowが成功すると本番投入

Bootstrapping AMI/Kickstart

ReleasalizationJOB JOB

OrchestrationJOB JOB

ConfigurationJOB JOB

Server

ReleasalizationJOB JOB

OrchestrationJOB JOB

ConfigurationJOB JOB

Bootstrapping AMI/Kickstart

Server

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

ReleasalizationJOB JOB

OrchestrationJOB JOB

ConfigurationJOB JOB

Server

Bootstrapping AMI/Kickstart

Agenda 〜実践編〜

1: 各レイヤーの実践方法

2: JenkinsによるChef CI

3: Jenkins冗長化

4: やってみた結果

Jenkinsの役割 -今回-

● ソースコードのDeploy● UnitTestによるCI● サーバ構築の自動化管理

○ Chef○ Orchestration○ Serverspec

■ ChefのCI■ Releasalization

Chefの見直し

● ChefをConfigurationに適応○ 他サービスとの連携削除○ 冪等性の担保○ Cookbook間の依存をなくす

Chefの見直し

● ChefをConfigurationに適応○ 他サービスとの連携削除○ 冪等性の担保○ Cookbook間の依存をなくす

Chef開発方法の見直しが必要

Chefの開発方法 -これまで-

● ChefのCookbook作成● レシピ開発● (Chef Serverに登録)● EC2やVagrantでInstance起動● Chef実行● GitHubにpush

● ChefのCookbook作成● レシピ開発● (Chef Serverに登録)● EC2やVagrantでInstance起動● Chef実行● GitHubにpush

Chefの開発方法 -これまで-

つらい

Chefの開発方法 -要望-

● レシピを書いてすぐChefを実行できる● Serverspecでテストが簡単にできる● まっさらな状態が簡単に作れる

http://blog.docker.com/wp-content/uploads/2013/06/Docker-logo-011.png

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の開発方法 -結果-

ちょっとモダンな開発

ChefをChefらしく使う

Chefで構成管理とCIが実現

● ChefをConfigurationに適応○ 他サービスとの連携削除○ 冪等性の担保○ Cookbook間の依存をなくす

Agenda〜実践編〜

1: 各レイヤーの実践方法

2: JenkinsによるChef CI

3: Jenkins冗長化

4: やってみた結果

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の冗長構成

XXX.XXX.XXX.XXX

Jenkinsの冗長構成

【event】member-failed

XXX.XXX.XXX.XXX

Jenkinsの冗長構成

EIP付け替え要求

XXX.XXX.XXX.XXX

Jenkinsの冗長構成

XXX.XXX.XXX.XXX

Jenkinsの冗長構成

XXX.XXX.XXX.XXX

Jenkinsの冗長構成 with Serf

● 仕組みが単純○ Heartbeatなどを入れる必要がない

○ Jenkinsサーバ自体のdownを検知すれば自動で切り替

わる

● Serfの検知/伝播力高い○ 100台のClusterでも2秒程度しかかからないので

https://www.serfdom.io/docs/internals/simulator.html

Agenda 〜実践編〜

1: 各レイヤーの実践方法

2: JenkinsによるChef CI

3: Jenkins冗長化

4: やってみた結果

やってみた結果 -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が止まってはいけない○ 活用方法をもっと広く共有していきたい

ありがとう、Jenkins

私達からJenkinsへのメッセージ

Copyright 2015 CYBIRD Co., Ltd. All Rights Reserved.