目次
- はじめに
- 謝辞
- サンプルコードのダウンロード
- 初出一覧
第1章:DevOpsの潮流とChef
1.1 今なぜChefが注目されているのか
- ビジネス速度の変化
- ソフトウェア開発プロセスの変化
- 開発と運用の対立
- 開発者と運用者の考えの違い
- DevOpsとは
1.2 Infrastructure as Code
- 従来型のインフラ構築の問題点
- コードによるインフラ記述の優位性
- コードによるインフラ構築の実現方法
- シェルスクリプト
- デプロイツール
- インフラ構築自動化ツール
1.3 Chefの概要
- Chefの歴史と提供形式
- Chefの動作イメージ
- Chef Server/Chef Client
- Chef Solo
- Chefの動作環境
- Chefの特徴とPuppetとの違い
- Rubyを使って設定を記述する
- 記述した順番に処理が実行される
- そのほかの違い
- Chefを利用している著名な企業
第2章:Chef Soloによるローカル開発環境の自動構築
2.1 Chef Soloとは
2.2 検証環境を構築する
- 想定する環境
- VirtualBoxとVagrantとは
- VirtualBoxをインストールする
- Vagrantをインストールする
- 仮想イメージを取得する──vagrant box add
- 仮想サーバを起動する──vagrant up
- 仮想サーバを停止/破棄する──vagrant halt/destroy
- SSH周りの設定を行う
- 仮想サーバのネットワーク設定を行う
2.3 Chef Soloをインストールする
2.4 Chefを動かしてみる
- Chefの用語
- knifeコマンドでクックブックを作成する
- レシピを編集する
- Chef Soloを実行する
2.5 Chef Soloでパッケージをインストールする
- dstatパッケージをインストールする
- Chefのレシピとクロスプラットフォーム
- Chef Soloを再度実行してみる
2.6 knife-soloでchef-soloをリモート実行する
- knife-soloとは
- knife-soloでリポジトリを作る
- knife-soloでChef Soloをインストールする
- クックブックを作成する
- 好きなエディタでレシピを編集する
- Nodeオブジェクトでサーバの状態を記述する
- ノードとは
- ノードの状態を設定するNodeオブジェクト
- knife-soloでChef Soloを実行する
2.7 Chef SoloでApache,MySQLをセットアップする
- クックブックを作成する
- Nodeオブジェクトを設定する
- Apacheのレシピを書く
- MySQLのレシピを書く
- Chef Soloを実行する
- ブラウザから動作確認する
- Apacheの設定ファイルをChefで取り扱う
- もとになる設定ファイルをVagrantの共有ディレクトリ経由でコピーする
- オリジナルの設定ファイルをコピーする
- 設定ファイルを編集する
- レシピにtemplateリソースを記述する
- 設定ファイルを実際に配備する
- 仮想サーバを破棄して,再度Chef Soloを実行してみる
2.8 Chefリポジトリの扱い
- リポジトリをGitで管理する
- リポジトリのディレクトリレイアウト
- Berksfile
- Vagrantfile
- cookbooksディレクトリ
- data_bagsディレクトリ
- environmentsディレクトリ
- nodesディレクトリ
- rolesディレクトリ
- site-cookbooksディレクトリ
- クックブックのディレクトリレイアウト
2.9 Vagrant以外のサーバへChefを実行する
2.10 Chefの考え方
- 冪等性(idempotence)
- 「手順」ではなく「状態」を定義する
- 状態を「収束」(convergence)させる
- すべての状態はクックブックへ
- アプリケーション領域との切り分け
第3章:レシピの書き方
3.1 リソースとは
3.2 td-agentのレシピを読む
- groupとuser
- directory
- AttributeとOhai
- template,package,service
3.3 主要なリソースの解説
- package
- 基本的な使い方
- 複数パッケージをインストールする
- バージョンを指定する
- パッケージを削除する
- パッケージを指定する
- オプションを指定する
- service
- 基本的な使い方
- Notificationとserviceを組み合わせる
- Notificationのタイミング
- Subscribe
- template
- 基本的な使い方
- テンプレート内ではAttributeが使える
- userとgroup
- user
- group
- directory
- cookbook_file
- 基本的な使い方
- チェックサムを利用する
- インフラレイヤのリソース
- ifconfig
- mount
- script
- script(bash)
- creates
- not_if,only_if
- EC2のマイクロインスタンスにスワップファイルを作る例
3.4 そのほかのリソース
- git
- gem_package
- cron
- file
- http_request
- link
- route
- ruby_block
3.5 AttributeとData Bag
- Attribute
- Attributeの初期値
- Attributeはノードの属性
- Data Bag
- 各ノードで共有したいデータを準備する
- データを利用する
- データを暗号化する
3.6 クックブックのディレクトリレイアウト
- CHANGELOG.md,README.mdファイル
- attributesディレクトリ
- definitionsディレクトリ
- filesディレクトリ
- librariesディレクトリ
- metadata.rbファイル
- providers,resourcesディレクトリ
- recipes,templatesディレクトリ
第4章:クックブックの活用
4.1 コミュニティクックブックを利用する
- コミュニティクックブックを探す
- クックブックを検索する
- クックブックの詳細を見る
- クックブックの一覧を取得する
- Berkshelfでクックブックをインポートする
- コミュニティクックブックを使う
- yum-epelクックブックを使う
- default.rb以外のレシピ
- クックブック名が衝突した場合
- apache2のクックブックを使う
4.2 Chef Soloで複数ノードを管理する
- VagrantのマルチVM機能
- Nodeオブジェクト
- ロール
- ロールを設定する
- ロールを適用する
- 複数のロールを割り当てる
- ロールでAttributeを管理する
- Environments
- Environmentsの記述のしかた
- Attributeの優先度
- 複数ノードへChef Soloを実行する
- xargs
- 外部ツールと連携する
第5章:Vagrantによるクックブック開発環境の構築
5.1 Vagrantから直接クックブックを適用する
- Vagrantfileへの記述
- Chef Client/Chef Soloを自動インストールする
- Vagrant起動時にプロビジョニングを実行する
- 随時プロビジョニングを実行する
5.2 Saharaを使って何度もクックブック適用を試す
- Saharaを導入する
- Saharaによるロールバックを試す
- sandboxモードから抜ける
- sandboxモードの状態を確認する
5.3 Packerで開発環境用のboxを作成する
- Packerをインストールする
- CentOSのboxを作成する
- Packerの設定を記述する
- OSの初期設定を記述する
- 必要なソフトウェア群の設定を記述する
- マシンイメージをビルドする
- Vagrantにboxを登録する
- 作成したboxを起動する
5.4 変更を加えたboxを配布する
5.5 VagrantでVMware Fusionを利用する
- VMware Fusionをインストールする
- Vagrant VMware Fusion Providerを購入する
- Vagrant VMware Fusion Providerをインストールする
- VMware Fusionを使ってVagrant仮想サーバを起動する
- boxを追加する
- boxを起動する
5.6 VagrantでAmazon EC2を利用する
- vagrant-awsプラグインを導入する
- dummy boxを導入する
- セキュリティグループを作成する
- キーペアを作成する
- 環境変数を設定する
- Vagrantfileを作成する
- EC2インスタンスを起動する
第6章:アプリケーション実行環境の自動構築
6.1 PHP環境を構築する
- nginxを導入する
- Bundlerを導入/実行する
- vagrant initコマンドを実行する
- クックブックを作成する
- レシピを作成する
- Berksfileを編集する
- berks installコマンドを実行する
- Vagrantfileを編集する
- プロビジョニングを実行する
- 動作確認する
- PHPを導入する
- クックブックを作成する
- レシピを作成する
- Vagrantfileを編集する
- Berksfileを編集する
- プロビジョニングを実行する
- nginxの設定を調整する
- レシピを修正する
- プロビジョニングを実行する
- OPcacheを導入する
- レシピを修正する
- プロビジョニングを実行する
- 動作確認する
- PHP 5.5をインストールする
- レシピを作成する
- PHP 5.3と共存しないようにVagrantfileを編集する
- プロビジョニングを実行する
- 動作確認する
6.2 Ruby環境を構築する
- rbenvでRubyをインストールする
- レシピを作成する
- Attributeで初期値を設定する
- templateで環境変数を変更する
- プロビジョニングを実行する
- 動作確認する
- ruby-buildをインストールする
- レシピを修正する
- プロビジョニングを実行する
- 動作確認する
- Unicornとnginxをインストールする
- レシピを修正する
- テンプレートを修正する
- Attributeで初期値を設定する
- プロビジョニングを実行する
- 動作確認用にRuby on Railsのプロジェクトを作成する
- Gemfileを修正/Bundlerを実行する
- Unicornの設定ファイルを作成する
- Node.js導入のためにクックブックを作成する
- Node.js導入のためにBerksfileの修正する
- Node.js導入のためにクックブックを作成する
- Node.js導入のためにAttributeで初期値を設定する
- Node.js導入のためにVagrantfileを編集する
- Node.js導入のためにプロビジョニングを実行する
- 動作確認する
6.3 MySQLを構築する
- MySQLを導入する
- クックブックを作成する
- Berksfileを編集する
- Attributeで初期値を設定する
- レシピを作成する
- Vagrantfileを編集する
- MySQL導入のためにプロビジョニングを実行する
- レプリケーションを実現する
- マスタ,スレーブ2台の仮想サーバを作成する
- マスタを設定する
- スレーブ用アカウントを作成する
- レプリケーションに必要な設定をレシピに追加する
- マスタとスレーブにプロビジョニングを行う
- レプリケーション動作確認のためにテーブルを作成する
- テーブルをロックし,バイナリログの状態を確認する
- データベースをバックアップし,テーブルロックを解除する
- データベースをコピーする
- レプリケーションの開始と確認を行う
- マスタでデータを追加する
- スレーブでデータ追加を確認する
- レプリケーション構成で日次バックアップをとる
- シェルスクリプトを作成する
- レシピを作成する
6.4 Fluentdを構築する
- Fluentdを導入する
- クックブックを作成する
- Berksfileを編集する
- レシピを作成する
- Attributeで初期値を設定する
- プロビジョニングを実行する
- Fluentdを起動する
- RubyGemsからインストールしたFluentdを起動する
- RPMからインストールしたFluentdを起動する
第7章:テスト駆動インフラ構築
7.1 インフラ構築用のコードにテストを用意する意味
7.2 Test Kitchenによるテスト
- テスト作成の準備を行う
- クックブックを作成する
- Test Kitchenをインストールする
- .kitchen.ymlを設定する
- テストを記述する
- Batsでテストを記述する
- minitestでテストを記述する
- serverspecでテストを記述する
- テストを実行する
- バージョン管理システムへ登録する
- Test Kitchenのコマンド
7.3 継続的インテグレーション
- クックブックの継続的なテスト
- Jenkinsをインストールする
- VirtualBoxとVagrant環境を準備する
- Ruby環境を準備する
- プラグインをインストールする
- ジョブを作成する
- ジョブを実行する
- 複数のクックブックをまとめてテスト
- テスト用のクックブックを作成する
- 依存関係を定義する
- レシピを作成する
- テンプレートを作成する
- テストを作成する
- テストを実行する
第8章:Chefをより活用するための注意点
8.1 Chefユーザの共通の悩み
- 何から手を付けてよいかわからない
- 書いたレシピがエラーになってしまう
- 自分の書き方が正しいかわからない
8.2 共通の悩みを解消する基本的な方針
- シェルでの作業をレシピに置き換える
- エラーの原因の確認方法を知る
- 定義済みのキーワードのタイプミス
- クオートや節の閉じ忘れ
- 記号のエスケープし忘れ
- サーバで実行されたコマンドのエラー
- 公開されているクックブックから学ぶ
- Opscode
- Basecamp
- その他のコミュニティクックブック
- クックブックを書くべきとき,そうでないとき
8.3 レシピの書き方の注意点
- 重複する記述をループで処理する
- クックブックへのハードコーディングを避ける
- if文ではなく条件付きアクションを使う
- ツールを使ってクックブックを検査する
8.4 Chefをデプロイツールとして使う際の問題点
- Applicationクックブックの利用
- データ作成・スキーマ変更
- 障害発生時のロールバック
8.5 大きくなったクックブックを分割する
- 大きなクックブックの利点と欠点
- クックブックを分割するためのテクニック
- 1つのレシピに記述した例
- ソフトウェアごとにクックブックを分割した例
- 1つのソフトウェア内でレシピを分割する
- 複数ディストリビューションに対応したクックブック
8.6 クックブックと実際の環境の食い違い
- クックブックと環境が食い違ってしまう原因
- クックブックの適用頻度をコントロールする
- アンインストールやファイルの削除をクックブックで行う
8.7 クックブックの依存関係を管理する
- Git
- Librarian-Chef
- インストールする
- Chef社のコミュニティクックブックを導入する場合
- Chef社以外のコミュニティクックブックを導入する場合
- Berkshelf
- インストールする
- Chef社のコミュニティクックブックを導入する場合
- Chef社以外のコミュニティクックブックを導入する場合
- クックブックを導入する
- クックブックを任意の場所に収集する
8.8 Chefのレシピが実行されるまでのサイクル
- Chefの実行サイクルとリソースコレクション
- 実行の順番を確認する
- リソースの処理をただちに実行するには
- Rubyスクリプトの実行タイミング
- 通知(Notification)を活用する
8.9 Chefを拡張する
- knifeプラグイン
- 主要なknifeプラグイン
- インストールする
- 作成する
- Ohaiプラグイン
- 作成する
- 実行する
- 実環境へ反映する
- 公開されているプラグイン
- Chefプラグイン
- Definition
- 作成する
- 実行する
- 使いどころ
- LWRP
- 作成する
- 使いどころ
第9章:Chef Serverによる本番環境の構築と運用
9.1 Chef Serverを利用するメリット
- Search機能でロールなどの絞り込みができる
- クックブックの同期作業をしなくてよい
- [Column]Chef ServerにおけるClient(クライアント)とNode(ノード)の違い
- Chef Clientをデーモンとして扱うこともできる
9.2 Chef Serverをセットアップする
- Chef Serverをダウンロードしインストールする
- ダウンロードリンクを取得する
- インストールする
- 名前解決を確認する
- セットアップを実行する
- 動作確認用のテストを実行する
- Chef Serverの設定を変更する
- [Column]テストでエラーが出力された場合
- Chef Serverでのオペレーション
- Chef ClientからChef Serverへ接続してみる
- Chef Clientを準備する
- Chef Clientを実行する
9.3 knifeコマンドを利用したオペレーション
- knifeをセットアップする
- knifeの主なサブコマンド
- knifeの基本的な使い方
- クライアントを一覧表示する
- クライアントを作成する
- クライアントを表示する
- クライアントを編集/更新する
- クライアントを再登録する
- クライアントを削除する
9.4 Chef Serverを使った運用フロー
- クックブックを登録する
- ノードを登録する
- ロールを登録する
- クライアントで設定を適用する
- Chef Serverと認証する
- chef-clientコマンドを実行する
第10章:Chef Serverによる大規模システムの構築と運用
10.1 Chefを使って大量サーバへ一括適用する
- Chef Clientをデーモンとして起動する
- 各ノードでchef-clientコマンドを一括実行する
- tomahawkを利用する
- knife sshコマンドを利用する
10.2 大量物理サーバへ迅速にセットアップする
- PXE+Kickstart+Chefでサーバをセットアップする
- 導入の流れ
- KickstartでChef Clientを設定する
- Chef Clientの設定内でサーバ自身のノード名を指定する
- %postインストールスクリプトに記述する内容
10.3 Ohaiでマシンの情報を収集して活用する
10.4 複数メンバーでレシピ開発する際のリポジトリ運用
- 共用利用可能なChefリポジトリ
- [Column]データベースのバックアップ
- 複数のChef Server(+Jenkins)
- テストプラットフォーム
10.5 Chefを活用して監視の自動設定を行う
Appendix A:コマンドチートシート
A.1 knifeコマンド
- bootstrap
- client
- configure
- cookbook
- cookbook site
- data bag
- delete
- deps
- diff
- download
- edit
- environment
- exec
- index rebuild
- list
- node
- raw
- recipe list
- role
- search
- show
- ssh
- status
- tag
- upload
- user
A.2 chef-soloコマンドのオプション
A.3 Ohaiで取得できる項目の例
Appendix B:クックブックチートシート
B.1 各リソース共通の機能
- :nothingアクション
- Attribute
- ガード条件
- ガード条件に指定できる引数
- Attributeの遅延評価
- notification
- Timer
- 相対パス
B.2 リソース
- package
- アクション
- Attribute
- プロバイダ
- 利用例
- chef_gem
- 利用例
- cookbook_file
- アクション
- Attribute
- 利用例
- file
- 対応するアクションとAttribute
- 利用例
- remote_file
- Attribute
- 利用例
- template
- Attribute
- 利用例
- service
- アクション
- Attribute
- プロバイダ
- 利用例
- execute
- アクション
- Attribute
- 利用例
- script
- Attribute
- プロバイダ
- 利用例
- powershell_script
- Attribute
- 利用例
- ruby_block
- アクション
- Attribute
- 利用例
- cron
- アクション
- Attribute
- 利用例
- deploy
- アクション
- Attribute
- 利用例
- directory
- アクション
- Attribute
- 利用例
- env
- 対応するアクションとAttribute
- erl_call
- 対応するアクションとAttribute
- git
- アクション
- Attribute
- 利用例
- subversion
- アクション
- Attribute
- 利用例
- user
- アクション
- Attribute
- 利用例
- group
- アクション
- Attribute
- 利用例
- mount
- アクション
- Attribute
- 利用例
- ifconfig
- アクション
- Attribute
- 利用例
- http_request
- アクション
- Attribute
- 利用例
- link
- アクション
- Attribute
- 利用例
- log
- アクション
- Attribute
- 利用例
- mdadm
- アクション
- Attribute
- 利用例
- ohai
- 対応するアクションとAttribute
- 利用例
- registry_key
- アクション
- Attribute
- 利用例
- remote_directory
- 対応するアクションとAttribute
- 利用例
- route
- アクション
- Attribute
- 利用例
B.3 Recipe DSL
- attribute?
- cookbook_name,recipe_name
- data_bag,data_bag_item
- platform?
- platform_family?
- resources
- search
- tag,tagged?,untag
- value_for_platform
- value_for_platform_family
B.4 Windows向けDSL
- registry_data_exists?
- registry_get_subkeys
- registry_get_values
- registry_has_subkeys?
- registry_key_exists?
- registry_value_exists?
B.5 Chef社がメンテナンスするクックブック
- 索引
- 著者紹介