【问题标题】:Call python Fabric functions from within the same script从同一脚本中调用 python Fabric 函数
【发布时间】:2016-06-15 22:56:45
【问题描述】:

我有一个用于操作自动化的单文件脚本(日志文件下载、停止/启动多个容器。用户通过命令参数选择要做什么)并且希望在同一个脚本中具有结构函数以及参数解析类和可能是其他一些。如何从同一个 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 应该在函数内部包含它......或者在那里声明它们为时已晚?)

编辑1: 我已经尝试使用这个来启动结构功能:

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

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

编辑2: 我也试过这个:

  execute(fabricFuncs().ihsstate())

失败的原因是:

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

我可以将整个 env.hosts 变量放入上面的“设置”中,而无需使用“for”语句迭代该列表吗?

编辑3: 我曾尝试像这样编辑 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)

【问题讨论】:

    标签: python fabric


    【解决方案1】:

    使用execute 命令:

    from fabric.api import execute
    
    execute(argParser().argParse())
    execute(fabricFuncs().ihsstate())
    

    【讨论】:

    • 感谢您的回答,但它仍然以这个结尾:致命错误:需要提示输入目标主机连接字符串(主机:无)。 arParser().argParse() 是一个非结构函数,所以我保持原样并将执行添加到 ihsstate() 函数。我想它需要使用一些“设置”参数来“执行”结构函数。
    • @panta:是的,您需要定义 env.hosts。你可以先执行一个定义这个的结构函数,然后调用你的脚本。
    • 再次感谢您的回复,非常感谢。我也试过这个但没有成功。 env.hosts 设置正确(如果我在结构函数的“运行”部分之前添加 print env.hosts,它会正确打印出来),但整个操作仍然失败,并显示“需要提示目标主机连接字符串(主持人:无)”。我将编辑问题以进一步描述 fab 函数内部发生的事情。
    • 我也尝试过使用 roledefs。像这样设置 var: env.roledefs = { 'current' : hosts } 并在函数之前添加一个装饰器 @roles('current') 。但同样的行为发生了。
    【解决方案2】:

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

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多