コンテンツにスキップ

Chef

Chef のリモート実行

前回 対象サーバで直接 Chef を実行してみました。

今回は手元からリモートのサーバに対して Chef を実行する仕組みを試してみます。

knife-solo のインストール

手元のクックブックをリモートのサーバに転送して chef-solo コマンドを実行するまでの一連の作業を実行できる knife-solo コマンドをインストールする

knife-solo コマンドは gem でインストールできる。手元の Mac OS でインストール

$ sudo gem install knife-solo
...
Thanks for installing knife-solo!
...
36 gems installed

Berkshelf のインストール

クックブックの依存関係を管理する Berkshelf というツールもこのタイミングでインストールする。これは knife-solo が他の gem のインストール状況によってデフォルトのオプションが変わるため

$ sudo gem install berkshelf
...
25 gems installed

ローカルにリポジトリを作る

まずはローカルにリポジトリを作る

Vagrantfile があるディレクトリで以下のコマンドを実行して作成する

$ knife solo init .
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/specification.rb:2007:in `raise_if_conflicts': Unable to activate rspec-3.0.0, because rspec-core-3.4.0 conflicts with rspec-core (~> 3.0.0), rspec-expectations-3.4.0 conflicts with rspec-expectations (~> 3.0.0), rspec-mocks-3.4.0 conflicts with rspec-mocks (~> 3.0.0) (Gem::LoadError)

エラーが発生した

rspec と rspec-core のバージョンが合っていなかったので rspec を update する

$ sudo gem update rspec
...
Gems updated: rspec rspec-collection_matchers

再度リポジトリの作成を実行

$ knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...

これで実行ディレクトリ内に様々な雛形ディレクトリ、ファイルが作成された

リモートのサーバに Chef Solo をインストールする

今回リモートサーバとして想定する Vagrant の環境に対して SSH の設定を以下のようにしておく

$ vagrant ssh-config --host testhost >> ~/.ssh/config

以下のコマンドで Chef Solo をリモートサーバに対してインストール

$ knife solo bootstrap testhost
Bootstrapping Chef...
...
Thank you for installing Chef!
...
Chef Client finished, 0/0 resources updated in 06 seconds

今回は前回 Chef Solo をインストールした環境に対して打ったので最終的な結果は 0/0 resources updated になっている

クックブックの作成

ローカルにクックブックを作成する。今回は git をインストールするためのクックブックを作る

自作のクックブックは site-cookbooks 以下に置くことが慣例になっているので出力先に site-cookbooks を指定している

$ knife cookbook create git -o site-cookbooks

これで site-cookbooks 以下に git クックブックの雛形が出来上がる

レシピの編集

レシピの雛形 site-cookbooks/git/recipes/default.rb を編集していく

$ vim site-cookbooks/git/recipes/default.rb
$ cat site-cookbooks/git/recipes/default.rb
#
# Cookbook Name:: git
# Recipe:: default
#
# Copyright 2015, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "git" do
    action :install
end

Node オブジェクトの編集

Chef で管理する Node (サーバ)の状態を記述し、それぞれの Node に対してどのクックブックが適用されるかを設定する Node オブジェクトを編集する

Node オブジェクトは knife solo bootstrap testhost 実行時に nodes/testhost.json として作成されている

今回はここに先ほど作成した git クックブックの適用を記述する

$ vim nodes/testhost.json
$ cat nodes/testhost.json 
{
  "run_list": [
    "recipe[git]"
  ],
  "automatic": {
    "ipaddress": "testhost"
  }
}

クックブックの実行

準備が整ったのでいよいよクックブックをリモートサーバに対して実行する

以下のコマンドで実行

$ knife solo cook testhost
Running Chef on testhost...
...
Chef Client finished, 0/1 resources updated in 07 seconds

これも同じく前回の環境ですでに git をインストール済みなので 0/1 resources updated として正常に実行された

これでリモートへの Chef 実行完了!

参照

初めてのChef

Chef を使ってみます。 Vagrant で環境をつくっておいてそこで色々試してみます。

今回はゲスト側でクックブック、レシピを作って実行してみます。

Chef のインストール

vagrant ssh で Vagrant の環境に入って Chef をインストールする

$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
...
Thank you for installing Chef!

Chef Solo がインストールされているか確認

$ chef-solo -v
Chef: 12.5.1

クックブックを作る

Chef をインストールすると knife というコマンドもインストールされる。 この knife コマンドを使ってクックブックを作る

今回は git をインストールするための git クックブックを作る

コマンドは以下のように指定する

knife cookbooks create [クックブック名]

今回は出力先を指定する -o オプションを指定

$ sudo knife cookbook create git -o /var/chef/cookbooks

このコマンドで git という名前のクックブックが作成され、 /var/chef/cookbooks/git/recipes/default.rb にレシピの雛形が作られる

レシピの編集

レシピの雛形に git をインストールするレシピを書く

$ sudo vi /var/chef/cookbooks/git/recipes/default.rb
$ cat /var/chef/cookbooks/git/recipes/default.rb
#
# Cookbook Name:: git
# Recipe:: default
#
# Copyright 2015, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

package "git" do
  action :install
end

クックブックの実行

作成したクックブックを実行する

$ sudo chef-solo -o git
...
Compiling Cookbooks...
Converging 1 resources
Recipe: git::default
  * yum_package[git] action install
    - install version 1.7.1-3.el6_4.1 of package git

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 38 seconds

git がインストールされたか確認

$ git --version
git version 1.7.1

Chef の特徴

OS の違いを吸収してくれる

上記 git の例ではこちらで指定していないにも関わらず、実行した環境が CentOS であることを解釈して yum パッケージでインストールが行われた

実行された環境の OS 毎の違いを吸収してくれる

冪等性が担保されている

先ほどのクックブックをもう一度実行してみる

$ sudo chef-solo -o git
...
Chef Client finished, 0/1 resources updated in 07 seconds

今回は何もせずに正常に終了したことが分かる

Chef ではクックブックを何度実行しても、クックブックに規定された状態になる冪等性が担保されている

参照

余談: Chef に関する記事は web 上にも色々ありますが、 Chef は用途によって様々なツール、使い方があり、基本的な用語や概念などを理解できていないと思わぬところでハマってしまいがちです。 Chef 実践入門 は Chef に関して体系的に理解できるので最初にサラッと読んでしまうのが近道だと感じました。