我使用Ansible的playbook编写了一个利用BitTorrent的快速部署工具
Ansible-列出存储设备
在Twitter上有一个名为Murder的用户创建了一款利用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(由Murder提供动力)的大规模服务器部署工具。
ansible-lssd 是以 Ansible Playbooks 的形式运行。
这些 Playbooks 需要 Ansible 1.3 或更高版本。
这些 Playbooks 在 CentOS 5.x 上进行了测试。(如果在使用 yum 的部分进行修正,应该可以运行)
与Murder本家进行比较
相比于谋杀,应该有以下优点。
-
- Ruby不要でPythonのみで動作する
-
- Capistranoが不要で、ansible playbooksとして動作する
- 環境セットアップがplaybooksによって自動化されている
仅需一种选项:安装最基本必需的软件。
只需要在执行ansible的主机上安装ansible
用sudo pip安装ansible:
# install pip and ansible
$ sudo easy_install pip
$ sudo pip install ansible
只需选择一个将以下内容以中文进行本地化:
然后,从 https://github.com/masahide/ansible-lssd 克隆 ansible-lssd。
$ git clone https://github.com/masahide/ansible-lssd.git
如何运作
虽然和Murder的”How it works”没有太大的不同,
简单解释一下,感觉如下。(如果有人发现错误,请纠正)
登场的节点有以下三种类型(确切地说,包括执行ansible的主机在内共有四种类型)。
-
- tracker
BitTorrentでのファイル配布情報収集役のノード。各peerへ事前に配るtorrentファイルにこのサーバーIPが記載されている。配布情報を取り仕切る拠点になる。
seeder
配布するファイルの大元になるノード このノードに配布元となるファイル(ディレクトリ)をtar.gzしたファイルを配置する。
peer
配布対象のseeder以外の全てのノード
部署操作按照以下顺序执行
-
- 对各节点进行初始化设置(仅首次)
分发和安装部署所需的软件
将Murder脚本(Python),BitTornado库(Python)分发到所有节点
将pigz(用于并行gzip的工具)安装到所有节点
将screen命令安装到tracker和seeder
启动tracker
使用screen命令将其守护化并启动
在seeder节点准备部署对象(在所有seeder节点上完成)
配置部署对象的文件
使用pigz将目标文件打包为tar.gz格式
创建种子文件
启动seeder
使用screen命令将其守护化并启动
执行部署
分发种子文件
根据种子文件,各节点执行下载
下载完成后解压tar.gz文件
停止tracker和seeder
使用pkill停止守护化的脚本
设定
将tracker、seeder和peer节点列在清单文件(./production)中。
所有服务器都需要安装Python,但是由于CentOS5已经预装了Python,所以没有特别的问题。
但是,可能需要执行http://qiita.com/yamasaki-masahide/items/4485a438125e6b1748ce,具体视情况而定。
通过执行以下的setup.yml playbook应该自动安装其他必要的软件(如BitTornado、Murder lib、screen、pigz等)。
$ ansible-playbook -i prodction setup.yml
顺便提一下,默认情况下,bitTornado和Murder库等会安装在/usr/local/murder目录下,但可以通过编辑group_vars/all文件中的remote_murder_path来将其安装到其他目录。
使用方法
- 修改./production和./group_vars/all文件。
在 ./production 中,需要记录目标服务器的IP等信息。
./生产:
# 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文件中。
# deploy tag
tag: Deploy1
# path
seeder_files_path: ~/builds
destination_path: /opt/hoge # or some other directory
通过setup.yml指定destination_path变量,您可以指定用于在服务器上部署Murder库和支持文件的目录。
例如,如果将tag设置为Deploy1并将destination_path设置为/opt/hoge,
则所有文件将部署到每个peer的/opt/hoge/Deploy1目录中。
完成上述设置后,按照下面的ansible-playbook一次执行。
- 开始追踪器:
$ 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
应该已经完成了所有同事的/opt/hoge/Deploy1的部署。
主要的玩法手册参考
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を停止する