LoginSignup
80

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-08-27

はじめに

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

おわりに

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
80