2011年4月25日月曜日

Fabricで複数サーバのyumパッケージ更新を効率化

こんにちは。ikuyamadaです。

FabricというPythonのライブラリをご存知ですか?Fabricは、SSH経由で任意のコマンドを実行するPythonスクリプトを簡単に記述できるようにするためのライブラリです。

Fabricを使うと、従来はシェルスクリプト等で行っていた、ソフトウェアの複数サーバへのデプロイやシステム管理などを簡単なPythonのスクリプトで自動化することが出来ます。

例えば、通常のコマンド実行は、run("ls")などと書けばできますし、その他、管理者権限のコマンドを実行するsudoや任意のファイルをコピーするputなど、様々な関数が用意されています。

今回は、Fabricの紹介も兼ねて、弊社で実際に用いているFabricを用いたyumによるパッケージ更新スクリプトについて紹介と思います。この簡単なスクリプトを使うと、複数のサーバへのyumのパッケージ更新を、内容を確認しながらインタラクティブに行えるようになります。

(この記事は、先月にLinux Gazette誌に投稿した「Applying Yum Package Updates to Multiple Servers Using Fabric」を翻訳、編集したものです)

インストール


まずFabricをインストールする必要があります。easy_installpipでインストール可能です。

CentOSの場合は、下記のように、まずEPELおよびPython 2.6をインストールした後、easy_installFabricを導入します。
EPELをインストール:
# sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
Python 2.6をインストール:
# sudo yum -y install gcc python26 python26-devel python26-distribute
Fabricをインストール:
# sudo easy_install-2.6 fabric

スクリプト

それではスクリプトを紹介します。任意のディレクトリにfabfile.pyというファイルを作成し、下記の内容をペーストしてください。
#!/usr/bin/env python2.6

from fabric.api import *
from fabric.contrib.console import confirm

env.warn_only = True

def update():
    if run("yum check-update").return_code != 0:
        if confirm("execute yum update?", default=False) == True:
            sudo("yum -y update")
このスクリプトでは各サーバにSSHで接続、yum check-updateを実行し、アップデートがあった場合に、アップデートの内容を表示して、yum -y updateを実行するかどうか問い合せます。

内部的には、yum check-updateがパッケージの更新があった場合に返り値として0以外を返すため、それを利用して、パッケージ更新があるかないかを検出しています。
また、Fabricはコマンドの返り値が0以外であった場合にデフォルトで終了してしまうため、env.warn_only = Trueとすることで、終了しないように設定しています。

それでは、早速実行してみます。fabfile.pyを作成したディレクトリで下記のコマンドを実行してみてください。
# fab -H HOST_NAME1,HOST_NAME2 update
(HOST_NAME1, HOST_NAME2にホスト名を入力してください)

そうすると、下記のような形で、Fabricがパッケージ更新があるかをチェックし、更新がある場合、更新を行うかどうかを問い合せます。
[qui-gon.ikuya.net] Executing task 'update'
[qui-gon.ikuya.net] run: yum check-update
[qui-gon.ikuya.net] out: Loaded plugins: fastestmirror
[qui-gon.ikuya.net] out:
[qui-gon.ikuya.net] out: bind-libs.x86_64                        30:9.3.6-4.P1.el5_5.3            updates
(snip)
[qui-gon.ikuya.net] out: udev.x86_64                             095-14.21.el5_5.1                updates

Warning: run() encountered an error (return code 100) while executing 'yum check-update'

execute yum update? [y/N]

また、下記のような形でfabfile.py内に予めホスト名を設定しておくこともできます。
#!/usr/bin/env python2.6

from fabric.api import env, run, sudo
from fabric.contrib.console import confirm

env.hosts = [
    "HOST_NAME1",
    "HOST_NAME2"
]
(略)

最後に

今回はFabricを使ってyumのパッケージ更新スクリプトを紹介しました。もしFabricに興味を持たれた場合は、Fabricのオフィシャルドキュメントを参照してみてください。

0 コメント:

コメントを投稿