From 66736730422b4b3b8f585ecd58cdec5a6833c912 Mon Sep 17 00:00:00 2001 From: Peter Sprygada Date: Tue, 24 Jan 2017 23:14:30 -0500 Subject: [PATCH] more logging and exception handling in ansible-connection (#20619) adds more logging to handle display being called from plugins. Also rearranges some of the exception handling to better catch exceptions and log to local syslog --- bin/ansible-connection | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/bin/ansible-connection b/bin/ansible-connection index 0d5197313dc..d15962e3e16 100755 --- a/bin/ansible-connection +++ b/bin/ansible-connection @@ -49,6 +49,8 @@ from ansible.module_utils.six.moves import cPickle, StringIO from ansible.playbook.play_context import PlayContext from ansible.plugins import connection_loader from ansible.utils.path import unfrackpath, makedirs_safe +from ansible.errors import AnsibleConnectionFailure +from ansible.utils.display import Display def do_fork(): @@ -101,9 +103,9 @@ def recv_data(s): data += d return data -def log(msg, host=None): +def log(msg, host=None, **kwargs): if host: - msg = '[%s] %s' % (host, msg) + msg = '<%s> %s' % (host, msg) facility = getattr(syslog, C.DEFAULT_SYSLOG_FACILITY, syslog.LOG_USER) syslog.openlog('ansible-connection', 0, facility) syslog.syslog(syslog.LOG_INFO, str(msg)) @@ -117,17 +119,14 @@ class Server(): self._start_time = datetime.datetime.now() - try: - self.log('loading connection plugin %s' % str(play_context.connection)) - self.conn = connection_loader.get(play_context.connection, play_context, sys.stdin) - self.conn._connect() + self.conn = connection_loader.get(play_context.connection, play_context, sys.stdin) + rc, out, err = self.conn._connect() + if rc != 0: + raise AnsibleConnectionFailure(err) - self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.socket.bind(path) - self.socket.listen(1) - except Exception as exc: - self.log(traceback.format_exc()) - raise + self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.socket.bind(path) + self.socket.listen(1) signal.signal(signal.SIGALRM, self.alarm_handler) @@ -137,7 +136,7 @@ class Server(): return meth(*args, **kwargs) def log(self, msg): - log(msg, self.play_context.remote_addr) + log(msg, host=self.play_context.remote_addr) def alarm_handler(self, signum, frame): ''' @@ -259,6 +258,8 @@ def main(): print(traceback.format_exc()) sys.exit(1) + display.verbosity = pc.verbosity + # here we create a hash to use later when creating the socket file, # so we can hide the info about the target host/user/etc. m = hashlib.sha256() @@ -280,7 +281,12 @@ def main(): if not os.path.exists(sf_path): pid = do_fork() if pid == 0: - server = Server(sf_path, pc) + try: + server = Server(sf_path, pc) + except AnsibleConnectionFailure as exc: + log(str(exc), pc.remote_addr) + except Exception as exc: + log(traceback.format_exc(), pc.remote_addr) fcntl.lockf(lock_fd, fcntl.LOCK_UN) os.close(lock_fd) server.run() @@ -334,4 +340,6 @@ def main(): sys.exit(rc) if __name__ == '__main__': + display = Display() + display.display = log main()