Chef-soloをProxy環境下なサーバで使えるようにする話(社内環境でよくある話)


※当記事は以前書いたものを整理して書きなおしたものです。
 前回書いた時は何徹かしながら書いてたから、内容がかなりおかしかった^^;
 書き終わったタイミングで差し替えます

これは何?

社内にある程度自由にできるPrivateCloud環境(ex. OpenStack)が出来た&多量のサーバを構築するニーズがあるので、Chefを導入してみました。
まずはChef-solo環境を構築するまでのお話。
Chef-serverはまた今度。

ChefはAgentを必要とするタイプの構成管理ツールです。
node(=chefでprovisioningするサーバ)にChef ClientがインストールされていないとChefが料理することができません。

当記事では下記について書いていきます。

  • 1.Chef Client/Knife soloサーバのセットアップ
  • 2.nodeにChef Clientをセットアップするbootstrapを作成する

今回作る構成


[Chef Client/Knife soloサーバ]x1台 --- [node] xN台


1.Chef Client/Knife soloサーバのセットアップ

事前準備

外部に接続できるよう、必要な箇所にproxyを設定します。

http/https_proxy


export http_proxy=http://proxy:port
export https_proxy=${http_proxy}

Chef Clientのインストール

今回はOpen Source Chefをインストール。

インストール

この辺から環境に応じたChef Clientをダウンロードします。

install_Chef-client
$ curl -LO https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.12.8-2.el6.x86_64.rpm
$ sudo rpm -i chef-11.12.8-2.el6.x86_64.rpm

確認

バージョン確認

$ chef-client -v
$ knife -v
Chef: 11.12.8

こんな感じに補完されればOK

$ chef-[TAB]
chef-apply   chef-client  chef-shell   chef-solo

Knife soloのインストール

インストール

ChefのGemを使いましょう

install_Knife-solo
$ sudo /opt/chef/embedded/bin/gem install knife-solo

確認

check_Knife-solo
$ knife solo
に下記の項があればOK
** SOLO COMMANDS **
knife solo bootstrap [USER@]HOSTNAME [JSON] (options)
knife solo clean [USER@]HOSTNAME
knife solo cook [USER@]HOSTNAME [JSON] (options)
knife solo init DIRECTORY
knife solo prepare [USER@]HOSTNAME [JSON] (options)

Chef Repositoryの作成

knife soloで作ります。

knife solo init ${TargetDir}
            ↓↓↓
$ knife solo init repository
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...

確認

$ ls -al repository/
total 40
drwxr-xr-x 9 user group 4096 Jun 25 12:21 .
drwxr-xr-x 3 user group 4096 Jun 25 12:21 ..
drwxr-xr-x 2 user group 4096 Jun 25 12:21 .chef
drwxr-xr-x 2 user group 4096 Jun 25 12:21 cookbooks
drwxr-xr-x 2 user group 4096 Jun 25 12:21 data_bags
drwxr-xr-x 2 user group 4096 Jun 25 12:21 environments
-rw-r--r-- 1 user group   12 Jun 25 12:21 .gitignore
drwxr-xr-x 2 user group 4096 Jun 25 12:21 nodes
drwxr-xr-x 2 user group 4096 Jun 25 12:21 roles
drwxr-xr-x 2 user group 4096 Jun 25 12:21 site-cookbooks

$ tree
.
└── repository
    ├── cookbooks
    ├── data_bags
    ├── environments
    ├── nodes
    ├── roles
    └── site-cookbooks

.chef/knife.rbにProxy周りの設定を登録

knifeがnodeにrecipeを適用する際に使用するproxyの設定を登録するよ

先ほど作ったリポジトリの中の

ここ
drwxr-xr-x 2 user group 4096 Jun 25 12:21 .chef

ここにknife.rbを作成します。

.chef/knife.rb
cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"


if ENV["http_proxy"]
  require 'rest-client'
  RestClient.proxy = ENV["http_proxy"]

  require 'uri'
  proxy_env = URI.parse(ENV["http_proxy"])
  proxy_user, proxy_pass =
  #proxy_user, proxy_pass = proxy_env.userinfo.split(":")

  http_proxy "http://#{proxy_env.host}:#{proxy_env.port}"
  https_proxy "http://#{proxy_env.host}:#{proxy_env.port}"
  http_proxy_user proxy_user
  http_proxy_pass proxy_pass
  https_proxy_user proxy_user
  https_proxy_pass proxy_pass
  no_proxy "192.168.*"
end

if句”if ENV["http_proxy"]”の中身がproxy設定。
環境変数http_proxyが定義されていればそれを使用する形です。

ここまででChef Client/Knife soloサーバのセットアップは完了です。
次にnodeをprovisioningするための下準備をするためのbootstrapを作成します。

2.nodeにChef Clientをセットアップするbootstrapを作成する

あとで書くよ