devopsのアプローチと クラウド/バーチャル環境/構成管理ツール のお話
TRANSCRIPT
(※開発環境改め)DevOpsのアプローチと クラウド/バーチャル環境/構成管理ツール
のお話オープンセミナー2015@広島
『クラウド時代の構成管理入門』 Feb. 14. 2015
@sawanoboly(HiganWorks LLC, Opsrock LLC)
本日の内容…の前に 1/2•基本的なところからのんびり話していきます •広島のボルテージをよう知らん •時間もたっぷりあるので
•各思想・ツールに対して個人の解釈も多めです •あまり他人の話を聞かないのです
2
本日の内容…の前に 2/2•たまに話題のスコープが妙に拡大します • DevOpsが絡むと少々仕方ないです •細かい話には戻ります
•セッション中のインフラについて • (ほぼ)物理より上、アプリより下を指します
3
大本は2009年のFlickr発表•対立やめて協力しよう
6
http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr
DevOpsの目的まで広げてみる•個人の役割がDev/Opsだから?•開発部門/運用部門に所属しているから?• IT関連の会社(or 会社のIT部門)にいるから ※おつきあい含む=> 大抵がこの部分にあたる
9
DevOpsの目的まで広げてみる•個人の役割がDev/Opsだから?•開発部門/運用部門に所属しているから?• IT関連の会社(or 会社のIT部門)にいるから ※おつきあい含む=> 大抵がこの部分にあたる
•じゃあ会社の目的は?
9
身の回りの効率化をしておこう•ビジネスの変化に対応できる(かもしれない) •ほかでもつぶしが効くように •あわよくば会社全体のフローに影響を •継続的なデリバリーとか •コストの削減とか
•真にDevOpsするには経営陣の理解が必要 •せめて普段からやってないと説得力もない
16
hubを通して配布•アプリケーションコードと、動作するプラットフォームを同じように扱う
• Dev <=> Dev うれしい
25
App Code
Infra Code
App Code
Infra Code
アプリを支えるにはプラットホームが重要•OSインストール•手作業で試行錯誤•アプリコードを置くのはギリギリ
•結局最初に本番環境
27
検証用サーバ
App Code ?
•クリーンな状態からまた構築できるの?
Vagrantのアプローチ
28
バーチャルマシン構築Infra Code v0.1
Infra Code v1.0
バーチャルマシンInfra Code v0.x 構築 App
バーチャルマシン構築 App
破棄
破棄
復数の環境に同じコードを適用•バージョン管理ツールに乗せて、履歴も把握 •いつでもゼロから試せて修正もしやすい •時間のかかる構築は、スナップショットも使える
29
検証用サーバInfra Code v1.0
本番用サーバInfra Code v1.0
Providers: バーチャル環境を作る先•お手元系 • Virtualbox、VMWare、Hyper-Vなど
• IaaS系 • OpenStack、Cloudstackなどプライベート • AWS(EC2)、DigitalOceanなどパブリック
•コンテナ • Dockerなど
32
※3rdのプラグインを含みます
Provisionerは組み合わせ自由•まずはShellからはじめるのがオススメ •複数定義してもOK • shell-1つめ => chef => shell-2つめ など
• shellから少しづつ他のツールにうつすとか
35
Box = マシンイメージ•OSをインストールして幾らかVagrant用の設定を足したもの
•巷で配布されているのは、ほぼ素のOSインストール直後が多い
•毎回一から作るのは時間かかるというときは、Boxをつくってもよい
38
ちょっとプレビューして欲しい時•Vagrantfileのやりとりで済むとはいえ、アプリまで上げてもらうのはそこそこコストがかかります
41
App Code
Infra Code
App Code
Infra Code
Vagnant機能のまとめ•いろんな環境に対応可 •複数のバーチャルネットワーク •複数のバーチャルマシン •環境の共有は2通り • Vagrantfileでプロビジョニングコードとまとめて • Packerでboxに
•プレビューしてもらうならShareも
43
Chefの概要•米Chef Software(旧Opscode)の製品 •構成管理(Configration Management) • インフラの情報を収集・集約⇒ Chef-Server(Zero)/Chef-Repo
•リソース定義の記述から、そのとおりに収束⇒ Chef-Client ⇒ 今日はプロビジョニングツールの側面を
47
Chef(Client)の技術要素•インストールはRuby込みのパッケージで提供 • Ruby DSLで記述 • ERBテンプレートで環境依存のコンフィグを生成 •最小単位はリソース、それぞれ状態を定義する • file / service / package などOS向けリソース •クラウド上のインスタンス等、インフラリソース(※Chef-Provisioning)
48
リソース記述 = レシピ•リソースの状態を記述(レシピ)して実行すると ? •対象のリソースが記述と違えば修正 •リソースが記述どおりの状態なら何もしない
49
## nanoがインストールされた状態package ‘nano’
## nanoがアンインストールされた状態package ‘nano’ do action :removeend
先程のレシピをChef-Applyで とりあえず実行
50
$ echo "package 'nano'" | sudo chef-apply -sRecipe: (chef-apply cookbook)::(chef-apply recipe) * apt_package[nano] action install - install version 2.2.6-1 of package nano# ↑ 入ってないのでインストール
$ echo "package 'nano'" | sudo chef-apply -sRecipe: (chef-apply cookbook)::(chef-apply recipe) * apt_package[nano] action install (up to date)# ↑ 入ってるのでなにもしない
removeも試してみる
51
$ echo "package 'nano' do action :remove end" | sudo chef-apply -sRecipe: (chef-apply cookbook)::(chef-apply recipe) * apt_package[nano] action remove - remove package nano# ↑ 入っているのでアンインストール
$ echo "package 'nano' do action :remove end" | sudo chef-apply -sRecipe: (chef-apply cookbook)::(chef-apply recipe) * apt_package[nano] action remove (up to date)# ↑ 入っていないのでなにもしない
serviceリソースの例
52
$ cat << _EOL_ | sudo chef-apply -s> service 'cron' do> action [:enable, :start] # サーバ起動時に実行を有効と、今実行> end> _EOL_
Recipe: (chef-apply cookbook)::(chef-apply recipe) * service[cron] action enable (up to date) * service[cron] action start (up to date)
テンプレートの置換例
53
$ cat sample.erb hoge is <%= @hoge %>.
template 'sample.txt' do source 'sample.erb' local true variables({ hoge: 'piyo' })end
ERBテンプレート
テンプレートリソース
テンプレートで文字列を置換
54
$ sudo chef-apply template.rb Recipe: (chef-apply cookbook)::(chef-apply recipe) * template[sample.txt] action create - create new file sample.txt - update content in file sample.txt from none to 141d2b --- sample.txt 2015-02-13 02:42:55.197828606 +0000 +++ /tmp/chef-rendered-template20150213-21341-dzvsb6 2015-02-13 02:42:55.000000000 +0000 @@ -1 +1,2 @@ +hoge is piyo.
$ cat sample.txt hoge is piyo.
=>
$ cat sample.erb hoge is <%= @hoge %>. #=>
55
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
リソースからの階層構造
55
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Roleなど役割記述のファイル (option)
リソースからの階層構造
55
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Roleなど役割記述のファイル (option)
収集した各種状態の ファイル (option)
リソースからの階層構造
55
Chef-RepoCookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Roleなど役割記述のファイル (option)
収集した各種状態の ファイル (option)
リソースからの階層構造
55
Chef-RepoCookbook
+さらにその他色々 => インフラコード一式
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Roleなど役割記述のファイル (option)
収集した各種状態の ファイル (option)
リソースからの階層構造
55
Chef-RepoCookbook
+さらにその他色々 => インフラコード一式
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Cookbook
レシピ (x n)
リソースリソース
その他色々 (x n)
Roleなど役割記述のファイル (option)
収集した各種状態の ファイル (option)
リソースからの階層構造
Shellとプロビジョニングツールを比べる•OS(ディストリビューション)の違いを結構吸収•リソースに対する状態がひとまとまりで見やすい•違いだけ適用、状況依存の分岐処理記述が少ない•レシピは間違ってても悪影響が少ない • Syntaxエラーならそもそも走らない •ツールがこけても、サーバの状態に変更はない
56
Shellとプロビジョニングツールを比べる•OS(ディストリビューション)の違いを結構吸収•リソースに対する状態がひとまとまりで見やすい•違いだけ適用、状況依存の分岐処理記述が少ない•レシピは間違ってても悪影響が少ない • Syntaxエラーならそもそも走らない •ツールがこけても、サーバの状態に変更はない
•リソース同士の依存が書きやすい => 次へ56
リソース依存の例•httpd.conf •変更したらhttpdをリロードしたい •変更しなかったら特に何もしない
•レシピでは2通り • file(template)リソースからserviceリソースに通知 • serviceリソースがfile(template)リソースを監視
57
リソース依存のサンプル
•書きっぱなしで何度実行してもよいのが楽 •事前に変更点のある/なしを折り込まなくてよい
58
service ‘httpd’ do subscribes :relaod, file[httpd.conf]end # service => fileを見張る例
file ‘httpd.conf’ do notifies :relaod, service[httpd]end # file => serviceに通知の例
現状リソースをレシピに書き出す
64
既存サーバ
App Code
管理用なにか
サービス状態設定ファイル
ファイルもコピーでOK
why-run(dry-run)で確認しつつ 実行(特に何も変わらない)
現状リソースをレシピに書き出す
64
既存サーバ
App Code
管理用なにか
サービス状態設定ファイル
ファイルもコピーでOK
why-run(dry-run)で確認しつつ 実行(特に何も変わらない)
※繰り返し
じわじわレシピの要約•サーバにあるリソースをレシピに書いて実行する•Chefは未定義の属性を変更しないので雑でもOK •ファイルならownerとか、permission
• VagrantのProvisioningもこの手法で色々つくれる
66
じわじわレシピの要約•サーバにあるリソースをレシピに書いて実行する•Chefは未定義の属性を変更しないので雑でもOK •ファイルならownerとか、permission
• VagrantのProvisioningもこの手法で色々つくれる•欠点 •さすがにまあまあ事故りやすい •見落としもありがち (cron等単品ファイルとか)
66
状態テストからレシピの要約•先にテストを書く•テストが通る = サーバの状態が再現できている•テストはプロビジョニングツールに依存しない •使いまわせる •構成管理ツールの導入をあきらめてもテストは残る
73
状態テストからレシピの要約•先にテストを書く•テストが通る = サーバの状態が再現できている•テストはプロビジョニングツールに依存しない •使いまわせる •構成管理ツールの導入をあきらめてもテストは残る
•Opsは特にこちらの手法がよい
73
Devは•開発以降の環境に興味をもとう • Vagrantで共有し、ローカル番長をやめよう •インフラの知識も少し探ろう
•シェアする仕組み、範囲を絞ろう•デプロイメントが楽になる仕掛けやサービスを色々使おう • Opsに要望しよう (そうしないとNoOpsに走る)
80
Opsは•たいていが意識低い扱い •『結局導入できない』の言い訳に使われる
•VMやクラウドを活かして、開発初期からインフラを詰めてく、アプリも開発中からとにかくデプロイしていく
•ツールのエラーは読もう
82
Opsは•たいていが意識低い扱い •『結局導入できない』の言い訳に使われる
•VMやクラウドを活かして、開発初期からインフラを詰めてく、アプリも開発中からとにかくデプロイしていく
•ツールのエラーは読もう•XaaSは商売敵、使って手法を学ぼう (※そのまま利用も可)
82
Opsは•たいていが意識低い扱い •『結局導入できない』の言い訳に使われる
•VMやクラウドを活かして、開発初期からインフラを詰めてく、アプリも開発中からとにかくデプロイしていく
•ツールのエラーは読もう•XaaSは商売敵、使って手法を学ぼう (※そのまま利用も可)
• Devはユーザと捉えよう82
Provisionig(ほか)ツール選定•Devのアプリと同じ言語のツールをまず触るとよいです (※かなり個人的な見解です) •ツールチェーン •アプリのコードも読める(ようになる)
•基本どれも汎用的に使えるので応用がききます
86