如何在Fabric中设置动态主机

0 投票
1 回答
1214 浏览
提问于 2025-04-17 14:59

下面的代码可以设置动态主机:

def set_hosts():
    env.hosts = ['host1', 'host2']

def mytask():
    run('ls /var/www')

但是我只能在命令行中运行这个,工作是一个接一个地进行,而不是同时进行:

fab set_hosts mytask

我该如何在fabfile中运行它?这样我就可以给这个任务加上@parallel装饰器,让它们同时运行。

def set_namehost():
    env.hosts = ['namehost']

def get_namehost():
    run('ls /var/www')

def set_hosts():
    env.hosts = ['host1', 'host2']

def mytask():
    run('ls /var/www')

我只能在命令行中运行:fab set_namehost get_namehost;fab set_hosts mytask,需要输入两次。如何把这两个任务合并成一个呢?

1 个回答

0

如果我理解得没错,你是想在多个主机上运行一个任务。

如果是这样,你可以这样做:

from fabric.api import *

env.roledefs = {
    'host1'   : ['you@yourFirstHost.com'],
    'host2'   : ['you@yourSecondHost.com'],
    'host3'   : ['you@yourThirdHost.com']
}

@task
def runTask():
    for subtask in (deploy_host1, deploy_host2, deploy_host3):
        execute(subtask)


@roles('host1')
def deploy_host1();
    run('ls /var/www')

@roles('host2')
def deploy_host2();
    run('ls /var/www')


@roles('host3')
def deploy_host3();
    run('ls /var/www')

运行命令:fab runTask

这个命令会在所有主机上执行你定义的任务。我建议你使用这种方法,特别是当你想在不同主机上运行不同命令的时候。

在查看fab的文档时,你可能会想用这种方法:

http://docs.fabfile.org/en/1.5/usage/parallel.html

from fabric.api import *

@parallel
def runTask():
    run('ls /var/www')

fab -H host1, host2, host3 runTask

希望这对你有帮助。

撰写回答