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_installやpipでインストール可能です。
CentOSの場合は、下記のように、まずEPELおよびPython 2.6をインストールした後、easy_installでFabricを導入します。
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"
]
(略)
0 コメント:
コメントを投稿