書籍概要

WEB+DB PRESS plus

Chef実践入門
――コードによるインフラ構成の自動化

著者
発売日
更新日

概要

本書は,サーバ構築自動化・構成管理ソフトウェアである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社がメンテナンスするクックブック

  • 索引
  • 著者紹介

サポート

ダウンロード

本書で使用するサンプルファイルはダウンロードできます。以下のURLをクリックして,ダウンロードしてください。

(2014年5月21日更新)

https://github.com/wdpress/Chef_Practical_Guide

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2014年9月3日更新)

初版第1刷をお持ちの方(第2刷で修正済み)

P.157 リスト6.20 1行目

%w{git openssl-devel sqlite-devel}.each do |pkg|
%w{gcc git openssl-devel sqlite-devel}.each do |pkg|

P.164 リスト6.25 ページ上から17行目

< end %>
<% end %>

P.166 図6.31 末尾

$ bundle inst
(削除)

P.167 リスト6.30 冒頭

remote_file "/tmp/#{node['nodejs']['filename']}" do
%w{gcc-c++}.each do |pkg|
   package pkg do
     action :install
   end
end
remote_file "/tmp/#{node['nodejs']['filename']}" do

P.211 リスト7.17

SSH用のルール(templates/default/http.erb)
SSH用のルール(templates/default/ssh.erb)

初版第2刷をお持ちの方

P.97 「default.rb以外のレシピ」2段落1行目

apache2クックブック内のdeflate.rbというレシピ
apache2クックブック内のmod_deflate.rbというレシピ

補足情報

(2014年9月3日更新)

P.190 リスト7.1

本書で利用を前提としているCentOS 6.5のboxのアップデートにより,最新版ではPerlが削除されています。書籍の記述のままだとRPMのインストールに失敗しますので,次のように書き換えて実行してください。

remote_file "#{Chef::Config[:file_cache_path]}/#{rpmfile}" do
source "http://www.iddl.vt.edu/~jackie/analog/#{rpmfile}"
end

package "analog" do
action :install
source "#{Chef::Config[:file_cache_path]}/#{rpmfile}"
remote_file "#{Chef::Config[:file_cache_path]}/#{rpmfile}" do
source "http://www.iddl.vt.edu/~jackie/analog/#{rpmfile}"
end

package 'perl' do
action :install
end

package "analog" do
action :install
source "#{Chef::Config[:file_cache_path]}/#{rpmfile}"

商品一覧