このエントリーをはてなブックマークに追加

1.1.9. Fabric

1.1.9.1. 概要

Fabricは、Pythonで開発されているデプロイツールでRubyで開発されているCapistranoと同じようなものです。
Chef-Soloと組み合わせて利用する場合も多いです。
GitHub Fabric <https://github.com/fabric/fabirc> で開発されています。

1.1.9.2. インストール

pipでもインストール( pip install fabric )できますがここではソースからインストールしてみます。

$ sudo apt-get install git build-essential python-setuptools python-crypto -y
$ cd /usr/local/src
$ sudo git clone https://github.com/fabric/fabric
$ cd fabric
$ sudo python setup.py  install

1.1.9.3. 使い方1.(ローカルサーバでの実行)

ローカルサーバでhelloを表示する。
fabfile.pyという名前で作成しそのファイルがあるディレクトリで実行する場合は-fによるファイル指定は必要ありません
$ mkdir fabric
$ cd fabric
$ vi hello.py
from fabric.api import local

def hello():
   local("echo Hello")

実行してみます。

$ fab hello -f hello.py
[localhost] local: echo Hello
Hello

Done.

1.1.9.4. 使い方2.(リモートホストでの実行)

リモートホストでhostnameを実行してみます。
60側はユーザが違うためroot@を付与しています。
オーバーライドによる設定が可能です。
$ vi remote_hostname.py
from fabric.api import env, run

env.user = 'stack'
env.hosts = ['root@192.168.10.5:22', 'stack@192.168.10.50:22']
env.passwords = {'root@192.168.10.5:22': 'password1', 'stack@192.168.10.50:22': 'password2'}


def remote_hostname():
    run('hostname')

実行

$ fab remote_hostname -f remote_hostname.py
[root@192.168.10.5:22] Executing task 'remote_hostname'
[root@192.168.10.5:22] run: hostname
[root@192.168.10.5:22] out: trust01

[stack@192.168.10.50:22] Executing task 'remote_hostname'
[stack@192.168.10.50:22] run: hostname
[stack@192.168.10.50:22] out: stack01


Done.
Disconnecting from root@192.168.10.5... done.
Disconnecting from 192.168.10.50... done.
ホストやユーザ、パスワードはオプションでも指定可能ます。
その場合env.hostsとenv.passwordsなどはコメントにしてください。
$ fab remote_hostname -f remote_hostname.py -H 192.168.10.30 -u stack -p stack

1.1.9.5. 使い方3.(sudo)

sudoを利用する。
サーバ側にsudoの設定が無いと勿論ダメです。
$ vi remote_yum.py
from fabric.api import env, sudo

env.user = 'stack'
env.password = 'stack'
env.hosts = ['192.168.10.5']

def yum_update():
    sudo('yum update',user='root', pty=True)

実行

$ fab yum_update -f remote_yum.py

1.1.9.6. 使い方4.(ファイルのPUT、GET)

ファイルの権限は保持してくれないみたいですのでサーバ側で変更します。
tmpにdata.shを作成してサーバのtmpにdata2.shとしてコピーして実行します。
$ vi remote_put_and_run.py
from fabric.api import local, env, put, get, run

env.user = 'stack'
env.password = 'stack'
env.hosts = ['192.168.10.5']

def put_and_run():
  local('echo date > /tmp/date.sh')
  put('/tmp/date.sh', '/tmp/date2.sh')
  run('chmod 755 /tmp/date2.sh')
  run('/tmp/date2.sh')

実行

$ fab put_and_run -f remote_put_and_run.py
fab put_and_run -f remote_put_and_run.py
[192.168.10.5] Executing task 'put_and_run'
[localhost] local: echo date > /tmp/date.sh
[192.168.10.5] put: /tmp/date.sh -> /tmp/date2.sh
[192.168.10.5] run: chmod 755 /tmp/date2.sh
[192.168.10.5] run: /tmp/date2.sh
[192.168.10.5] out: 2012年  9月 25日 火曜日 16:43:34 JST


Done.
Disconnecting from 192.168.10.5... done.

1.1.9.7. 使い方5.(ディレクトリ移動してリポジトリからチェックアウト)

リポジトリのディレクトリがなければ作成します。
ない場合はチェックアウトした後にPULLもしてしまいますけど。
git pullも必要ないかもしれませんが一応入ってます。
$ vi keystone_install.py
from fabric.api import env, local, cd ,run ,settings

env.user = 'root'
env.password = 'stack'
env.hosts = ['192.168.10.60']

def keystone_deploy():
  keystone_dir = '/opt/keystone'
  with settings(warn_only=True):
    if run("test -d %s" % keystone_dir).failed:
      run("mkdir -p %s" % keystone_dir)
      run("git clone git://github.com/openstack/keystone %s" % keystone_dir)
  with cd(keystone_dir):
    run("git pull")

実行

$ fab keystone_deploy -f keystone_install.py
とりあえず基本的な利用法だけ記述しました。
他にも何でも出来るみたいなのでChef-Soloいらないんかなとかさえ思って来ました。