0

我有一个用于操作自动化的单个文件脚本(日志文件下载,停止/启动多个容器。用户通过命令参数选择要做什么)并且希望在同一个脚本中具有结构函数以及参数解析类和可能的其他一些. 如何从同一个 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 使用指定的命令行参数全局设置变量(只是为了阐明该部分的作用)。可悲的是,这会导致没有定义主机的失败(env.hosts 应该在函数内部包含它......或者在那里声明它们为时已晚?)

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

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

它有点工作。不过,我有点希望,我将能够使用结构模块(通过装饰器)原样并行化整个过程,而无需将整个过程包装在线程代码中。

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')

它打印正确,但“运行”命令仍然失败,并显示:

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

2 回答 2

1

使用执行命令:

from fabric.api import execute

execute(argParser().argParse())
execute(fabricFuncs().ihsstate())
于 2013-09-03T13:20:45.357 回答
0

如果您在没有 fab 命令的情况下运行脚本,则 env.host 将设置为无。
所以如果你想使用'execute',你还必须传递'hosts'参数。

尝试这个:

from fabric.api import execute, run
if __name__ == "__main__":
   hosts = ["host1", "host2"]
   execute(run('sudo /home/user/XXX.sh state'), hosts=hosts)
于 2016-06-15T14:56:45.563 回答