0

Fabric 有一个hosts设置来指定要通过 SSH 连接到哪些计算机。

Amazon Web Services 有更多的动态库存,可以使用boto等工具在 python 中查询。

有没有办法将这两种服务结合起来?理想情况下,我想要像 ansible 那样简单的方法,使用库存文件并使用像ec2.py这样的外部文件。

更具体地说,是否有针对此用例的预烘焙解决方案?理想情况下,我想像这样简单地运行一些东西:

from fabric.api import env, task
import ec2
env.roledefs = ec2.Inventory()

@task
def command():
    run("lsb_release -a")

并像这样运行它,假设env.roledefs['nginx']存在:

$ fab -R nginx command
4

2 回答 2

1

您可以同时使用fabric 和boto。首先,您需要从控制台导出 aws_secret_key、aws_secret_access_key 和默认区域。Fabric 文件名应该是 fabfile.py 而不是 ec2.py/other。

import boto, urllib2
from   boto.ec2 import connect_to_region
from   fabric.api import env, run, cd, settings, sudo
from   fabric.api import parallel
import os
import sys
REGION       = os.environ.get("AWS_EC2_REGION")
env.user      = "ec2-user"
env.key_filename = ["/home/user/uswest.pem"]
@task
def command():
    run("lsb_release -a")
def _create_connection(region):
    print "Connecting to ", region
    conn = connect_to_region(
        region_name = region, 
        aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID"), 
        aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY")
    )
    print "Connection with AWS established"
    return connection

最后,可以使用以下命令执行该程序。

$ fab command
于 2015-07-27T11:49:53.003 回答
0

来自http://docs.python-guide.org/en/latest/scenarios/admin/

你可以看到,如果你设置 env.hosts = ['my_server1', 'my_server2']

然后,您将能够定位这些主机。

使用 boto,如果您只有一个执行 ec2_connection.get_only_instances(filter={'tag':<whatever>}) 并返回其 dns 名称列表的函数,那么您将能够设置 env.hosts = [<来自 ec2>] 的 DNS 名称列表

小菜一碟!

于 2015-07-24T07:58:51.533 回答