我有一个启动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:
这是可能的,还是我应该考虑另一种行动方案? 提前谢谢。
答案 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
我知道这可能更优雅(参数/命令明智),但这只是一个对我有用的原始解决方案。 如果有更优雅的东西,我想知道。