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も入れる。
$ 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をインストールする。
$ xcode-select --install
その後、knife-ec2
をインストールする。
$ sudo gem install knife-ec2
hosts設定
名前解決用に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
とかあれば、そちらでも良い。
$ 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
すると消えるので再度設定する必要がある。
$ 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関連の設定を見直す。
$ 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で起動させる。
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も。
$ 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設定
$ 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インストール
$ 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
動作確認。
$ sudo chef-server-ctl test
0 failures
と表示されれば問題なし。
ブラウザで https://test-chef-server
にアクセスすると、
SSL証明書のエラー云々についてブラウザから言われるが無視して進める。
右下にadminのパスワードが記載されているので、ログイン後に変更する。
Workstation側セットアップ
鍵ファイル配置
Chef-Serverとの通信用にChef Server上にある鍵ファイルをWorkstationに持ってくる。
事前に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上に配置した後は削除。
$ 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上から取得する。
$ git clone git://github.com/opscode/chef-repo.git
$ ls -1 chef-repo
LICENSE
README.md
chefignore
config
cookbooks
data_bags
environments
roles
SSL疎通設定
オレオレ証明書なのでエラーが出るため、事前に設定しておく。
$ knife ssl fetch https://test-chef-server
knife設定
$ 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との通信確認。
$ knife user list
admin
dev
knife configure
で上書きされてしまった以下設定を追記しておく。まぁでももう使わないから任意で。
$ 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インスタンス起動時に設定されるのがよさげ。
$ 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としても登録。
$ knife bootstrap -i ~/.ssh/MY.pem test-chef-client -x ec2-user --sudo
コマンドで追加されたことを確認。
$ knife client list
test-chef-client
$ knife node list
test-chef-client
Recipe実行
以上で環境は整ったので、動作確認がてら簡単なRecipeを実行する。
全てWorkstationから全て実行。
Coockbook作成
githubから取得したのをベースにして、新しく base_packages
を作成。
$ 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修正
適当なパッケージを追加。
vi chef-repo/cookbooks/base_packages/recipes/default.rb
%w{dstat git wget expect}.each do |pkg|
package pkg do
action :install
end
end
Cookbookアップロード
個別にアップロードも可能だが、今回は全部。
$ 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を追加
$ knife node run_list add test-chef-client "recipe[base_packages]"
test-chef-client:
run_list: recipe[base_packages]
NodeでRecipeを実行
ssh経由でリモート実行。
$ ssh -t -i ~/.ssh/MY.pem ec2-user@test-chef-client "sudo chef-client"
以上。