まず、コマンドが localhost で実行される理由env
は、グローバル変数であり、それをローカルでオーバーライドしているためですが、ファブリックがコマンドを実行しているときには表示されません。関数の外で host_string を定義する必要があります。
env.host_string = 'remotehost'
env.user = 'remoteuser'
def download_backup():
run('ls -t /usr/local/lib/backups | head -1')
実行時にホストを変更するには、いくつかのオプションがあります。まず、roles
およびroledefs
機能を利用できます。
env.roledefs = {
"ex1": ["host1.example.com"],
"ex2": ["host2.example.com"],
}
env.roles = ["ex1"]
def download_backup():
run("ls -t /usr/local/lib/backups | head -1")
デフォルトでは、env.roles が に設定されているため、実行時fab download_backup
にバックアップが取得されます。その設定を上書きしたい場合は、コマンドラインから役割を指定できます:host1.example.com
ex1
fab -R ex2 download_backup
これにより、ロールex2
を使用してファブリックが開始され、代わりにバックアップが取得されhost2.example.com
ます。
他のオプションは、それenv
が単なるグローバル変数であるという事実を利用することです。
def download_backup():
run("ls -t /usr/local/lib/backups | head -1")
def download_backup_ex1():
global env
env.host_string = "host1.example.com"
download_backup()
def download_backup_ex2():
global env
env.host_string = "host2.example.com"
download_backup()
個人的には、この場合に行われていることに明らかに適しているため、最初の方法を好みますが、2 番目の方法がより良い代替手段である可能性があることは想像できます。