Não sei ao certo como você lida com erros no seu módulo, mas, de qualquer forma, gostaria de lançar alguma luz sobre isso.
Existe um dicionário damo __context__
. Quando você executa um módulo de execução, o dicionário __context__
persiste em todas as execuções do módulo até que os módulos sejam atualizados. Módulos de estado se comporta de maneira semelhante. O dicionário pode ter uma chave 'retcode'
que parece referir-se ao código de retorno que o servo / cliente de sal deve retornar e que você está perdendo.
Eu posso ver isso usado em alguns módulos de execução. Um exemplo do módulo nspawn :
def _make_container_root(name):
'''
Make the container root directory
'''
path = _root(name)
if os.path.exists(path):
__context__['retcode'] = salt.defaults.exitcodes.SALT_BUILD_FAIL
raise CommandExecutionError(
'Container {0} already exists'.format(name)
)
else:
try:
os.makedirs(path)
return path
except OSError as exc:
raise CommandExecutionError(
'Unable to make container root directory {0}: {1}'
.format(name, exc)
Agora, as coisas ruins. Eu testei no antigo SaltStack 2015.8.12 e de alguma forma funciona, mas sem usar exceção:
def testfailure():
__context__['retcode'] = 1
A execução do módulo retorna um código de erro maior que 0
:
salt my_minion mymodule.testfailure; echo $?
my_minion:
None
ERROR: Minions returned with non-zero exit code
11
Quando você gera uma exceção, ele pára de funcionar e sempre retorna 0
.
# mymodule.py
from salt.exceptions import CommandExecutionError
def testfailure():
__context__['retcode'] = 1
raise CommandExecutionError('fail')
A execução do módulo retorna um código de erro igual a 0
, embora não deva:
salt my_minion mymodule.testfailure; echo $?
my_minion:
ERROR: fail!
0
Eu também testei na última versão disponível 2016.11.3 e o comportamento é o mesmo. IMO, isso é um bug. Eu relatei aqui .