4

実行中の Fabric コマンド用に現在設定されているターゲット以外で、別のターゲットを指定してコマンドを実行するにはどうすればよいですか?

リモートホストからローカルホストにデータベースバックアップファイルをダウンロードするコマンド download_backup() があります。ローカルで実行する必要があるため、host_string は localhost です。ただし、最新のバックアップを見つけるには、リモート ホストでコマンドを実行する必要があります。私がやろうとすると:

def download_backup():
    env.host_string = 'remotehost'
    env.user = 'remoteuser'
    backup_fn = run('ls -t /usr/local/lib/backups | head -1')

それでもlslocalhost でコマンドを実行しようとします。これをリモートホストで実行するように変更しますか?

4

2 に答える 2

9

設定コンテキスト マネージャーを使用して、囲んでいるタスクのホスト設定とは関係なく、特定のコマンドが実行されるホストを変更できます。

from fabric.context_managers import settings
with settings(host_string='remote_server'):
    run('ls -lart')
于 2012-10-13T22:27:58.007 に答える
2

まず、コマンドが 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.comex1

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 番目の方法がより良い代替手段である可能性があることは想像できます。

于 2012-10-13T22:21:34.627 に答える