##はじめに
Python製のデプロイツールfabricは,シェルスクリプトをPythonで便利に利用できるようにしたものであり,Chef-Soloライクな構成管理を容易に行うことができる.また,Chefの大きな特徴の1つである冪等性だが,fabricのラッパーであるcuisineを用いることで,保証することができる.
非常にシンプルでChefなどと比較すると学習コストも小さく,さらに対象となるマシンにのみインストールすればよいので手軽に導入できる.今回はfabricを用いてvagrantへdotfilesを配置するちょっとしたスクリプトを書いてみた.
##インストール
以下のコマンド一発でインストールできる.
$ pip install fabric cuisine
##使い方
対象マシンのホストをenv.hostsで指定し,コマンドをrun()で囲んで実行する.sudoで実行したいときはsudo()で囲む.基本はたったこれだけ.
# -*- encoding:utf-8 -*-
from fabric.api import env
from fabric.decorators import task
from cuisine import run
env.hosts = ['192.168.33.10']
@task
def A():
run('echo A')
@task
def B():
sudo('echo B')
@task
def main():
A()
B()
mainを実行すると,以下のように対象マシンで実行できていることが分かる.
$ fab main
[192.168.33.10] run: echo A
[192.168.33.10] out: A
[192.168.33.10] run: echo B
[192.168.33.10] out: B
Done.
Disconnecting from 192.168.33.10... done.
package_ensure()などの_ensure()メソッドや,dir_exists()などの_exisits()メソッドをうまく用いることで,冪等性を保証することができる.
package_ensure('vim') # vimがインストールされていない場合のみインストール
##vagrant連携
vagrantと連携させるには,以下のコマンドを実行する.
$ vagrant plugin install vagrant-fabric
そして,Vagrantfileに以下の設定を記述.
...
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
...
config.vm.provision :fabric do |fabric|
fabric.fabfile_path = './fabfile.py'
fabric.tasks = ['set_env'] # 実行したいタスク
end
end
今回は以下の様なdotfileを配置するファイルを書いてみた.
# -*- encoding:utf-8 -*-
from fabric.api import env, settings
from fabric.decorators import task
from cuisine import mode_sudo, select_package, run, package_ensure, dir_exists, cd
select_package('apt')
@task
def set_env():
setup_packages()
fetch_dotfiles()
set_symlinks()
@task
def setup_packages():
with settings(mode_sudo()):
package_ensure('unzip')
@task
def fetch_dotfiles():
if not dir_exists('dotfiles'):
run('git clone --recursive git@github.com:pika-shi/dotfiles.git')
@task
def set_symlinks():
path_pair_list = [
('dotfiles/_zshrc', '.zshrc'), ('dotfiles/_tmux.conf', '.tmux.conf'),
('dotfiles/_vimrc', '.vimrc'), ('dotfiles/_vim', '.vim')
]
with cd('~/'):
for path_set in path_pair_list:
run('ln -s {} {}'.format(*path_set))
vagrant upした状態で以下のコマンドを実行すると,タスクが実行され,dotfileに適切なシンボリックリンクがはられる.
$ vagrant provision
##おわりに
このように,ちょっとした構成管理を非常に容易に行うことができるので,使ってみてその便利さを実感してみて下さい.