从同一个脚本中调用python Fabric函数

时间:2013-09-03 12:02:32

标签: python fabric

我有一个文件脚本用于操作自动化(日志文件下载,停止/启动几个容器。用户通过命令参数选择要做的事情)并希望在同一个脚本中使用结构函数以及参数解析类和可能还有其他的。如何在同一个python脚本中调用结构函数?我不想使用" fab"原样。

作为旁注,我也希望将这些调用并行。

这是一个理想情况下包含所有必要结构功能的模型类:

class fabricFuncs:
  def appstate(self):
    env.hosts = hosts
    run('sudo /home/user/XXX.sh state')

这是发射器部分:

if __name__ == "__main__":
  argParser().argParse()
  fabricFuncs().ihsstate()

argParser使用指定的命令行参数设置变量globaly(只是为了阐明该部分的作用)。 遗憾的是,在没有定义主机的情况下导致失败(env.hosts应该包含在函数内部......或者在那里声明它们为时已晚?)

EDIT1: 我尝试使用以下方法启动结构功能:

for h in env.hosts:
  with settings(hosts_string=user + "@" + h):
    fabricFuncs().ihsstate()

它有点工作。我有点希望,我能够使用Fabric模块(通过装饰器)对整个过程进行并行化,而不会在整个线程代码中包含整个过程。

EDIT2: 我也试过这个:

  execute(fabricFuncs().ihsstate())

哪个失败了:

Fatal error: Needed to prompt for the target host connection string (host: None)

我可以将整个env.hosts变量放入"设置"上面没有使用" for"迭代该列表声明?

EDIT3: 我已经尝试过像这样编辑fab函数来查看是否正确设置了env.hosts:

class fabricFuncs:
  def appstate(self):
    env.hosts = hosts
    print env.hosts
    run('sudo /home/user/XXX.sh state')

它打印得正确,但仍然是#34;运行"命令失败:

Fatal error: Needed to prompt for the target host connection string (host: None)

2 个答案:

答案 0 :(得分:1)

使用execute命令:

from fabric.api import execute

execute(argParser().argParse())
execute(fabricFuncs().ihsstate())

答案 1 :(得分:0)

如果在没有fab命令的情况下运行脚本,env.host将设置为None 所以,如果你想使用'执行'你也必须通过主持人'参数。

试试这个:

from fabric.api import execute, run
if __name__ == "__main__":
   hosts = ["host1", "host2"]
   execute(run('sudo /home/user/XXX.sh state'), hosts=hosts)