Fabricのtaskの使い方

Python学習【365日チャレンジ!】246日目のマスターU(@Udemy11)です。

車検の期限が迫ってきているので、格安車検サービスを利用しようと思って無料見積もりに行ったのですが、想像していた金額を上回っていたので、とりあえずディーラーでも見積もりをもらうことにしました。

その際に格安車検サービスの見積書を渡していたからかもしれませんが、差額は1万円以内で、代車も用意してくれるとのことだったので、ディーラーで車検することに決めました。

格安車検サービスは、ディーラーの車検に比べてかなり安いイメージがあったので、サービスの充実を加味すると、ディーラーとそんなに変わらないということがわかりました。

あくまで一例なので、他のディーラーがすべて格安車検に比べて金額がそんなに変わらないというわけではありませんので、あしからず。。。

ディーラーの安心感が価格差を上回るかどうかということも重要ですので、いくつかのサービスを比較してみてください。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日は、rolesの使い方を学習しました。

rolesを使って関数をデコレートして、指定したサーバーのみで関数の処理を行わせることができました。

ちがう関数のコードを書いて、rolesでデコレートすることで、それぞれの関数を実行するサーバーを指定することができました。

詳細については、昨日の記事を参考にしてみてください。

今日は、デコレーターのtaskの使い方を学習します。

task

Fabricを使うためのファイルがfabfile.pyですが、複数の関数が書かれたコードの中で、実行可能な関数を指定するのがtaskです。

taskをデコレーターで使えば、taskでデコレートされた関数のみが実行できるようになります。

from fabric.api import run, env, roles, task

env.hosts = ['root@172.16.200.101:22', 'root@172.16.200.102:22']
env.passwords = {
    'root@172.16.200.101:22': 'root',
    'root@172.16.200.102:22': 'root',
}

env.roledefs = {
    'web':['root@172.16.200.101:22'],
    'db':['root@172.16.200.102:22']
}

@roles('web')
def host_type():
    run('uname -s')

@roles('db')
def host_file():
    run('ls -al')

@task
def check():
    run('ls -a')

ハイライトしている部分が昨日のコードから変更した部分です。

新しくtaskをインポートして、taskでデコレートしたcheckという関数を定義しています。

コマンドls -aは、lsにファイルやフォルダを一覧表示するオプション(-a)を加えたコマンドですです。

ターミナルからコマンドfab --listを実行すると次のような結果が得られます。

Fabricのtaskの使い方

fab --listは、Fabricで扱うことのできる関数を表示するコマンドで、結果は、今日追加したcheckのみが表示されています。

他のhost_typehost_fileが表示されていないのは、デコレーターのtaskcheck以外の関数を無効にしているからです。

試しに22行目をコメントアウトして、ターミナルからfab --listを実行すると、host_typehost_filecheckの3つが表示されます。

Fabricのtaskの使い方

関数内関数でtask

次にtaskを使った関数の中に、別の関数を呼び出してみます。

def all_files():
    run('ls -a')

@task
def check():
    all_files()

21行目までは同じコードなので、省略しています。

22行目と23行目ですべてのファイルを表示する関数all_filesを定義します。(server1server2で実行されるコマンド)

26行目で先ほどと同じ関数名(check)にして、22行目の関数all_filesを実行しています。

コードの追加が終われば、先ほどと同じようにターミナルからfab --listを実行してみるとcheckだけが表示されますので、次はfab checkを実行してみます。

Fabricのtaskの使い方

taskでデコレートされていない関数all_filesが実行されているのがわかるかと思います。

このように、taskでデコレートされていない関数でも、デコレートされた関数内関数にすればfab実行可能になります。

default=True

実行コマンドには、オプションをつけなくても実行されるデフォルトの動作がありますが、fabコマンドにもデフォルトを指定することが可能です。

def all_files():
    run('ls -a')

@task
def check():
    all_file()

@task(default=True)
def who():
    run('whoami')

先ほどのコードに、29行目以降を追加しています。

関数checkと同じように、taskをつけた関数whoを定義していますが、引数でdefault=Trueと指定しています。

whoamiは、Fabricのコマンドで、サーバーのIDを返すコマンドです。

ターミナルでコマンドfabだけで実行すると、関数whoserver1server2で実行されます。

Fabricのtaskの使い方

もちろん、コマンドfabの後にcheckを入れて実行した場合は、ひとつ前の見出しの実行結果と同じ結果が得られます。

まとめ

コマンドを実行してみて、予想どおりの結果が返されると気持ちいいんですよね。

多分、脳内からベータエンドルフィンが出てるんでしょうね。

できることがたくさんあって、今は使い道も理解しないまま動作することに喜びを覚えていますが、どのような動きを期待して、どの場面で使うのか理解していかないとFabricを使いこなせているとは言えません。

とはいえ、一朝一夕にできるものではないので、トライ&エラーを繰り返しながら少しずつ前に進んでいきましょう。

それでは明日もGood Python!