Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结构、@并行和动态变化的主机_Python_Ssh_Fabric - Fatal编程技术网

Python 结构、@并行和动态变化的主机

Python 结构、@并行和动态变化的主机,python,ssh,fabric,Python,Ssh,Fabric,我有一个脚本,可以启动EC2实例,并将新实例作为列表传递给另一个类,该类尝试在其上部署代码和内容。 我的部署过程正在使用@parallel来并行每个主机的整个过程。 当我的deployer类实例化时,我尝试设置env.hosts,遇到了一个我还无法克服的障碍 似乎@parallel decorator导致我的任务在设置env.hosts之前分叉,因此这些任务不熟悉新的主机 class Deployer(object): """Deploys workers code on given list

我有一个脚本,可以启动EC2实例,并将新实例作为列表传递给另一个类,该类尝试在其上部署代码和内容。

我的部署过程正在使用@parallel来并行每个主机的整个过程。
当我的deployer类实例化时,我尝试设置env.hosts,遇到了一个我还无法克服的障碍

似乎@parallel decorator导致我的任务在设置env.hosts之前分叉,因此这些任务不熟悉新的主机

class Deployer(object):

"""Deploys workers code on given list of workers"""

   def __init__(self, hosts):
        env.hosts = hosts
        global pool_size
        pool_size = len(hosts)

   @parallel(pool_size=pool_size)
   def update_workers(self):
       sudo("aptitude update")
       #skip grub update.
       sudo("DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\" dist-upgrade")

   @parallel(pool_size=pool_size)
   def copy_conf_to_worker(self, local_path):
       result = put(local_path,'/tmp/',use_sudo=False)
调用类时:

deployer = Deployer(hosts)
deployer.update_workers()
我收到了主机提示:

2014-08-20 14:15:30,896 INFO 41 Going to deploy the next hosts: ['some-host.compute-1.amazonaws.com']
No hosts found. Please specify (single) host string for connection:
这是可能的,还是我应该考虑另一个行动过程?
提前感谢。

我找不到解决方案,所以我使用了一种变通方法:
我将任务移动到一个fab文件中:

fabfile.py

from fabric.api import *
# Fabric related conf
env.disable_known_hosts = False
env.reject_unknown_hosts = False
env.use_ssh_config = True
env.connection_attempts = 3
env.coloreize_errors = True
env.forward_agent = True
pool_size=len(env.hosts)

@parallel(pool_size=pool_size)
def update_workers():
    sudo("aptitude update")
    #skip grub update.
    sudo("DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\" dist-upgrade")

@parallel(pool_size=pool_size)
def copy_conf_to_worker(local_path):
    env.host_string = env.host
    result = put(local_path,'/tmp/',use_sudo=False)
在代码中,我称之为fable.py:

def run_fabric_tasks(self, path_to_conf_file):
        cmd = 'fab update_workers copy_conf_to_worker:%s -H %s' % (path_to_conf_file, ",".join(self.hosts))
        result = local(cmd)
        deploy_workers(path_to_conf_file)
        return result
我知道这可能更优雅(参数/命令方面),但这只是一个对我有效的原始解决方案。 如果有更优雅的,我想知道