Chef Server 11 環境構築手順


Chefの検証と勉強用に、AWS上でChef ServerとChef ClientとなるNodeを構築。
Workstationは自分の作業用Macとして、knifeコマンドで色々やっちゃう。

### 前提
* AWS関連の設定(IAM,VPC等)は済んでる、もしくは分かっているということで

### 環境

|役割|ホスト名|OS|
|:--|:--|:--|
|Chef Server|test-chef-server|Amazon Linux AMI 2014.09.1 (HVM)|
|Chef Client(Node)|test-chef-client|Amazon Linux AMI 2014.09.1 (HVM)|
|Workstation|-|Mac OS X 10.10.1|


## Workstationセットアップ
基本的に全ての作業をWorkstationのCLI上から実行する為、先に環境構築。

### knifeインストール
ほぼ全ての操作をknifeコマンドで実行する。環境構築には不要だけど、とりあえずberkshelfも入れる。

```bash:Workstation
$ sudo gem install knife-solo
$ sudo gem install berkshelf
```

### knife-ec2インストール
EC2もknifeから操作したいので `knife-ec2` を入れる。が、Macの場合は先にXcodeを入れて、Command Line Toolsを入れる必要がある。
AppStoreからXcodeを入れた後、以下のコマンドを実行してCommand Line Toolsをインストールする。

```bash:Workstation
$ xcode-select --install
```

その後、`knife-ec2`をインストールする。


```bash:Workstation
$ sudo gem install knife-ec2
```

### hosts設定
名前解決用にWorkstation上で設定しておく。

```bash:Workstation
$ sudo vi /etc/hosts
10.3.1.85    test-chef-server
10.3.1.86    test-chef-client
```


## Chef環境構築
Chef Server及びChef Client用のEC2インスタンスを起動させる。

### knife用設定

#### AWS用鍵設定
`knife-ec2` コマンド用に作成。すでに `~/.aws/credentials` とかあれば、そちらでも良い。

```bash:Workstation
$ mkdir ~/.chef
$ vi ~/.chef/credentials
[default]
aws_access_key_id = Your_Access_Key
aws_secret_access_key = Your_Secret_Key
```

####knife用AWS関連設定
AWS関連の設定を追加する。ちなみに後で `knife configure` すると消えるので再度設定する必要がある。

```bash:Workstation
$ vi ~/.chef/knife.rb
knife[:aws_credential_file] = "/Users/NAME/.chef/credentials"
knife[:availability_zone] = "AZ"
knife[:region] = "Region"
knife[:aws_ssh_key_id] = "mypem_name"
```

試しに動作確認。以下のように表示されなければ、AWS関連の設定を見直す。

```bash:Workstation
$ knife ec2 server list
Instance ID  Name  Public IP  Private IP  Flavor    Image         SSH Key  Security Groups  IAM Profile  State
i-XXXXXXXX   XXXX             10.X.X.XX   m3.large  ami-XXXXXXXX  XXXXXXX  XXXXXXXXXXX      XXXXXX       running
i-XXXXXXXX   XXXX                         t1.micro  ami-XXXXXXXX  XXXXXXX  XXXXXXXXXXX                   stopped
    :
    :
    :
```

### EC2インスタンス起動
`Amazon Linux AMI 2014.09.1 (HVM) - ami-4985b048` を使用してt2.microで起動させる。

```bash:Workstation
knife ec2 server create \
--ebs-size 30 \
--flavor t2.micro \
--image ami-4985b048 \
--private-ip-address 10.3.1.85 \
--security-group-ids sg-XXXXXXXX \
--subnet subnet-XXXXXXXX \
-T Name=test-chef-server
```

上手くいくとこんなログ。最後のエラーはまだ設定してないchef関係のログなので一旦無視。

```
Instance ID: i-XXXXXXXX
Flavor: t2.micro
Image: ami-4985b048
Region: ap-northeast-1
Availability Zone: ap-northeast-1X
Security Group Ids: sg-XXXXXXXX
Tags: Name: test-chef-server
SSH Key: XXXX

Waiting for EC2 to create the instance................
Subnet ID: subnet-XXXXXXXX
Tenancy: default
Private IP Address: 10.3.1.85

Waiting for sshd access to become available.done
Connecting to 10.3.1.85
ERROR: Errno::ENOENT: No such file or directory - /etc/chef/validation.pem
```

Chef Server用のインスタンスが無事起動できたら、IPアドレスとタグ名だけ変えてChef Clientも。

```bash:Workstation
$ knife ec2 server create \
--ebs-size 30 \
--flavor t2.micro \
--image ami-4985b048 \
--private-ip-address 10.3.1.86 \
--security-group-ids sg-XXXXXXXX \
--subnet subnet-XXXXXXXX \
-T Name=test-chef-client
```


## Chef Server構築
### OS設定
Chef Serverインストール前に必要な設定を追加する。
特にホスト名関係を設定しておかないとハマる。

#### hostname設定

```bash:Chef-Server
$ sudo vi /etc/hosts
10.3.1.85   test-chef-server

$ sudo sed -i -e 's/HOSTNAME=\(.*\)/HOSTNAME=test-chef-server/' /etc/sysconfig/network
$ sudo hostname test-chef-server
```

### Chef Serverインストール

```bash:Chef-Server
$ wget https://web-dl.packagecloud.io/chef/stable/packages/el/6/chef-server-11.1.6-1.el6.x86_64.rpm
$ sudo rpm -Uvh chef-server-11.1.6-1.el6.x86_64.rpm
$ sudo chef-server-ctl reconfigure
```

動作確認。

```bash:Chef-Server
$ sudo chef-server-ctl test
```

`0 failures` と表示されれば問題なし。
ブラウザで `https://test-chef-server` にアクセスすると、
SSL証明書のエラー云々についてブラウザから言われるが無視して進める。
右下にadminのパスワードが記載されているので、ログイン後に変更する。

### Workstation側セットアップ

#### 鍵ファイル配置
Chef-Serverとの通信用にChef Server上にある鍵ファイルをWorkstationに持ってくる。
事前にChef Server上で持ってこれるようにコピーして権限変更する。

```bash:Chef-Server
$ sudo cp /etc/chef-server/admin.pem /tmp
$ sudo cp /etc/chef-server/chef-validator.pem /tmp
$ sudo chown ec2-user /tmp/*.pem
```

Workstation上に配置した後は削除。

```bash:Workstation
$ scp -i ~/.ssh/MY.pem ec2-user@test-chef-server:/tmp/*.pem ~/.chef
$ ssh -i ~/.ssh/MY.pem ec2-user@test-chef-server "rm -f /tmp/*.pem"
```

#### Cookbook雛形取得
github上から取得する。

```bash:Workstation
$ git clone git://github.com/opscode/chef-repo.git
$ ls -1 chef-repo
LICENSE
README.md
chefignore
config
cookbooks
data_bags
environments
roles
```

#### SSL疎通設定
オレオレ証明書なのでエラーが出るため、事前に設定しておく。

```bash:Workstation
$ knife ssl fetch https://test-chef-server
```

#### knife設定

```bash:Workstation
$ knife configure --initial
Overwrite /Users/NAME/.chef/knife.rb? (Y/N) y
Please enter the chef server URL: [https://localhost.local:443] https://test-chef-server
Please enter a name for the new user: [NAME] dev
Please enter the existing admin name: [admin]
Please enter the location of the existing admin's private key: [/etc/chef-server/admin.pem] /Users/NAME/.chef/admin.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /Users/NAME/.chef/chef-validator.pem
Please enter the path to a chef repository (or leave blank): /Users/NAME/chef-repo
Creating initial API user...
Please enter a password for the new user:
Created user[dev]
Configuration file written to /Users/NAME/.chef/knife.rb
```

Chef Serverとの通信確認。

```bash:Workstation
$ knife user list
admin
dev
```

`knife configure` で上書きされてしまった以下設定を追記しておく。まぁでももう使わないから任意で。

```bash:Workstation
$ vi ~/.chef/knife.rb
knife[:aws_credential_file] = "/Users/NAME/.chef/credentials"
knife[:availability_zone] = "AZ"
knife[:region] = "Region"
knife[:aws_ssh_key_id] = "mypem_name"
```


## Chef Client構築

#### hostname設定
Chef Serverと同様に。本来ならば、EC2インスタンス起動時に設定されるのがよさげ。

```bash:Chef-Client
$ sudo vi /etc/hosts
10.3.1.85   test-chef-server

$ sudo sed -i -e 's/HOSTNAME=\(.*\)/HOSTNAME=test-chef-client/' /etc/sysconfig/network
$ sudo hostname test-chef-client
```

### chef-client インストール
chef-clientをインストールし、Nodeとしても登録。

```bash:Workstation
$ knife bootstrap -i ~/.ssh/MY.pem test-chef-client -x ec2-user --sudo
```

コマンドで追加されたことを確認。

```bash:Workstation
$ knife client list
test-chef-client

$ knife node list
test-chef-client
```


## Recipe実行
以上で環境は整ったので、動作確認がてら簡単なRecipeを実行する。
全てWorkstationから全て実行。

### Coockbook作成
githubから取得したのをベースにして、新しく `base_packages` を作成。

```bash:Workstation
$ knife cookbook create base_packages
$ ls -1F chef-repo/cookbooks/base_packages/
CHANGELOG.md
README.md
attributes/
definitions/
files/
libraries/
metadata.rb
providers/
recipes/
resources/
templates/
```

### Recipe修正
適当なパッケージを追加。

```bash:Workstation
vi chef-repo/cookbooks/base_packages/recipes/default.rb
```

```ruby:chef-repo/cookbooks/base_packages/recipes/default.rb
%w{dstat git wget expect}.each do |pkg|
  package pkg do
    action :install
  end
end
```

### Cookbookアップロード
個別にアップロードも可能だが、今回は全部。

```bash:Workstation
$ knife cookbook upload -a
Uploading base_packages [0.1.0]
Uploaded all cookbooks.

$ knife cookbook list
base_packages   0.1.0
```

### Run List追加
NodeのRun ListにRecipeを追加

```bash:Workstation
$ knife node run_list add test-chef-client "recipe[base_packages]"
test-chef-client:
  run_list: recipe[base_packages]
```

### NodeでRecipeを実行
ssh経由でリモート実行。

```bash:Workstation
$ ssh -t -i ~/.ssh/MY.pem ec2-user@test-chef-client "sudo chef-client"
```


---
以上。