BitTorrentを使った高速デプロイツールをansibleのplaybookで書いた。

[ansible-lssd](https://github.com/masahide/ansible-lssd)
============

[Murder](https://github.com/lg/murder)という twiiterの人が作ったBitTorrentを利用したデプロイツールがありました。
[動作を試してみたところ](http://qiita.com/yamasaki-masahide/items/a4281dbbe0d4ebcbfdeb)すばらしく高速にデプロイできて感動したのですが、
Capistranoの拡張として書かれおり、使い辛い部分があったので、 [Ansible](https://github.com/ansible/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](https://github.com/lg/murder)) を使った大量サーバー向けデプロイツールです。

ansible-lssd は [Ansible](https://github.com/ansible/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` :

  ```sh
   # install pip and ansible
  $ sudo easy_install pip
  $ sudo pip install ansible
  ```

あとは、
https://github.com/masahide/ansible-lssd  からansible-lssdをclone 

  ```sh
  $ git clone https://github.com/masahide/ansible-lssd.git
  ```

どうやって動くか
----------------------

Murderの "[HOW IT WORKS](https://github.com/lg/murder/blob/master/README.md#how-it-works)" と変わりは無いのだが、
簡単に説明すると、以下のような感じ。(だれか間違っていたら突っ込んでください)

####登場するノードは以下の3種類。(正確にはansibleを実行するhostを含めて4種類)

* tracker
  * BitTorrentでのファイル配布情報収集役のノード。各peerへ事前に配るtorrentファイルにこのサーバーIPが記載されている。配布情報を取り仕切る拠点になる。
* seeder
  * 配布するファイルの大元になるノード このノードに配布元となるファイル(ディレクトリ)をtar.gzしたファイルを配置する。
* peer
  * 配布対象のseeder以外の全てのノード

####デプロイの動作は、以下の順に行われる

1. 各ノードへの初期設定(初回のみ)
   * デプロイに必要なソフトウェアの配布とインストール
     * Murderのスクリプト(Python),BitTornadoライブラリ(Python)を全てのノードへ配布
     * pigz(並列でgzipするツール)を全てのノードへinstall
     * screenコマンドをtrackerとseederへinstall

2. trackerを起動
   * screenコマンドでdaemon化して起動

3. seederノードでデプロイ対象の準備 (すべてseederノード上で行われる)
   * デプロイ対象のファイルを配置
   * 対象ファイルをpigzでtar.gz化
   * torrentファイルを作成する 

4. seederを起動
   * screenコマンドでdaemon化して起動

5. deployを実行
   * torrentファイルの配布
   * torrentファイルを元に各ノードがダウンロードを実行
   * ダウンロードが終わればtar.gzを解凍

6. 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を実行することで自動インストールされるはず: 

  ```sh:
  $ ansible-playbook -i prodction setup.yml
  ```

ちなみに、デフォルトだと、`/usr/local/murder` に bitTornadoやMurderライブラリ等がインストールされるが、
group_vars/allの `remote_murder_path`を書き換えれば別のディレクトリに入れることもできる


使い方
-------

1. ./production と ./group_vars/all, を修正する。

  ./productionには対象となるサーバーのIP等を記載する

  ./production:

  ```ini: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:

  ```yaml: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を順次実行する。

2.  trackerを開始:

  ```sh:
  $ ansible-playbook -i production start_tracker.yml
  ```

3. 対象ディレクトリをseederサーバーへ配置し、 tar.gz化後にtorrent ファイルを作成する

  ```sh:
  # 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
  ```

4. デプロイ:

  ```sh:
  $ ansible-playbook -i production deploy.yml -f 1000
  ```
※ *-f オプションで同時実行数をpeerノード数より多い値で指定する*

5. seederとtrackerを停止する

  ```sh:
  $ 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を停止する