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
を実行すると次のような結果が得られます。
fab --list
は、Fabricで扱うことのできる関数を表示するコマンドで、結果は、今日追加したcheck
のみが表示されています。
他のhost_type
とhost_file
が表示されていないのは、デコレーターのtask
がcheck
以外の関数を無効にしているからです。
試しに22行目をコメントアウトして、ターミナルからfab --list
を実行すると、host_type
、host_file
、check
の3つが表示されます。
関数内関数でtask
次にtask
を使った関数の中に、別の関数を呼び出してみます。
def all_files():
run('ls -a')
@task
def check():
all_files()
21行目までは同じコードなので、省略しています。
22行目と23行目ですべてのファイルを表示する関数all_files
を定義します。(server1
とserver2
で実行されるコマンド)
26行目で先ほどと同じ関数名(check
)にして、22行目の関数all_files
を実行しています。
コードの追加が終われば、先ほどと同じようにターミナルからfab --list
を実行してみるとcheck
だけが表示されますので、次はfab check
を実行してみます。
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
だけで実行すると、関数who
がserver1
とserver2
で実行されます。
もちろん、コマンドfab
の後にcheck
を入れて実行した場合は、ひとつ前の見出しの実行結果と同じ結果が得られます。
まとめ
コマンドを実行してみて、予想どおりの結果が返されると気持ちいいんですよね。
多分、脳内からベータエンドルフィンが出てるんでしょうね。
できることがたくさんあって、今は使い道も理解しないまま動作することに喜びを覚えていますが、どのような動きを期待して、どの場面で使うのか理解していかないとFabricを使いこなせているとは言えません。
とはいえ、一朝一夕にできるものではないので、トライ&エラーを繰り返しながら少しずつ前に進んでいきましょう。
それでは明日もGood Python!