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に行います。

```bash: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に行います。

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


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

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


#### 確認

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



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

### yum

#### 設定

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

#### 確認

```bash
$ yum update
```


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


# 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
$ 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 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で作ります。

```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が定義されていればそれを使用する形です。


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



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

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

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

## 確認

nodeにログインして

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

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

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

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



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

あとは、

# recipeの準備

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

をして

# recipeをnodeに適用

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

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

# おまけ

[ChefでPearパッケージをインストールする話(まずそんなニーズ無い)(社内環境でよくある話)](http://qiita.com/nntsugu@github/items/2c7338503be4f070853c)