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


これは何?

社内にある程度自由にできるPrivateCloud環境(ex. OpenStack)が出来た&多量のサーバを構築するニーズがあるので、Chefを導入してみました。
まずはChef-solo環境を構築するまでのお話。
Chef-serverはネットワーク周りでまだ越えないといけないハードルがあるので、ひとまずChef-soloで運用開始してからChef-server環境の構築にかかる予定。

Getting Started的Proxy周りの設定

Chef-clientインストール以前に必要な設定

SSH鍵の配布や、この項で設定するknife solo prepareにてnodeにChef-clientをインストールする前に必要になるproxy設定(yum除く)は
Chef/Knifeに解決させるのではなく、事前に手動なりスクリプトなりで設定し、その状態でイメージを作成しておきます。
Knifeはその辺をサポートする機能を持っていないし、prepare以前の状態なnodeにChefが何かするのもおかしな話ですもんねー。

node側のwgetrcにproxyを設定する

knife solo prepareでChef-clientをインストールする際にmetadataをwgetする箇所があります。
wgetがproxyを使用するよう設定しておきましょう。

これはrecipeを適用する対象=nodeに行います。

nodeの/etc/wgetrc
下記を追加してあげましょう
http_proxy = http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}/
https_proxy = http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}/

node側のbashrc/profile.dにproxyを設定する

recipeを適用する対象=nodeに行います。

nodeの/etc/bashrc
下記を追加してあげましょう
http_proxy=http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}/
https_proxy=http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}/
/etc/profile.d/proxy.sh
下記を追加してあげましょう
export http_proxy=http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}
export https_proxy=http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}

適用

上で設定した内容を適用しましょう。

Shellを起動しなおすなり

$ bash

ログインしなおすなりすればOK

確認

$ export
http_proxy, https_proxyが設定されているか確認しましょう

以降2つは、必要なら事前に行っても良いし、Chef-clientのrecipeで設定しても良いと思います。

yum

設定

/etc/yum.conf
proxy=http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}

確認

$ yum update

gitが使用するプロトコルをhttpsに固定する

社内環境からは、githubなどの外部リポジトリとgitプロトコルで通信できないこと、多いしね。
この辺を参考に設定してください。
http://qiita.com/nntsugu@github/items/38dc49a47d1b658325e8

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

確認

バージョン確認してみたり

$ 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 help
に下記の項があれば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が定義されていればそれを使用する形です。

nodeの準備(recipe適用対象にChef-clientをインストールするよ)

nodeにChef-clientをインストールする

knife soloがよしなにやってくれます

$ knife solo prepare ${TARGET_LOGIN_USER}@${TARGET_HOST}
ex. knife solo prepare root@web01
              ↑↑↑
sudo権限があるユーザか、社内環境ならその時だけroot使ってもいいかもね

確認

nodeにログインして

バージョン確認してみたり

$ knife -v
Chef: 11.12.8

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

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

ここまででProxy環境下でChef-soloを使用する準備ができました!

あとは、

recipeの準備

ここは本題ではないので割愛。
簡単なのを後日書くかも。

をして

recipeをnodeに適用

knife solo cookでnodeを料理してしまいましょう。

$ knife solo cook ${TARGET_LOGIN_USER}@${TARGET_HOST}

おまけ

ChefでPearパッケージをインストールする話(まずそんなニーズ無い)(社内環境でよくある話)