デプロイツールfabric+cuisineで冪等性保証

  • 81
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

Python製のデプロイツールfabricは,シェルスクリプトをPythonで便利に利用できるようにしたものであり,Chef-Soloライクな構成管理を容易に行うことができる.また,Chefの大きな特徴の1つである冪等性だが,fabricのラッパーであるcuisineを用いることで,保証することができる.

非常にシンプルでChefなどと比較すると学習コストも小さく,さらに対象となるマシンにのみインストールすればよいので手軽に導入できる.今回はfabricを用いてvagrantへdotfilesを配置するちょっとしたスクリプトを書いてみた.

インストール

以下のコマンド一発でインストールできる.

$ pip install fabric cuisine

使い方

対象マシンのホストをenv.hostsで指定し,コマンドをrun()で囲んで実行する.sudoで実行したいときはsudo()で囲む.基本はたったこれだけ.

sample.py
# -*- 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を配置するファイルを書いてみた.

fabfile.py
# -*- 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

おわりに

このように,ちょっとした構成管理を非常に容易に行うことができるので,使ってみてその便利さを実感してみて下さい.