Fabricでサーバー管理を
   DRYにしよう
      2012.09.01 kyoto.py in 高槻
       Kojima Takanori (max747)
お前だれよ

• まっくす (max747)
• アクセンス・テクノロジー所属
• 元Java屋さん
• Jenkins勉強会にもよく出没します
開発サーバーの管理
どうしてますか?
パッケージアップデート


$ ssh serverA
$ sudo yum update
$ exit
SSH公開 の配備

$   scp foo.pub serverA:.
$   ssh serverA
$   sudo mv foo.pub /etc/ssh/keys/
$   chown root:root /etc/ssh/keys/foo.pub
$   exit
•   Web/APサーバー


•   DBサーバー

•   リポジトリサーバー


•   TracとかRedmineとか動かすサーバー


•   CIサーバー

•   実験用サーバー


•   仮想化ホストサーバー


•   etc...
$ ssh <web/ap server>
 $ sudo yum update
 ...
 $ exit

 $ ssh <db server>
 $ sudo yum update


• ssh serverA
 ...
 $ exit




• sudo yum update
 $ ssh <scm server>
 $ sudo yum update
 ...
 $ exit


• お茶を飲んで待つ
 $ ssh <pm server>
 $ sudo yum update
 ...


• exit
 $ exit

 $ ssh <ci server>


• 以下5回繰り返し
 $ sudo yum update
 ...
 $ exit

...
$    scp foo.pub <web/ap server>:.
 $    ssh <web/ap server>
 $    sudo mv foo.pub /etc/ssh/keys/
 $    chown root:root /etc/ssh/keys/foo.pub
 $    exit



• ssh serverA
 $    scp foo.pub <db server>:.
 $    ssh <db server>
 $    sudo mv foo.pub /etc/ssh/keys/


• sudo yum update
 $    chown root:root /etc/ssh/keys/foo.pub
 $    exit

 $    scp foo.pub <scm server>:.


• お茶を飲んで待つ
 $
 $
 $
 $
      ssh <scm server>
      sudo mv foo.pub /etc/ssh/keys/
      chown root:root /etc/ssh/keys/foo.pub
      exit


• exit
 $
 $
      scp foo.pub <pm server>:.
      ssh <pm server>


• 以下5回繰り返し
 $    sudo mv foo.pub /etc/ssh/keys/
 $    chown root:root /etc/ssh/keys/foo.pub
 $    exit

...
自動化したい
Puppet
• インストールしてみる
• ちょっと触ってみる
• ちょっとドキュメント読んでみる
• 独自DSL
• 挫折...
Chef
• インストールしてみる
• なんかCouchDBとかRabbitMQとか入る
• ちょっと触ってみる
• Ruby DSL
• 挫折...
Puppet/Chef 雑感

• それなりの学習曲線
• (時間の) 初期投資必要
• 運用に乗ってしまえばたいへん強力
• サーバー台数が多ければ多いほど強力
やりたいこと再考
• 繰り返し作業を自動化したい
• でも覚えることは減らしたい
• 管理したいのは5∼6台
• シェルスクリプトでできなくもない?
• Pythonでなんかいいツールないかなぁ
それFabricでできるよ
Fabric

• デプロイやシステム管理の支援ツール
• SSHを使用
• コマンドラインベース
• Python2.5以上で動作 (not 3.x)
活用例
• パッケージアップデート
• (必要性をチェックして) リブート
• 一斉シャットダウン
• 全マシンにSSH公開 を投入
• 新しい仮想インスタンスの構成
インストール


$ pip install fabric
             ※お好みによりsudoをご利用下さい。
ヘルプ


$ fab -h
タスク定義

from fabric.api import run, local

def host_type():
    run(“uname -s”)

def local_host_type():
    local(“uname -s”)
実行


$ fab -H hostA host_type
実行
$ fab -H localhost,linuxbox host_type
[localhost] run: uname -s
[localhost] out: Darwin
[linuxbox] run: uname -s
[linuxbox] out: Linux

Done.
Disconnecting from localhost... done.
Disconnecting from linuxbox... done.
定義済みタスクの表示


$ fab -l
定義済みタスクの表示
# coding: utf8                         $ fab -l

u"""
                                       max747.org の管理用
max747.org の管理用
"""
                                       Available commands:
from fabric.api import sudo, task

@task                                      package_update    パッケージをアップデートします.
def package_update():
    u"""パッケージをアップデートします."""                reboot            マシンをリブートします.
      distro = _get_distro()               shutdown          マシンをシャットダウンします.
      if distro == "Debian":
          sudo("apt-get -y upgrade")
      elif distro == "Redhat":
          sudo("yum -y update")

def _get_distro():
    ...
    return "Debian"

@task
def shutdown():
    u"""マシンをシャットダウンします."""
      sudo("shutdown -h now")

@task
def reboot():
    u"""マシンをリブートします."""
      sudo("reboot")
sudo

from fabric.api import sudo

def package_update():
    sudo(“yum update”)
        ※あらかじめvisudoなどは済ませておきましょう。
ファイル転送

from fabric.api import get, put

def download_logs():
    get(“/var/log/httpd/access.log*”)

def upload_keys():
    put(“README.txt”, “/tmp”)
ファイルの存在チェック

from fabric.api import sudo, put
from fabric.contrib.files import exists

def upload_keys():
  if exists(“/etc/ssh/keys”):
    put(“keys”, “/tmp”)
    sudo(“mv /tmp/keys/* /etc/ssh/keys”)
カレントディレクトリの保持

from fabric.api import cd, sudo

def package_update():
  with cd(“/usr/local/src”):
    sudo(“tar xvf foo-1.0.tar.gz”)
  with cd(“/usr/local/src/foo-1.0”):
    sudo(“./configure”)
    sudo(“make”)
    sudo(“make install”)
他にもいろいろ
• ホストの事前定義
• ホストのグループ化
• 出力結果の色を変更
• プロンプト、confirm
• etc...
Fabricのいいところ

• シェルでコマンド叩く作業の延長
• APIが直感的
• 覚えるべきことが少ない
• 気軽に始められる(重要!)
Fabricでサーバー管理も
  DRYにしよう!

Fabricでサーバー管理をDRYにしよう