knife-soloによるChefの実行

  • 214
    Like
  • 0
    Comment
More than 1 year has passed since last update.

前提

knifeとは

Chefレポジトリを操作するためのツール。

chef solo環境で利用するのは主に以下の二つ
・knife cookbook(クックブックの作成)
・knife solo

前者は生のchef soloを利用する場合に用いる。
詳しくは以下。

Chefの基本
http://qiita.com/kidachi_/items/9d569b8673e70ef93f0e

knife-soloとは

今回のトピックはこちら。
それ単体でリポジトリやクックブックの作成、実行まで一括して行ってくれる。
基本はchef soloを利用したい場合はこのknife soloに頼ればok。

knifeの初期設定

$ knife configure

諸々の質問事項は全てデフォルトでok。
初期化が完了すると
~/.chef/knife.rbに設定ファイルが保存される。

knife-solo

knifeのプラグイン(gem)。
chef solo利用にあたり便利な機能をknifeに追加する。
手元(ホストOS)のレシピをリモートにrsyncでゲストOS側に転送した後
chef-soloを実行し、その出力を送り返してくれる便利機能などが付属。

chef-soloだとchefを流す対象(リモートのサーバ)にログインして
そこでchef-soloする必要があるが、
knife-soloならローカルからホストを指定して流せば良いので手軽。

インストール

$ gem install knife-solo

ver0.3.0の場合は、knifeの設定ファイル~/.chef/knife.rbに
knife-soloが利用するテンポラリディレクトリのパスを設定する。

knife.rb
knife[:solo_path] = '/tmp/chef-solo'

knifeによるリポジトリの生成

$ knife solo init chef-repo

chef-soloに最適なレイアウトでChefリポジトリを作ってくれる。

構成

$ ls -1 chef-repo
cookbooks/
data_bags/
nodes/
roles/
site-cookbooks/

site-cookbooks配下に新たなcookbookを作成する

$ knife cookbook create <cookbook_name> -o site-cookbooks

※chef-repo/cookbooksとchef-repo/site-cookbooksの違い(推奨の使い方)
前者はダウンロードしてきたサードパーティのcookbooksを、
後者には自分で作成したcookbooksを入れる。

knifeの各設定

プロジェクト直下の.chef/knife.rbで設定する。
※knife configureの際生成される~/.chef/knife.rbとは別なので注意!

chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'taniguchidaiki'
client_key               '/work/OPServer/.chef/hoge.pem'
validation_client_name   'chef-validator'
validation_key           '/etc/chef-server/chef-validator.pem'
chef_server_url          'https://kidachi.local:443'
syntax_check_cache_path  '/work/OPServer/.chef/syntax_check_cache'

role_path '/work/OPServer/roles'
# 上記の通り、cookbooksでなくsite-cookbooks
cookbook_path  '/work/OPServer/site-cookbooks'
data_bag_path '/work/OPServer/data_bags'

knife[:solo_path] = '/tmp/chef-solo'

レシピ転送&リモート実行コマンド一覧


# 指定hostに対してchef-soloをインストール
# 以後リモートホスト上でchef-soloが通るように、いい感じに調整してくれる。
$ knife solo prepare <host>
$ knife solo prepare <user>@<host>

# <host>でchef-soloを実行させる
$ knife solo cook <host>

# run_listを個別に指定(ver0.3.0以降)
$ knife solo cook <host> -o hello::default, nginx::default

# <host>に転送したレシピ群を削除
$ knife solo clean <host>

# 新規Chefリポジトリを作成
$ knife solo init chef-repo

※knife-soloがssh経由でchef-soloを実行する際、sshに使われるログインユーザはsudoかつパスワードなしでchef-soloを実行できる権限を持っている必要あり(VagrantやEC2は初期状態でOK)。

※複数サーバにknife-soloしたい場合は、

$ echo node1 node2 node3 | xargs -n 1 knife solo cook

指定hostにchef-soloをインストール

実際にやってみる。

$ knife solo prepare 192.168.33.10
Bootstrapping Chef...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
101  6790  101  6790    0     0    944      0  0:00:07  0:00:07 --:--:-- 17146
Downloading Chef 11.6.2 for el...
Installing Chef 11.6.2
警告: /tmp/tmp.1zXqJZ9U/chef-11.6.2.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
準備中...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!
Generating node config 'nodes/192.168.33.10.json'...

成功。

ホストOSからknife-soloする際の注意

通常の方法でssh出来るようにしておく。
→knife-soloの際、ホストからゲストへ通常のsshアクセス、つまり

$ ssh 192.168.33.10

でsshできるようになっている必要がある。

~/.ssh/configに以下追記。

# ~/.ssh/config
Host 192.168.33.*
IdentityFile ~/.vagrant.d/insecure_private_key
User vagrant

run_listの設定

chef-repos内のnodesディレクトリ内jsonファイル(今回は192.168.33.10.json)に
run_list(実行したいレシピ名)を記述する。

102.168.33.10.json
{
    "run_list":[
      "recipe[apache]",
      "recipe[build-essential]",
      "recipe[chef_handler]",
      "recipe[git]",
      "recipe[iptables]",
      "recipe[mysql55]",
      "recipe[php54]",
      "recipe[postfix]",
      "recipe[runit]",
      "recipe[yum]"
    ]
}

knife-solo実行

※レシピは既成とする。

$ knife solo cook 192.168.33.10

いろいろエラーが出た。

エラー1

WARNING: Local cookbook_path '/var/chef/cookbooks' does not exist
WARNING: Local cookbook_path '/var/chef/site-cookbooks' does not exist
WARNING: Local role_path '/var/chef/roles' does not exist
WARNING: Local data_bag_path '/var/chef/data_bags' does not exist

path設定がデフォルトのままだったのでこけた。

Vagrantfileに適切なpathを設定し、vagrant reload。

   config.vm.provision :chef_solo do |chef|
     chef.cookbooks_path = "/work/chef-repo/cookbooks"
     chef.roles_path = "/work/chef-repo/roles"
     chef.data_bags_path = "/work/chef-repo/data_bags"
  #   chef.add_recipe "mysql"
  #   chef.add_role "web"
  #
  #   # You may also specify custom JSON attributes:
  #   chef.json = { :mysql_password => "foo" }
   end

※ちなみにこの設定は~/.chef/knife.rbの設定に上書きされる。
※今回は knife solo initを使っていなかったので、rolesとdata_bagsディレクトリがそもそも存在していなかった。chef-repo配下に自分で作成して解決。

エラー2

Recipe: mysql55::default
  * package[mysql-server] action install
================================================================================
Error executing action `install` on resource 'package[mysql-server]'
================================================================================

Chef::Exceptions::Package
-------------------------
Version 5.5.32-1.el5.remi of mysql-server not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6)
Recipe: php54::default
  * package[php] action install
================================================================================
Error executing action `install` on resource 'package[php]'
================================================================================


Chef::Exceptions::Package
-------------------------
Version 5.4.20-1.el5.remi of php not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6)

mysql、phpそれぞれ、レシピで指定したバージョンが見つからないと。

yumからinstall可能なmysqlをチェック

[vagrant@localhost ~]$  yum --enablerepo=epel,remi,rpmforge info mysql
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Available Packages
Name        : mysql
Arch        : x86_64
Version     : 5.1.69
Release     : 1.el6_4
Size        : 907 k
Repo        : updates
Summary     : MySQL client programs and shared libraries
URL         : http://www.mysql.com
License     : GPLv2 with exceptions
Description : MySQL is a multi-user, multi-threaded SQL database server. MySQL is a
            : client/server implementation consisting of a server daemon (mysqld)
            : and many different client programs and libraries. The base package
            : contains the standard MySQL client programs and generic MySQL files.

Versionが古い。またRepoがCentOSデフォルト(updates)になっている。
→epel/remiリポジトリを追加する。

リポジトリを追加/有効化する

CentOSにyumリポジトリを追加
http://qiita.com/kidachi_/items/40f862181050b78b9cc7
//TODO 本当はここもChef化したい。

mysql,phpそれぞれをリポジトリから落とせるバージョンに最適化する。

$ sudo vi chef-repo/cookbooks/mysql55//attributes/default.rb
default['mysql55']['version'] = "5.5.34-1.el6.remi"
default['mysql55']['server-id'] = "0"
$ sudo vi chef-repo/cookbooks/php54//attributes/default.rb
default['php54']['version'] = "5.4.20-1.el5.remi"

remiを常時有効化(enabled=1)にする。

//TODO 後々依存関係が出たりするので、常時有効はあまり良くないとか?

/etc/yum.repos.d/remi.repo(ゲスト)
[remi]
name=Les RPM de remi pour Enterprise Linux 5 - $basearch
baseurl=http://rpms.famillecollet.com/el5.$basearch/
http://iut-info.univ-reims.fr/remirpms/el5.$basearch/
enabled=1
priority=1

Vagrantfile上でも各リポジトリを有効化。

vmclient.vm.provision :chef_solo do |chef|
    ~
  chef.add_recipe "yum::epel"
  chef.add_recipe "yum::remi"
    ~
end

参考)
Chef の サードパーティ Cookbook を利用して、yum のリポジトリを追加してみる
http://girigiribauer.com/archives/1095

再度knife-solo実行

$ knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Recipe: chef_handler::default
  * remote_directory[/var/chef/handlers] action create
    ~
    ~
Chef Client finished, 40 resources updated

成功。

102.168.33.10.json
{
    "run_list":[
      "recipe[apache]",
      "recipe[build-essential]",
      "recipe[chef_handler]",
      "recipe[git]",
      "recipe[iptables]",
      "recipe[mysql55]",
      "recipe[php54]",
      "recipe[postfix]",
      "recipe[runit]",
      "recipe[yum]"
    ]
}

これで、今後上記のミドルウェアは全てChefベースで展開できる。

補足

vagrant関連記事は以下

Vagrantの基本
http://qiita.com/kidachi_/items/e63c1607705178aa257c

saharaでVagrantの状態管理
http://qiita.com/kidachi_/items/ba365905b2a770c72be1