带 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_ensure
和 dir_exists
中将 .exec
更改为 .run
并设置 env.host_string
我能够得到 return 远程命令代码,但问题是我只能通过一台主机 这不是想要的结果 .
如何使用方法 dir_exists
中的 .exec
或更好的方法 获取 return 代码?
小心,fabric
的 execute
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 从 fabric
的 run
函数输出,但您这样做:return run(command,pty=False)
。否则你会在字典中找到 None
。
希望对您有所帮助。
我有一个使用 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_ensure
和 dir_exists
中将 .exec
更改为 .run
并设置 env.host_string
我能够得到 return 远程命令代码,但问题是我只能通过一台主机 这不是想要的结果 .
如何使用方法 dir_exists
中的 .exec
或更好的方法 获取 return 代码?
小心,fabric
的 execute
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 从 fabric
的 run
函数输出,但您这样做:return run(command,pty=False)
。否则你会在字典中找到 None
。
希望对您有所帮助。