如何在Python脚本中调用我的fabfile

如何在Python脚本中调用我的fabfile,python,ssh,boto,fabric,Python,Ssh,Boto,Fabric,我正努力在Python脚本中启动我的fabfile。我看过关于堆栈溢出的类似文章,但它们并没有解决我的问题。。。也许他们会,但我不理解他们…不确定 我的脚本根据用户希望在远程主机上运行的内容写入fab文件。以下是fabfile的一个示例: [root@ip-50-50-50-50 bakery]# cat fabfile.py from fabric.api import run def deploy(): run('wget -P /tmp https://s3.amazonaws.c

我正努力在Python脚本中启动我的fabfile。我看过关于堆栈溢出的类似文章,但它们并没有解决我的问题。。。也许他们会,但我不理解他们…不确定

我的脚本根据用户希望在远程主机上运行的内容写入fab文件。以下是fabfile的一个示例:

[root@ip-50-50-50-50 bakery]# cat fabfile.py
from fabric.api import run
def deploy():
    run('wget -P /tmp https://s3.amazonaws.com/MyBucket/httpd-2.2.26-1.1.amzn1.x86_64.rpm')
    run('sudo yum localinstall /tmp/httpd-2.2.26-1.1.amzn1.x86_64.rpm')
然后我需要从我的脚本运行这个文件。如果我从命令行手动运行以下命令,那么它可以正常工作:

fab -f fabfile.py -u ec2-user -i id_rsa -H 10.10.15.150 deploy
1如何使用所有选项从脚本内部运行该功能? 2 IP地址是一个称为bakery_internalip的变量。作为生产线的一部分,如何调用该变量?

尝试使用子流程:

import subprocess
subprocess.call(['fab', '-f', 'fabfile.py', '-u ec2-user', '-i', 'id_rsa', '-H', bakery_internalip, 'deploy'])

应该这样做

您可以直接从代码调用启用结构的命令。通常,您必须首先设置env字典以指定键和主机,但这非常简单:

# the settings for the env dict
from fabric.api import env, execute
env.hosts = ["10.10.15.150", ]
env.user = "ec2-user"
env.key = "id_rsa"

# and call the function itself
from fabfile import deplot
execute(deploy, hosts=env.hosts)
您可以在fabric文档中找到更多灵感:

谢谢。这似乎在很大程度上是可行的。我现在遇到的唯一问题是,我得到了这个错误:致命错误:Fabfile没有包含任何命令!我不明白这是怎么回事,因为fabbile肯定包含命令,并且可以从命令行正常工作。该文件也位于运行脚本的同一目录中。我还尝试指定脚本的完整路径。听起来可能是将Python脚本解释为bash脚本,而没有找到任何命令。在顶部有一个shebang吗?Python脚本肯定有一个shebang,并且解释正确。出于某种原因,它表示在my fabfile.py中找不到任何命令