低レベルインフラエンジニアの忘備録

Linux系の各種作業を自分用の忘備録として残しています

【chef】knife-soloでchef-soloをリモート実行

今回はVagrantで構築したゲストOSに対してknife-soloを使ってchef-soloをリモート実行してみます

環境

◆ホストOS(RHEL6.7)
◆ゲストOS(CentOS6.7)
※1、Vagrantで仮想環境を構築
※2、内部IPアドレスは192.168.33.10
※3、ホストOS(ユーザ:root)からゲストOS(ユーザ:vagrant)へのSSHはパスワードなしでログインできる

必要なモジュールのインストール(ホストOS)

# gem install knife-solo
# gem install berkshelf

「knife-solo」は作業用マシン上に用意したCookbookなどの設定ファイルを設定対象のマシンにコピーし、 設定対象のマシン上でchef-soloコマンドを実行する、という一連の作業を自動実行するツールです。
設定ファイルのコピーにはrsyncが、chef-soloコマンドの実行にはsshを使います。
「berkshelf」は定義ファイルに使うcookbookを定義しておけば、リポジトリから勝手に依存関係を解消 した上で落としてきてくれるツールのようです。

リポジトリ作成(ホストOS)

Vagrantfileがあるディレクトリ上にリポジトリを作成します

# cd /root/vagrant/centos67
# knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...
# ls -l
合計 32
-rw-r--r-- 1 root root   35  4月 26 09:37 2016 Berksfile
-rw-r--r-- 1 root root 3080  4月 25 16:04 2016 Vagrantfile
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 cookbooks
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 data_bags
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 environments
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 nodes
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 roles
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 site-cookbooks

リポジトリ関連のファイルが生成されます

ゲストOSにChef Soloのインストール(ホストOS)

「knife solo bootstrap [ホスト名 or IPアドレス]」コマンドを実行します。
「knife solo bootstrap」コマンドは、knife solo prepareによるChefのインストールとknife solo cookによるカレントリポジトリのアップロード とchef-soloの実行を同時に実施してくれるコマンドとなります。

# knife solo bootstrap 192.168.33.10
Bootstrapping Chef...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19602  100 19602    0     0  18652      0  0:00:01  0:00:01 --:--:-- 67593
el 6 x86_64
Getting information for chef stable 12.9.38 for el...
downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12.9.38&p=el&pv=6&m=x86_64
  to file /tmp/install.sh.2869/metadata.txt
trying wget...
sha1    2b859af3d6e99502b7a1d75671a4f629a224e9ad
sha256  0aca8e46ff8ada7af09b0d65b6f7738eb7b25d269482000be1dee7aaba154011
url     https://packages.chef.io/stable/el/6/chef-12.9.38-1.el6.x86_64.rpm
version 12.9.38
downloaded metadata file looks valid...
downloading https://packages.chef.io/stable/el/6/chef-12.9.38-1.el6.x86_64.rpm
  to file /tmp/install.sh.2869/chef-12.9.38-1.el6.x86_64.rpm
trying wget...
Comparing checksum with sha256sum...
Installing chef 12.9.38
installing with rpm...
警告: /tmp/install.sh.2869/chef-12.9.38-1.el6.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'...
Running Chef on 192.168.33.10...
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
WARNING: Local cookbook_path '/root/vagrant/centos67/cookbooks' does not exist
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.9.38
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 0 resources

Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 02 seconds

ゲストOSにログインして確認

# ssh 192.168.33.10
Last login: Tue Apr 26 01:43:34 2016 from 10.0.2.2
[vagrant@localhost ~]$ che           (tabキーを押して補完表示させてます)
checkmodule  checkpolicy  chef-apply   chef-client  chef-shell   chef-solo/

chef solo関連のプログラムが表示されています

クックブックの作成(ホストOS)

# cd /root/vagrant/centos67
# knife cookbook create dovecot -o site-cookbooks
** Creating cookbook dovecot in /root/vagrant/centos67/site-cookbooks
** Creating README for cookbook: dovecot
** Creating CHANGELOG for cookbook: dovecot
** Creating metadata for cookbook: dovecot

レシピの編集(ホストOS)

# vi /root/vagrant/centos67/site-cookbooks/dovecot/recipes/default.rb
#
# Cookbook Name:: dovecot
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "dovecot" do
        action :install
end

上記の3行を追加します。
上記はdovecotをインストールするレシピとなります。

ノードオブジェクト(ランリスト)の修正(ホストOS)

# vi /root/vagrant/centos67/nodes/192.168.33.10.json
{
  "run_list": [
    "recipe[dovecot]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  }
}

上記の1行を追加します。
上記を記述することにより「knife-solo」コマンド実行時にクックブックを明示的に指定する必要が無くなります。

knife-solo実行(ホストOS)

# cd /root/vagrant/centos67
# knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
WARNING: Local cookbook_path '/root/vagrant/centos67/cookbooks' does not exist
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.9.38
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: dovecot::default
  * yum_package[dovecot] action install
    - install version 2.0.9-19.el6_7.2 of package dovecot

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

ゲストOSにdovecotがインストールされているか確認

# ssh 192.168.33.10
Last login: Tue Apr 26 02:02:51 2016 from 10.0.2.2
[vagrant@localhost ~]$ rpm -qa | grep dovecot
dovecot-2.0.9-19.el6_7.2.x86_64
[vagrant@localhost ~]$

dovecotがインストールされています