ansible-lssd
Murderという twiiterの人が作ったBitTorrentを利用したデプロイツールがありました。
動作を試してみたところすばらしく高速にデプロイできて感動したのですが、
Capistranoの拡張として書かれおり、使い辛い部分があったので、 Ansible のPlaybookで書き直してみました。
名前は何でも良かったんだけど、とりあえず、Large scale server deployの頭文字でansible-lssdにしてみました。
- Murderについては、 http://www.publickey1.jp/blog/10/twitterbittorrent.html の解説が詳しい。
- http://qiita.com/yamasaki-masahide/items/a4281dbbe0d4ebcbfdeb にMurderのレビューを書いた。
説明
ansible-lssd は Bittorrent (Powered by Murder) を使った大量サーバー向けデプロイツールです。
ansible-lssd は Ansible のPlaybooksとして動作します。
このPlaybooksは、Ansible 1.3.以降が必要。
このPlaybooksは、CentOS 5.x で動作テストしています。(多分yumを使ってる箇所の修正すれば動作すると思います)
Murder本家との比較
Murderに比べて次の利点があるはずです。
- Ruby不要でPythonのみで動作する
- Capistranoが不要で、ansible playbooksとして動作する
- 環境セットアップがplaybooksによって自動化されている
最低限必要なソフトウェアのインストール
最低限、ansibleを実行するホストにのみ、ansibleのインストールは必要になる
sudo pip install ansible
:
# install pip and ansible
$ sudo easy_install pip
$ sudo pip install ansible
あとは、
https://github.com/masahide/ansible-lssd からansible-lssdをclone
$ git clone https://github.com/masahide/ansible-lssd.git
どうやって動くか
Murderの "HOW IT WORKS" と変わりは無いのだが、
簡単に説明すると、以下のような感じ。(だれか間違っていたら突っ込んでください)
####登場するノードは以下の3種類。(正確にはansibleを実行するhostを含めて4種類)
- tracker
- BitTorrentでのファイル配布情報収集役のノード。各peerへ事前に配るtorrentファイルにこのサーバーIPが記載されている。配布情報を取り仕切る拠点になる。
- seeder
- 配布するファイルの大元になるノード このノードに配布元となるファイル(ディレクトリ)をtar.gzしたファイルを配置する。
- peer
- 配布対象のseeder以外の全てのノード
####デプロイの動作は、以下の順に行われる
-
各ノードへの初期設定(初回のみ)
- デプロイに必要なソフトウェアの配布とインストール
- Murderのスクリプト(Python),BitTornadoライブラリ(Python)を全てのノードへ配布
- pigz(並列でgzipするツール)を全てのノードへinstall
- screenコマンドをtrackerとseederへinstall
- デプロイに必要なソフトウェアの配布とインストール
-
trackerを起動
- screenコマンドでdaemon化して起動
-
seederノードでデプロイ対象の準備 (すべてseederノード上で行われる)
- デプロイ対象のファイルを配置
- 対象ファイルをpigzでtar.gz化
- torrentファイルを作成する
-
seederを起動
- screenコマンドでdaemon化して起動
-
deployを実行
- torrentファイルの配布
- torrentファイルを元に各ノードがダウンロードを実行
- ダウンロードが終わればtar.gzを解凍
-
trackerとseederを停止
- pkillでdaemon化したスクリプトを停止する
設定
tracker
, seeder
とpeer
ノードを インベントリファイル (./production) に記載する。
全てのサーバーにはPythonが必要ですが、CentOS5では初期インストールされているため特に問題ない。
※ ただし、場合によっては http://qiita.com/yamasaki-masahide/items/4485a438125e6b1748ce を実行する必要があるかも。
その他必要なソフトウェア (BitTornado, Murder lib, screen, pigz and etc.).
以下のsetup.yml playbookを実行することで自動インストールされるはず:
$ ansible-playbook -i prodction setup.yml
ちなみに、デフォルトだと、/usr/local/murder
に bitTornadoやMurderライブラリ等がインストールされるが、
group_vars/allの remote_murder_path
を書き換えれば別のディレクトリに入れることもできる
使い方
- ./production と ./group_vars/all, を修正する。
./productionには対象となるサーバーのIP等を記載する
./production:
# ansible host
[ansible_host]
localhost ansible_connection=local # Ansibleを実行するホスト
# tracker node
[tracker]
10.0.0.1 node_type=tracker
# seeder node
[seeder]
10.0.0.1 node_type=seeder
# peer nodes
[peer]
10.1.1.1
10.1.1.2
10.1.1.3
デプロイ先ディレクトリやデプロイ対象のディレクトリなどは、group_vars/allファイルに記載する。
group_vars/all:
# deploy tag
tag: Deploy1
# path
seeder_files_path: ~/builds
destination_path: /opt/hoge # or some other directory
destination_pathには、setup.ymlによって、Murderライブラリとサポートファイルなどをサーバに配置するためのディレクトリを指定します。
上記のように、tag: Deploy1 , destination_path /opt/hoge とした場合は、
各peerの /opt/hoge/Deploy1 へ全てのファイルがデプロイされることになる。
上記設定後、下記ansible-playbookを順次実行する。
- trackerを開始:
$ ansible-playbook -i production start_tracker.yml
- 対象ディレクトリをseederサーバーへ配置し、 tar.gz化後にtorrent ファイルを作成する
# copy to seeder node
$ scp -r ./builds 10.0.0.1:~/builds
# create torrent file
$ ansible-playbook -i production create_torrent.yml
# start seeding
$ ansible-playbook -i production start_seeder.yml
- デプロイ:
$ ansible-playbook -i production deploy.yml -f 1000
※ -f オプションで同時実行数をpeerノード数より多い値で指定する
- seederとtrackerを停止する
$ ansible-playbook -i production stop_seeder_and_tracker.yml
これで一通り終了、 全てのpeerの /opt/hoge/Deploy1 にデプロイできているはず。
メインPlaybooksのリファレンス
-
create_torrent.yml:
- seederノード上でtorrent fileを作成する
-
deploy.yml:
- peerノードでデプロイを実行する
-
rm_tgz.yml:
- デプロイ用のtargz を全てのサーバー上から削除する
-
setup.yml:
- 各ノードへ必要なサポートスクリプトなどをインストールする
-
site.yml:
- 各サーバーの設定からデプロイの実行までを一気に行う
-
start_seeder.yml:
- seederをスタートさせる
-
start_tracker.yml:
- trackerをスタートさせる
-
stop_all_peers.yml:
- 全てのpeer上で動いてるかもしれないClientライブラリを停止する
-
stop_seeder_and_tracker.yml:
- seederとtrackerを停止する