サーバー環境をテストする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です。どんどんお願いします。

Comments

comments powered by Disqus