fbpx

ec-metalでEnterprise Chef HAクラスタを構築する #opschef_ja #getchef_ja

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

ec-metalとは、chef-metalを用いてEnterprise Chefの高可用性クラスタを構築するためのデプロイメントツールです。

ec-metalは絶賛開発中のツールであるため、これによって構築したChef HAクラスタが実用に耐えうるかどうかは議論の余地があります。しかしながら、chef-metalの活用例として優れたデモと言えるでしょう。
ec-metalはAmazon EC2上とVagrant (VirtualBox)上へのデプロイをサポートしています。

Vagrant (VirtualBox)編

事前準備

検証のOSはDebian unstable、ec-metalはバージョン0.12.0で行っています。

まず、Running Virtualbox with Vagrantに従い、Vagrant 1.6 (もしくは1.5)とVirtualBoxをインストールしておきます。


% dpkg -l vagrant virtualbox
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii vagrant 1.6.5+dfsg1- all Tool for building and distributin
ii virtualbox 4.3.18-dfsg- amd64 x86 virtualization solution - bas

ec-metalをgit cloneし、0.12.0タグに移ります。


% git clone https://github.com/opscode/ec-metal
Cloning into 'ec-metal'...
remote: Counting objects: 4431, done.
remote: Total 4431 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4431/4431), 649.92 KiB | 258.00 KiB/s, done.
Resolving deltas: 100% (2454/2454), done.
Checking connectivity... done.
%

% cd ec-metal
%


% git checkout 0.12.0
Note: checking out '0.12.0'.
:
%

あらかじめbundle installしておきます。この際 --path vendor/bundle を忘れないでください。


% bundle install --path=vendor/bundle
:
%

設定

設定ファイルの雛形があるので、そこからコピーします。特に変更の必要はありません。


% cp examples/config.json.example config.json
%

内容を確認しておきましょう。


{
"provider": "vagrant",
"vagrant_options": {
"box": "opscode-centos-6.5",
"box_url": "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box",
"disk2_size": "2"
},
"apply_ec_bugfixes": true,
"default_package": "private-chef-11.1.3-1.el6.x86_64.rpm",
"manage_package": "opscode-manage-1.3.1-1.el6.x86_64.rpm",
"manage_options": {
"public_port": 443,
"platform.user": "pivotal",
"disable_sign_up" : false
},
"packages": {
"PC1.2": "private-chef-1.2.8.2-1.el6.x86_64.rpm",
"PC1.4": "private-chef-1.4.6-1.el6.x86_64.rpm",
"EC11.0": "private-chef-11.0.2-1.el6.x86_64.rpm",
"EC11.1": "private-chef-11.1.3-1.el6.x86_64.rpm"
},
"layout": {
"topology": "ha",
"api_fqdn": "api.opscode.piab",
"manage_fqdn": "manage.opscode.piab",
"analytics_fqdn": "analytics.opscode.piab",
"backend_vip": {
"hostname": "backend.opscode.piab",
"ipaddress": "33.33.33.20",
"heartbeat_device": "eth2",
"device": "eth1"
},
"backends": {
"backend1": {
"hostname": "backend1.opscode.piab",
"ipaddress": "33.33.33.21",
"cluster_ipaddress": "33.33.34.5",
"memory": "2560",
"cpus": "2",
"bootstrap": true
},
"backend2": {
"hostname": "backend2.opscode.piab",
"ipaddress": "33.33.33.22",
"cluster_ipaddress": "33.33.34.6",
"memory": "2560",
"cpus": "2"
}
},
"frontends": {
"frontend1": {
"hostname": "frontend1.opscode.piab",
"ipaddress": "33.33.33.23",
"memory": "1024",
"cpus": "1"
}
},
"virtual_hosts": {
"private-chef.opscode.piab": "33.33.33.23",
"manage.opscode.piab": "33.33.33.23",
"api.opscode.piab": "33.33.33.23",
"analytics.opscode.piab": "33.33.33.23",
"backend.opscode.piab": "33.33.33.20",
"backend1.opscode.piab": "33.33.33.21",
"backend2.opscode.piab": "33.33.33.22",
"frontend1.opscode.piab": "33.33.33.23"
}
}
}

CentOS 6.5 の VirtualBox インスタンスをフロントエンド1つとバックエンド2つの合計 3つ起動し、private-chef-11.1.3 (Enterprise Chef 11.1.3) と opscode-manage-1.3.1-1 (Chef Manager 1.3.1) をインストールし、HAを構成するというレイアウトになっています。

private-chef-11.1.3-1.el6.x86_64.rpmopscode-manage-1.3.1-1.el6.x86_64.rpm ファイルをダウンロードします。次のURLから取得できます。

  • http://s3.amazonaws.com/opscode-private-chef/el/6/x86_64/private-chef-11.1.3-1.el6.x86_64.rpm
  • http://s3.amazonaws.com/opscode-private-chef/el/6/x86_64/opscode-manage-1.3.1-1.el6.x86_64.rpm

この 2ファイルは ec-metal ディレクトリ直下と、ec-metal/cache ディレクトリの 2か所に置いてください。手順では ec-metal/cache ディレクトリ直下だけでよいような記述ですが、なぜか ec-metal ディレクトリ直下にも置いておかなければ処理が進みませんでした。


% ls cache *rpm
opscode-manage-1.3.1-1.el6.x86_64.rpm private-chef-11.1.3-1.el6.x86_64.rpm


cache:
opscode-manage-1.3.1-1.el6.x86_64.rpm private-chef-11.1.3-1.el6.x86_64.rpm
%

デプロイ

bundle exec rake up を実行します。時間にして30〜1時間程度でEnterprise Chef HAクラスタがVagrant (VirtualBox)上に構成されます。
manage.opscode.piab33.33.33.23 に正引きできるように設定してブラウザでアクセスしてみてください。Enterprise ChefのWebUIが表示されるでしょう。

破棄

bundle exec rake destroy を実行すると、すべてのインスタンスを破棄します。

Amazon EC2編

事前準備

AWS VPCの手動準備

Running ec2 on AWSの手順に従い、まずはAWSの設定から始めます。ec-metal 0.12.0の時点では、AWSの設定は手動で行わなければいけません。当然ながら、AWSアクセスキーとシークレットキーが必要です。

AWS CLIを用いて、設定ファイルを作成します。既存の設定ファイルがある場合はこの手順を省略してください。なお、リージョンは「us-east-1」としておいてください。


% aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: us-east-1
Default output format [None]:
%


% cat .aws/config
[default]
aws_secret_access_key = ****************************************
aws_access_key_id = ********************
region = us-east-1
%

AWS CLIを用いて、Amazon VPCの作成を行います。


% aws ec2 create-vpc --cidr-block "33.33.0.0/16"
{
"Vpc": {
"DhcpOptionsId": "dopt-07****65",
"CidrBlock": "33.33.0.0/16",
"InstanceTenancy": "default",
"VpcId": "vpc-0f****6a",
"State": "pending"
}
}

DNSの名前解決を有効にします。手順中の「vpc-myvpcid」は今作ったVPCのVpcIdに置き換えてください。以降同様の点が何か所もありますが、すべて同じように置き換えてください。


% aws ec2 modify-vpc-attribute --vpc-id vpc-0f****6a --enable-dns-hostnames
{
"return": "true"
}

サブネットを作成します。


% aws ec2 create-subnet --vpc-id vpc-0f****6a --cidr-block "33.33.33.0/24"
{
"Subnet": {
"State": "pending",
"AvailabilityZone": "us-east-1b",
"SubnetId": "subnet-0e****79",
"CidrBlock": "33.33.33.0/24",
"VpcId": "vpc-0f****6a",
"AvailableIpAddressCount": 251
}
}

インターネットゲートウェイを作成します。


% aws ec2 create-internet-gateway
{
"InternetGateway": {
"Tags": [],
"Attachments": [],
"InternetGatewayId": "igw-35****50"
}
}

インターネットゲートウェイをVPCに追加します。


% aws ec2 attach-internet-gateway --internet-gateway-id igw-35****50 --vpc-id vpc-0f****6a
{
"return": "true"
}

対象のルートテーブルの「RouteTableId」を確認します。


% aws ec2 describe-route-tables
{
"RouteTables": [
(中略)
{
"Routes": [
{
"GatewayId": "local",
"State": "active",
"Origin": "CreateRouteTable",
"DestinationCidrBlock": "33.33.0.0/16"
}
],
"VpcId": "vpc-0f****6a",
"Associations": [
{
"RouteTableId": "rtb-64****01",
"RouteTableAssociationId": "rtbassoc-fd****98",
"Main": true
}
],
"Tags": [],
"PropagatingVgws": [],
"RouteTableId": "rtb-64****01"
}
]
}

デフォルトルートを設定します。


% aws ec2 create-route --route-table-id rtb-64****01 --destination "0.0.0.0/0" --gateway-id igw-35****50
{
"return": "true"
}

対象のセキュリティグループの「GroupId」を確認します。


% aws ec2 describe-security-groups --filters Name=vpc-id,Values=vpc-0f****6a
{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"IpProtocol": "-1"
}
],
"OwnerId": "48********14",
"Description": "default VPC security group",
"IpPermissions": [
{
"IpRanges": [],
"UserIdGroupPairs": [
{
"UserId": "48********14",
"GroupId": "sg-0b****6e"
}
],
"IpProtocol": "-1"
}
],
"VpcId": "vpc-0f****6a",
"GroupId": "sg-0b****6e",
"GroupName": "default"
}
]
}
%

セキュリティグループに「22/tcp」「80/tcp」「443/tcp」を全許可するルールを追加します。


% aws ec2 authorize-security-group-ingress --group-id sg-0b****6e --protocol tcp --port 22 --cidr "0.0.0.0/0"
{
"return": "true"
}


% aws ec2 authorize-security-group-ingress --group-id sg-0b****6e --protocol tcp --port 80 --cidr "0.0.0.0/0"
{
"return": "true"
}


% aws ec2 authorize-security-group-ingress --group-id sg-0b****6e --protocol tcp --port 443 --cidr "0.0.0.0/0"
{
"return": "true"
}

これでAWS VPC側の手動作業は完了です。引き続き、ec-metalの作業に取りかかります。

ec-metalの準備

ec-metalはバージョン0.12.0を用います。Vagrant編と特に注意は変わりません。


% git clone https://github.com/opscode/ec-metal
Cloning into 'ec-metal'...
remote: Counting objects: 4419, done.
remote: Total 4419 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4419/4419), 648.38 KiB | 545.00 KiB/s, done.
Resolving deltas: 100% (2446/2446), done.
Checking connectivity... done.
%


% git checkout 0.12.0
:
%


% bundle install --path=vendor/bundle
:
%

設定

設定ファイルの雛形があるので、そこからコピーします


% cp examples/config.json.ec2.example config.json
%

Vagrant編と異なり、変更箇所があります。
リージョンとAMIは雛形に合わせて「us-east-1」と「ami-54ac4d3c」としてあるため、変更する必要はありません。
先程作成したVPCサブネットの「SubnetId」の値を「vpc_subnet」の値に設定してください。
また、パッケージの「AWSAccessKey」等は不要になったので削除してください。


% vi config.json
% diff -u examples/config.json.ec2.example config.json
--- examples/config.json.ec2.example 2014-10-17 14:59:32.723729947 +0900
+++ config.json 2014-10-17 16:11:08.374309929 +0900
@@ -2,14 +2,14 @@
"provider": "ec2",
"ec2_options": {
"region": "us-east-1",
- "vpc_subnet": "subnet-c13410e9",
+ "vpc_subnet": "subnet-0e****79",
"ami_id": "ami-54ac4d3c",
"ssh_username": "root",
"use_private_ip_for_ssh": false
},
"apply_ec_bugfixes": true,
- "default_package": "http://s3.amazonaws.com/opscode-private-chef/el/6/x86_64/private-chef-11.1.3-1.el6.x86_64.rpm?AWSAccessKeyId=getonefromsupport&Expires=thistoo&Signature=andthis",
- "manage_package": "http://s3.amazonaws.com/opscode-private-chef/el/6/x86_64/opscode-manage-1.3.1-1.el6.x86_64.rpm?AWSAccessKeyId=getonefromsupport",
+ "default_package": "http://s3.amazonaws.com/opscode-private-chef/el/6/x86_64/private-chef-11.1.3-1.el6.x86_64.rpm",
+ "manage_package": "http://s3.amazonaws.com/opscode-private-chef/el/6/x86_64/opscode-manage-1.3.1-1.el6.x86_64.rpm",
"layout": {
"topology": "ha",
"api_fqdn": "api.opscode.piab",

なお、この設定ではエフェメラルディスクなので、シャットダウンするとデータが消えてしまいます。EBSを使う設定もありますが、ここでは省略します。

作成するインスタンスはフロントエンド「m3.medium」を1つ、バックエンド「c3.xlarge」を2つ、費用はおおよそ50円/時(2014年10月現在, us-east-1(米国東部(バージニア北部))リージョンの場合)となります


% grep instance_type config.json
"instance_type": "c3.xlarge",
"instance_type": "c3.xlarge"
"instance_type": "m3.medium"
%

デプロイ

bundle exec rake up を実行します。Vagrant編と同じく、時間にして30〜1時間程度でEnterprise Chef HAクラスタがAmazon EC2上に構成されます。
設定されたIPアドレスを確認の上、ブラウザでアクセスしてみてください。Enterprise ChefのWebUIが表示されるでしょう。

破棄

bundle exec rake destroy を実行すると、すべてのインスタンスを破棄します。

まとめ

ec-metalを用いてEnterprise Chefの高可用性クラスタをVagrant上とAmazon EC2上に構築してみました。VagrantやAmazon EC2上にEnterprise Chefをかなり簡単に構築できるため、テストや検証、デモなどの簡易的な用途に適していると言えるでしょう。

設定ファイルはJSON形式なのでchef-metalの強力さがいまひとつ実感できないという方は、ec-metal/cookbooks/ec-harness/recipes/vagrant.rbec-metal//cookbooks/ec-harness/recipes/ec2.rbなどのRecipe、 ec-metal/cookbooks/ec-harness/providers/private_chef_ha.rbなどのLWRPを参照してみてください。


Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA