Fabric,@ parallel和动态更改主机

时间:2014-08-20 11:32:07

标签: python ssh fabric

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

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

似乎@parallel装饰器导致我的任务在设置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:

这是可能的,还是我应该考虑另一种行动方案? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我无法找到解决方案,所以我使用了一种解决方法:
我将任务移到了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

我知道这可能更优雅(参数/命令明智),但这只是一个对我有用的原始解决方案。 如果有更优雅的东西,我想知道。