Itamaeが構成管理を仕込みます! ~新進気鋭の国産・構成管理ツール~

第5回(最終回) 中規模環境でのItamae(複数ホストに対する実行)

この記事を読むのに必要な時間:およそ 5.5 分

ここまで4回,Itamaeのレシピの書き方やプラグインの作り方などを説明してきました。最終回となる今回は複数サーバに対してItamaeを利用する場合の活用方法を3つ紹介します。

Capistranoを使ってItamaeを複数ホストに対して実行する

CapistranoはRubyで書かれたデプロイツールで,アプリケーションのデプロイによく使われています。Capistranoを使ってSSH経由で複数台にItamaeを実行することで,手軽に並列でItamaeを実行することができます。ここではCapistranoのデプロイ機能を使ってレシピなどをデプロイし,デプロイ後にItamaeを実行する例を紹介します。

まず,Bundlerを使ってCapistranoをインストールし,cap installで初期ファイルを生成します。

$ cd itamae-repo
$ bundle init # Gemfileがない場合
$ echo 'gem "capistrano"' >> Gemfile
$ bundle install
$ bundle exec cap install STAGES=production

config/deploy.rbを以下のように修正します。itamae:applyタスクでitamae localが実行されるようにしています。また,itamae:applyの前にdeployを実行するように指定しているので,実行前に/tmp/itamae-repoにコードがデプロイされます。

set :application, itamae
set :repo_url, 'git@github.com:your/itamae-repo.git'
set :deploy_to, '/tmp/itamae-repo'

# この部分はAWS EC2のAPIを呼ぶなどして,動的に定義すると良いかもしれません
role :app, [‘app-1’]

namespace :itamae do
  # apply前にdeployを実行します
  task :apply => [:deploy] do
    # bootstrap.rbを実行します
    recipe = File.join(fetch(:release_path), 'bootstrap.rb')
    on roles(ENV['ROLES'].split(',')) do
      # 対象ホスト側にItamaeがインストールされている必要があります
      execute "itamae", "local", recipe
    end
  end
end

itamae:applyタスクでItamaeを実行できます。

$ bundle exec cap production itamae:apply ROLES=app
(中略)
DEBUG [ed621171] Command: /usr/bin/env itamae local /tmp/itamae-repo/releases/20150927150652/bootstrap.rb
DEBUG [ed621171]        [0m INFO : Starting Itamae...
DEBUG [ed621171]        [0m
DEBUG [ed621171]        [0m INFO : Recipe: /tmp/itamae-repo/releases/20150927150652/bootstrap.rb
DEBUG [ed621171]        [0m[32m INFO :   execute[echo Hello] executed will change from 'false' to 'true'
DEBUG [ed621171]        [0m
INFO [ed621171] Finished in 0.317 seconds with exit status 0 (successful).

このように非常に簡単に複数台へのItamaeの実行が実現できます。上記の例ではitamae sshを使わずitamae localを利用しています。itamae sshitamae localに比べ速度が遅いため,ある程度の規模になったらlocalを使うのがお勧めです。itamae localは対象ホストにitamaeがインストールされている必要があるので,パッケージなどでインストールしましょう。

もちろん,itamae sshを使うことも可能です。その場合はrun_locally内でItamaeを実行しましょう。詳しくはCapistranoのドキュメントを参照してください。

PackerとItamaeを使ってAWS EC2用のイメージを作成する

PackerとItamaeを使ってAWS EC2のイメージ(AMI)を作る例を紹介します。Packerは各種VMのマシンイメージをつくるためのツールで,EC2やDigitalOceanなどのIaaS用のイメージ作成やVirtualBoxやVMwareなどの仮想マシンイメージの作成に対応しています。Packerでは任意のコマンドを実行しイメージを作成することができるので,その機能を使ってItamaeを実行します。

まず,Packerをダウンロードします。

$ wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_darwin_amd64.zip
$ unzip packer_0.8.6_darwin_amd64.zip

Packerの設定ファイルを書きます。以下をubuntu.jsonとして保存しますvpc_idsubnet_id/path/to/itamae-repoは環境に合わせて書き換えます)⁠

{
  "builders": [{
    "type": "amazon-ebs",
    "region": "ap-northeast-1",
    "source_ami": "ami-46990446",
    "instance_type": "t2.micro",
    "ssh_username": "ubuntu",
    "ssh_timeout": "5m",
    "ami_name": "ubuntu-trusty-hvm",
    "vpc_id": "vpc-abcdef",
    "availability_zone": "ap-northeast-1c",
    "subnet_id": "subnet-abcdef",
    "associate_public_ip_address": true,
    "run_tags": {
      "Name": "packer-tmp-ubuntu-trusty-hvm"
    }
  }],
  "provisioners": [
    {
      "type": "file",
      "source": "/path/to/itamae-repo",
      "destination": "/tmp/itamae-repo"
    },
    {
      "type": "shell",
      "inline": [
        "curl -s https://packagecloud.io/install/repositories/ryotarai/itamae/script.deb.sh | sudo bash",
        "sudo apt-get install itamae",
        "sudo /opt/itamae/embedded/bin/itamae local /tmp/itamae-repo/bootstrap.rb",
        "sudo rm -rf /tmp/itamae-repo"
      ]
    }
  ]
}

Packerの設定ファイルにはbuildersprovisionerを指定する必要があり,ここではBuilderにamazon-ebs(AMI)を,ProvisionerにItamaeの実行コマンドを指定します。file Provisionerを使って,Itamaeのレシピなどを転送し(以下では/path/to/itamae-repoを転送しています)⁠itamaeコマンドを実行しています。

あとはpacker buildコマンドに上記の設定ファイルを与えれば,全自動でインスタンスを作成し,Itamaeを実行し,イメージを作成してくれます。

$ AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar ./packer build ubuntu.json
amazon-ebs output will be in this color.

==> amazon-ebs: Prevalidating AMI Name...
==> amazon-ebs: Inspecting the source AMI...
(中略)
==> amazon-ebs: Provisioning with shell script: /var/folders/tj/0g3ny7c94mq9s_2dtbzk0hbr0000gn/T/packer-shell612616353
(中略)
    amazon-ebs:  INFO : Starting Itamae...
    amazon-ebs:  INFO : Recipe: /tmp/itamae-repo/bootstrap.rb
    amazon-ebs:  INFO :   execute[echo Hello] executed will change from 'false' to 'true'
    amazon-ebs:
==> amazon-ebs: Stopping the source instance...
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: ubuntu-trusty-hvm
    amazon-ebs: AMI: ami-abcdef
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Cleaning up any extra volumes...
==> amazon-ebs: Deleting temporary security group...
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' finished.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:

ap-northeast-1: ami-abcdef

著者プロフィール

荒井良太(あらいりょうた)

クックパッド株式会社 インフラエンジニア。ソフトウェアでのインフラの改善,運用の自動化に興味があり,オペレーションのない世界を夢見ている。休日はOSS活動をしていることが多い。ItamaeInfratasterの開発者。

URL:http://ryotarai.info

コメント

コメントの記入