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



```bash

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

```


## Chef Clientのインストール


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

### インストール

http://www.getchef.com/chef/install/

![download.png](https://qiita-image-store.s3.amazonaws.com/0/14859/199de308-33fd-b4b3-f9a9-7b99c81d16c4.png)

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


```bash: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
```

### 確認

バージョン確認

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

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

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





## Knife soloのインストール

### インストール

ChefのGemを使いましょう

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

### 確認

```bash: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で作ります。

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

### 確認

```bash
$ 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の設定を登録するよ

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

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

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

```bash:.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を作成する

あとで書くよ