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

サーバー環境をテストするenvassertを作りました

serverspecを見て、envassertというものを作りました。

これはfabric上で実行する、環境をテストするツールです。fabricで使えますので、複数ホストで同時に走らせてチェックできます。

あるいは、fabricのtaskと組み合わせて、想定していた環境と異なっていたらtaskを途中で終わらせる、というようにも使えます。

Pythonにはrspecのように標準的なテストフレームワークはありません。envassertは標準のassertで使えるようにTrue/Falseを返すようにしています。各種テストフレームワークにも適合できるのではないかと思います。

インストール

いつもどおりにpipでOKです。

% pip install envassert

fabricのみに依存しています。cuisine, fabtoolsは実装の参考にしていますが、依存はしていません。

使い方

fabfile.pyを以下のように書きます。

from fabric.api import env, task
from envassert import file, process, package, user, group, port, cron, detect

env.use_ssh_config = True

@task
def check():
    env.platform_family = detect.detect()

    assert file.is_exists("/etc/hosts")
    assert file.is_file("/etc/hosts")
    assert file.is_dir("/tmp/")
    assert file.dir_exists("/tmp/")
    assert file.has_line("/etc/passwd", "sshd")
    assert file.owner_is("/bin/sh", "root")
    assert file.group_is("/bin/sh", "root")
    assert file.mode_is("/bin/sh", "777")

    if env.platform_family == "freebsd":
        assert file.is_link("/compat")
    else:
        assert file.is_link("/usr/tmp")

    assert package.installed("wget.x86_64")

    assert user.is_exists("sshd")
    assert user.is_belonging_group("shirou", "users")
    assert group.is_exists("wheel")

    assert port.is_listening(22)
    assert process.is_up("http") is False
    assert service.is_enabled("httpd")

    assert cron.has_entry('shirou', 'python')

だいたい見てわかるかと思います。file is exists などと英語のように書けることを心がけました。

現在以下のモジュールがあります。

  • file
  • user
  • group
  • port (ポート番号)
  • process
  • service
  • cron
  • package

があります。中身の実装はserverspecやcuisinefabtoolsから拝借しております。感謝です。

プラットフォーム判別

envassertはプラットフォームを識別する機能を実装しています。実装はohaiから拝借しました。

以下のプラットフォームを識別できるはずですが、ちゃんと確認はしてません。(単に移植しただけ)

  • rhel (redhat, centos, oracle, scientific, enterpriseenterprise, amazon)
  • debian (debian, ubuntu, linuxmint, raspbian)
  • fedora
  • suse
  • gentoo
  • arch
  • freebsd
  • netbsd
  • openbsd
  • darwin

これらdetect()で判別した結果をenv.platform_familyに入れておくと、各種関数がプラットフォームごとに正しい動作をしてくれます。手で 'freebsd'や 'rhel' などの文字列を代入しても構いません。

ただ、実装していないプラットフォームも多いです。すいません。

まとめ

serverspecを真似て、fabricを使ってサーバー環境をテストするツールを作成しました。fabricを使えればすぐに使えると思います。

現状実装していないプラットフォームやバグなど問題は多数ありますが、ある程度は使えるツールになったと思います。

patchおよびforkはwelcomeです。どんどんお願いします。