带 fabric.tasks.execute 的面料返回码

Fabric returnCode with fabric.tasks.execute

我有一个使用 Fabric api 的 python 脚本。问题是我无法获取在远程服务器上启动的命令的 return 代码。

我知道我可以使用 .return_code 获得 return 代码,如果我使用 运行 local 命令但不能使用多个远程主机使用 fabric.tasks.execute 例如:execute(self.run,command=task,hosts=self.HOSTS)

下面是 class 代码的摘录:

def execs(self,task):
        with settings(warn_only=True):
            if (self.getMode() is "local"):
                return self.run(task)
            else:
                return execute(self.run,command=task,hosts=self.HOSTS)


def run(self,command):
        with settings(warn_only=True):
            if (self.getMode() is "local"):
                return local(command,True)
            if self.isSudo():
                return sudo(command,pty=False)
            return run(command,pty=False)

def dir_exists(self,directory):
        '''Check if directory exists'''
        if ((self.execs("test -d %s" % (directory))).return_code == 0):
            return True
        else:
            warn("Directory doesnot exists")
            return False

def dir_ensure(self,destination = None , user =None,group = None, permissions =None,recursive= False):
        '''Ensures a directory is created'''
        if (destination is None):
            warn("Destination of directory must be specified")
            return False
        if (self.dir_exists(destination)):
            warn("Destination folder already exists; Just setting permissions")
            self.dir_setAttr(destination,user,group,permissions,recursive)
        else:
            self.execs("mkdir -p %s" % (destination))
            self.dir_setAttr(destination,user,group,permissions,recursive)

当我运行代码:

myCooker.dir_ensure("/tmp/tototoot",user="k.sewnundun",group="k.sewnundun",permissions="777",recursive=True)

我收到以下错误:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    myCooker.dir_ensure("/tmp/tototoot",user="k.sewnundun",group="k.sewnundun",permissions="777",recursive=True)
  File "build/bdist.linux-i686/egg/cooker.py", line 234, in dir_ensure
  File "build/bdist.linux-i686/egg/cooker.py", line 210, in dir_exists
AttributeError: 'dict' object has no attribute 'return_code'

但是如果我在方法 dir_ensuredir_exists 中将 .exec 更改为 .run 并设置 env.host_string 我能够得到 return 远程命令代码,但问题是我只能通过一台主机 这不是想要的结果 .

如何使用方法 dir_exists 中的 .exec 或更好的方法 获取 return 代码?

小心,fabricexecute returns dict!

来自文档:

Returns:一个字典,将主机字符串映射到给定任务的 return 主机执行值 运行。例如,execute(foo, hosts=['a', 'b']) 可能 return {'a': None, 'b': 'bar'} if foo return 在主机 a 上什么也没编辑,但在主机 b 上 return 编辑了 'bar'。

因此,您会在 result_dict[host].return_code.

中找到错误代码

您还必须 return 从 fabricrun 函数输出,但您这样做:return run(command,pty=False)。否则你会在字典中找到 None

希望对您有所帮助。