WEB+DB PRESS plus Chef実践入門 ――コードによるインフラ構成の自動化
- 吉羽龍太郎,安藤祐介,伊藤直也,菅井祐太朗,並河祐貴 著
 - 定価
 - 3,047円(本体2,770円+税10%)
 - 発売日
 - 2014.5.22[在庫なし] 2014.12.10
 - 判型
 - A5
 - 頁数
 - 392ページ
 - ISBN
 - 978-4-7741-6500-4 978-4-7741-7013-8
 
概要
本書は、サーバ構築自動化・構成管理ソフトウェアであるChefの解説書です。まずはスタンドアロンで利用できるChef Soloを利用し、設定ファイルとなるクックブックの書き方を解説します。そして、現場でよく利用する環境をChefを使って構築するためのノウハウや、クックブックのテスト、継続的インテグレーションなど実践的な解説も行います。後半では、つまずきがちなポイントや、Chef Serverを利用した大規模環境の構築・運用方法を解説しています。コードを出しながら解説しているので、すぐに役立つ知識が身に付くはずです。
こんな方にオススメ
- インフラの管理を効率化したいインフラエンジニア、アプリケーションエンジニアの方
 
目次
- はじめに
- 謝辞
 - サンプルコードのダウンロード
 
 - 初出一覧
 
第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社がメンテナンスするクックブック
- 索引
 - 著者紹介
 
プロフィール
吉羽龍太郎
第1章、第7章を担当。クラウドコンピューティング、DevOps、インフラ構築自動化、アジャイル開発、テスト自動化を中心としたコンサルティングを生業としている。認定スクラムプロフェショナル(CSP)/認定スクラムプロダクトオーナー(CSPO)/認定スクラムマスター(CSM)/Microsoft MVP for Visual Studio ALM。
安藤祐介
第8章、巻末リファレンス担当。(株)Engine YardにてPHP、Rubyを使用するソフトウェア開発とPaaS導入の支援に携わる。コミュニティ活動としては子ども向けのプログラミング教室、CoderDojoなどにも参加し幅広く活動中。
伊藤直也
第2章、第3章、第4章を担当。元・(株)はてな執行役員最高技術責任者(CTO)。グリー(株)を経て、2012年よりフリーとなり、2013年からKAIZEN platform Inc.技術顧問。id:naoya。
菅井祐太朗
第5章、第6章を担当。Ruby on RailsでのWebアプリケーションをサーバサイドから支えるエンジニアとして活動し、現在はウェブペイ(株)に在籍。北海道を心から愛している。
並河祐貴
第9章、第10章担当。これまで、数々のオープンソースソフトウェアの検証/導入/運用や、クラウドサービスを利用したサービス構築/運用を実践。現職の(株)サイバーエージェントで大規模にChefを導入した事例は国内でも早い段階から知られ、現在のChef人気の礎を築く。