【问题标题】:fabric env.hosts not being identified织物 env.hosts 未被识别
【发布时间】:2017-03-22 14:28:36
【问题描述】:

我有一个简单的 fabfile 名称 env_fabfile.py

# env_fabfile.py
# makes use of fab env variables 

from fabric.api import env, run
def login():
    env.hosts = ['user@host1:1234', 'user@host2:2345']
    env.passwords = {'user@host1:1234': 'pass1', 'user@host2:2345': 'pass2'}
    env.parallel=True

def run_lsb_release():
    run('lsb_release -a')

现在我使用 fab 命令运行上述代码:

fab -f env_fabfile.py login run_lsb_release

它完美运行(并行)并提供所需的输出

现在我想实际计算同一脚本串行运行与并行运行之间的时间差。为此,我编写了以下 python 脚本: timecal.py

# timecal.py
# runs the fabfile once in serial and calculates the time
# then runs the same file in parallel and calculates the time

from fabric.api import env, run
import time

def login():
    print "in login"
    env.hosts = ['user@host1:1234', 'user@host2:2345']
    env.passwords = {'user@host1:1234': 'pass1', 'user@host2:2345': 'pass2'}

def parallel(status):
    print "in parallel"
    env.parallel=status

def run_lsb_release():
    print "in run"
    run('lsb_release -a')

def do_serial():
    start_time = time.time()
    parallel(False)
    login()
    run_lsb_release()
    elapsed_time = time.time() - start_time
    return elapsed_time

def do_parallel():
    start_time = time.time()
    parallel(True)
    login()
    run_lsb_release()
    elapsed_time = time.time() - start_time
    return elapsed_time


if __name__ == '__main__':  
    print "Running in serial mode "
    print "Total time taken ", do_serial()

    print "Running in parallel mode"
    print "Total time taken ", do_parallel()

但是当我运行 timecal.py 作为

python timecal.py

我在标准输出上得到以下信息(除了代码中的打印语句)

未找到主机。请指定(单个)主机字符串进行连接:

我不明白为什么?另外如何纠正脚本以便我可以实现我想要的(如上面的问题所述)

如果我尝试不同版本的 timecal.py,如:

from fabric.api import run, settings, env
import time

def do_parallel():
    start_time = time.time()
    env.hosts = ['user@host1:1234', 'user@host2:2345']
    env.passwords = {'user@host1:1234': 'pass1', 'user@host2:2345': 'pass2'}
    env.parallel=True
    run('lsb_release -a')
    elapsed_time = time.time() - start_time
    return elapsed_time

def do_serial():
    start_time = time.time()
    with settings(host_string='host1', port=1234, user='user', password='pass1'):
        run('lsb_release -a')
    with settings(host_string='host2', port=2345, user='user', password='pass2'):
        run('lsb_release -a')
    elapsed_time = time.time() - start_time
    return elapsed_time

if __name__ == '__main__':  
    try:
        print "Running in parallel mode"
        print "Total time taken ", do_parallel()

        print "Running in serial mode "
        print "Total time taken ", do_serial()
    except Exception as e:
        print e

我收到以下错误:

致命错误:需要提示输入目标主机连接字符串(主机:无),但在并行模式下输入会不明确

我不明白为什么主机:这里没有?代码有什么问题?

【问题讨论】:

    标签: python parallel-processing fabric


    【解决方案1】:

    简短的回答是您不应该按照您当前的方式设置env.hosts 值,env.passowrds 是超级粗略的(可能坏了?),it's recommended to use SSH key-based access,尤其是leveraging native SSH config files

    这是你的 timecal.py 脚本的修改版本,它可以按预期工作,我将在下面列出一些不同之处。

    # timecal.py
    # runs the fabfile once in serial and calculates the time
    # then runs the same file in parallel and calculates the time
    
    from fabric.api import env, run, execute, parallel
    import time
    
    env.use_ssh_config = True
    env.roledefs = {
        "my_servers": ['server_1', 'server_2']
    }
    
    
    def run_lsb_release():
        print "in run"
        run('lsb_release -a')
    
    
    def do_task(task_func):
        start_time = time.time()
        execute(task_func, roles=['my_servers'])
        elapsed_time = time.time() - start_time
        return elapsed_time
    
    
    if __name__ == '__main__':
        print "Running in serial mode "
        print "Total time taken ", do_task(run_lsb_release)
    
        print "Running in parallel mode"
        print "Total time taken ", do_task(parallel(run_lsb_release))
    

    主要区别在于使用 env.roledefs 和 SSH 配置文件,而不是主机和密码。由于这些任务是在单独的线程中执行的,因此这些值在并行执行模式下将不起作用。 The docs 有点瘦,但这基本上就是你遇到这个问题的原因。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2013-04-10
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多