From f06ec76fdb358612d95b9b8249bebc8b58c86965 Mon Sep 17 00:00:00 2001 From: Christopher Johnston Date: Wed, 28 Mar 2012 14:05:31 -0700 Subject: [PATCH 1/5] add support for using an alternate remote port --- bin/ansible | 10 +++++++--- lib/ansible/connection.py | 3 ++- lib/ansible/constants.py | 3 +-- lib/ansible/playbook.py | 6 ++++-- lib/ansible/runner.py | 5 +++-- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/bin/ansible b/bin/ansible index 41149ae80e..a2867c2c1d 100755 --- a/bin/ansible +++ b/bin/ansible @@ -73,6 +73,8 @@ class Cli(object): dest='timeout', help="set the SSH timeout in seconds") parser.add_option('-u', '--user', default=C.DEFAULT_REMOTE_USER, dest='remote_user', help='connect as this user') + parser.add_option('-p', '--port', default=C.DEFAULT_REMOTE_PORT, type='int', + dest='remote_port', help='set the remote ssh port') options, args = parser.parse_args() self.callbacks.options = options @@ -101,8 +103,9 @@ class Cli(object): module_name=options.module_name, module_path=options.module_path, module_args=shlex.split(options.module_args), remote_user=options.remote_user, remote_pass=sshpass, - host_list=options.inventory, timeout=options.timeout, - forks=options.forks, background=options.seconds, pattern=pattern, + host_list=options.inventory, timeout=options.timeout, + remote_port=options.remote_port, forks=options.forks, + background=options.seconds, pattern=pattern, callbacks=self.callbacks, verbose=True, ) return (runner, runner.run()) @@ -116,7 +119,8 @@ class Cli(object): module_args=[ "jid=%s" % jid ], remote_user=old_runner.remote_user, remote_pass=old_runner.remote_pass, host_list=hosts, timeout=old_runner.timeout, forks=old_runner.forks, - pattern='*', callbacks=self.silent_callbacks, verbose=True, + remote_port=old_runner.remote_port, pattern='*', + callbacks=self.silent_callbacks, verbose=True, ) # ---------------------------------------------- diff --git a/lib/ansible/connection.py b/lib/ansible/connection.py index a142dea556..2a9ec09849 100755 --- a/lib/ansible/connection.py +++ b/lib/ansible/connection.py @@ -65,7 +65,8 @@ class ParamikoConnection(object): allow_agent=True, look_for_keys=True, password=self.runner.remote_pass, - timeout=self.runner.timeout + timeout=self.runner.timeout, + port=self.runner.remote_port ) except Exception, e: raise errors.AnsibleConnectionFailed(str(e)) diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py index fa0e1a511e..7215f23b37 100644 --- a/lib/ansible/constants.py +++ b/lib/ansible/constants.py @@ -32,5 +32,4 @@ DEFAULT_TIMEOUT = 10 DEFAULT_POLL_INTERVAL = 15 DEFAULT_REMOTE_USER = 'root' DEFAULT_REMOTE_PASS = None - - +DEFAULT_REMOTE_PORT = 22 diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 7262aa57e2..0e6599d74d 100755 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -54,6 +54,7 @@ class PlayBook(object): timeout = C.DEFAULT_TIMEOUT, remote_user = C.DEFAULT_REMOTE_USER, remote_pass = C.DEFAULT_REMOTE_PASS, + remote_port = C.DEFAULT_REMOTE_PORT, override_hosts = None, verbose = False, callbacks = None, @@ -69,6 +70,7 @@ class PlayBook(object): self.timeout = timeout self.remote_user = remote_user self.remote_pass = remote_pass + self.remote_port = remote_port self.verbose = verbose self.callbacks = callbacks self.runner_callbacks = runner_callbacks @@ -262,7 +264,7 @@ class PlayBook(object): pattern=pattern, groups=self.groups, module_name=module, module_args=args, host_list=hosts, forks=self.forks, remote_pass=self.remote_pass, module_path=self.module_path, - timeout=self.timeout, remote_user=remote_user, + timeout=self.timeout, remote_user=remote_user, remote_port=self.remote_port, setup_cache=SETUP_CACHE, basedir=self.basedir, conditional=only_if, callbacks=self.runner_callbacks, ) @@ -426,7 +428,7 @@ class PlayBook(object): pattern=pattern, groups=self.groups, module_name='setup', module_args=push_var_str, host_list=host_list, forks=self.forks, module_path=self.module_path, - timeout=self.timeout, remote_user=user, + timeout=self.timeout, remote_user=user, remote_port=self.remote_port, remote_pass=self.remote_pass, setup_cache=SETUP_CACHE, callbacks=self.runner_callbacks, ).run() diff --git a/lib/ansible/runner.py b/lib/ansible/runner.py index d50fe402c4..b8e57f2e93 100755 --- a/lib/ansible/runner.py +++ b/lib/ansible/runner.py @@ -60,8 +60,8 @@ class Runner(object): module_name=C.DEFAULT_MODULE_NAME, module_args=C.DEFAULT_MODULE_ARGS, forks=C.DEFAULT_FORKS, timeout=C.DEFAULT_TIMEOUT, pattern=C.DEFAULT_PATTERN, remote_user=C.DEFAULT_REMOTE_USER, remote_pass=C.DEFAULT_REMOTE_PASS, - background=0, basedir=None, setup_cache=None, transport='paramiko', - conditional='True', groups={}, callbacks=None, verbose=False): + remote_port=C.DEFAULT_REMOTE_PORT, background=0, basedir=None, setup_cache=None, + transport='paramiko', conditional='True', groups={}, callbacks=None, verbose=False): if setup_cache is None: setup_cache = {} @@ -92,6 +92,7 @@ class Runner(object): self.verbose = verbose self.remote_user = remote_user self.remote_pass = remote_pass + self.remote_port = remote_port self.background = background self.basedir = basedir From 15e781eb5100a3b595227f2a5ec58a581b884cc7 Mon Sep 17 00:00:00 2001 From: Christopher Johnston Date: Wed, 28 Mar 2012 14:09:11 -0700 Subject: [PATCH 2/5] add exception check for paramiko if older then 1.7 --- lib/ansible/connection.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ansible/connection.py b/lib/ansible/connection.py index 2a9ec09849..f2866cd538 100755 --- a/lib/ansible/connection.py +++ b/lib/ansible/connection.py @@ -69,7 +69,10 @@ class ParamikoConnection(object): port=self.runner.remote_port ) except Exception, e: - raise errors.AnsibleConnectionFailed(str(e)) + if str(e).find("PID check failed") != -1: + raise errors.AnsibleError("paramiko version issue, please upgrade paramiko on the overlord") + else: + raise errors.AnsibleConnectionFailed(str(e)) return self def exec_command(self, cmd): From 9041ad4d830692677712323475d086e8563481ba Mon Sep 17 00:00:00 2001 From: Christopher Johnston Date: Wed, 28 Mar 2012 14:17:20 -0700 Subject: [PATCH 3/5] just some minor clean up single vs double in getopt parsing --- bin/ansible | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/bin/ansible b/bin/ansible index a2867c2c1d..ca5a8c7ce3 100755 --- a/bin/ansible +++ b/bin/ansible @@ -49,28 +49,28 @@ class Cli(object): ''' create an options parser for bin/ansible ''' parser = OptionParser(usage = 'ansible [options]') - parser.add_option("-a", "--args", dest="module_args", + parser.add_option('-a', '--args', dest='module_args', help="module arguments", default=C.DEFAULT_MODULE_ARGS) - parser.add_option("-B", "--background", dest="seconds", type='int', default=0, - help="run asynchronously, failing after X seconds") + parser.add_option('-B', '--background', dest='seconds', type='int', default=0, + help='run asynchronously, failing after X seconds') parser.add_option('-f','--forks', dest='forks', default=C.DEFAULT_FORKS, type='int', help='number of parallel processes to use') - parser.add_option("-i", "--inventory-file", dest="inventory", - help="inventory host file", default=C.DEFAULT_HOST_LIST) - parser.add_option("-k", "--ask-pass", default=False, action="store_true", - help="ask for SSH password") - parser.add_option("-M", "--module-path", dest="module_path", + parser.add_option('-i', '--inventory-file', dest='inventory', + help='inventory host file', default=C.DEFAULT_HOST_LIST) + parser.add_option('-k', '--ask-pass', default=False, action='store_true', + help='ask for SSH password') + parser.add_option('-M', '--module-path', dest='module_path', help="path to module library", default=C.DEFAULT_MODULE_PATH) - parser.add_option("-m", "--module-name", dest="module_name", + parser.add_option('-m', '--module-name', dest='module_name', help="module name to execute", default=C.DEFAULT_MODULE_NAME) parser.add_option('-o', '--one-line', dest='one_line', action='store_true', - help="condense output") + help='condense output') parser.add_option('-P', '--poll', default=C.DEFAULT_POLL_INTERVAL, type='int', - dest='poll_interval', help="set the poll interval if using -B") + dest='poll_interval', help='set the poll interval if using -B') parser.add_option('-t', '--tree', dest='tree', default=None, - help="log output to this directory") + help='log output to this directory') parser.add_option('-T', '--timeout', default=C.DEFAULT_TIMEOUT, type='int', - dest='timeout', help="set the SSH timeout in seconds") + dest='timeout', help='set the SSH timeout in seconds') parser.add_option('-u', '--user', default=C.DEFAULT_REMOTE_USER, dest='remote_user', help='connect as this user') parser.add_option('-p', '--port', default=C.DEFAULT_REMOTE_PORT, type='int', From 68818ad1febeabcb1f90fe572a868bc25d232b4d Mon Sep 17 00:00:00 2001 From: Christopher Johnston Date: Wed, 28 Mar 2012 15:02:50 -0700 Subject: [PATCH 4/5] add support for remote ports in playbooks --- lib/ansible/playbook.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 0e6599d74d..5ff4def2ed 100755 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -254,8 +254,8 @@ class PlayBook(object): # ***************************************************** - def _run_module(self, pattern, host_list, module, args, remote_user, - async_seconds, async_poll_interval, only_if): + def _run_module(self, pattern, host_list, module, args, remote_user, + remote_port, async_seconds, async_poll_interval, only_if): ''' run a particular module step in a playbook ''' hosts = [ h for h in host_list if (h not in self.stats.failures) and (h not in self.stats.dark)] @@ -264,7 +264,7 @@ class PlayBook(object): pattern=pattern, groups=self.groups, module_name=module, module_args=args, host_list=hosts, forks=self.forks, remote_pass=self.remote_pass, module_path=self.module_path, - timeout=self.timeout, remote_user=remote_user, remote_port=self.remote_port, + timeout=self.timeout, remote_user=remote_user, remote_port=remote_port, setup_cache=SETUP_CACHE, basedir=self.basedir, conditional=only_if, callbacks=self.runner_callbacks, ) @@ -277,7 +277,7 @@ class PlayBook(object): # ***************************************************** def _run_task(self, pattern=None, host_list=None, task=None, - remote_user=None, handlers=None, conditional=False): + remote_user=None, remote_port=None, handlers=None, conditional=False): ''' run a single task in the playbook and recursively run any subtasks. ''' # load the module name and parameters from the task entry @@ -305,8 +305,7 @@ class PlayBook(object): # load up an appropriate ansible runner to # run the task in parallel results = self._run_module(pattern, host_list, module_name, - module_args, remote_user, - async_seconds, async_poll_interval, only_if) + module_args, remote_user, remote_port, async_seconds, async_poll_interval, only_if) self.stats.compute(results) @@ -401,7 +400,7 @@ class PlayBook(object): # ***************************************************** - def _do_setup_step(self, pattern, vars, user, vars_files=None): + def _do_setup_step(self, pattern, vars, user, port, vars_files=None): ''' push variables down to the systems and get variables+facts back up ''' # this enables conditional includes like $facter_os.yml and is only done @@ -428,7 +427,7 @@ class PlayBook(object): pattern=pattern, groups=self.groups, module_name='setup', module_args=push_var_str, host_list=host_list, forks=self.forks, module_path=self.module_path, - timeout=self.timeout, remote_user=user, remote_port=self.remote_port, + timeout=self.timeout, remote_user=user, remote_port=port, remote_pass=self.remote_pass, setup_cache=SETUP_CACHE, callbacks=self.runner_callbacks, ).run() @@ -461,15 +460,16 @@ class PlayBook(object): tasks = pg.get('tasks', []) handlers = pg.get('handlers', []) user = pg.get('user', C.DEFAULT_REMOTE_USER) + port = pg.get('port', C.DEFAULT_REMOTE_PORT) self.callbacks.on_play_start(pattern) # push any variables down to the system # and get facts/ohai/other data back up - self._do_setup_step(pattern, vars, user, None) + self._do_setup_step(pattern, vars, user, port, None) # now with that data, handle contentional variable file imports! if len(vars_files) > 0: - self._do_setup_step(pattern, vars, user, vars_files) + self._do_setup_step(pattern, vars, user, port, vars_files) # run all the top level tasks, these get run on every node for task in tasks: @@ -478,7 +478,8 @@ class PlayBook(object): host_list=self.host_list, task=task, handlers=handlers, - remote_user=user + remote_user=user, + remote_port=port ) # handlers only run on certain nodes, they are flagged by _flag_handlers @@ -496,7 +497,8 @@ class PlayBook(object): handlers=[], host_list=triggered_by, conditional=True, - remote_user=user + remote_user=user, + remote_port=port ) # end of execution for this particular pattern. Multiple patterns From 509c330f53f012f67f19e79b8702bb2af1e15b21 Mon Sep 17 00:00:00 2001 From: Christopher Johnston Date: Wed, 28 Mar 2012 16:06:26 -0700 Subject: [PATCH 5/5] add support for running and started - both will do the same thing --- library/service | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/service b/library/service index d45da40867..f0e5da101b 100755 --- a/library/service +++ b/library/service @@ -44,7 +44,8 @@ for x in items: name = params['name'] state = params.get('state','unknown') -if state not in [ 'running', 'stopped', 'restarted' ]: +# running and started are the same +if state not in [ 'running', 'started', 'stopped', 'restarted' ]: print "failed=True msg='invalid state'" sys.exit(1) @@ -82,10 +83,9 @@ def _run(cmd): stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - rc = 0 if changed: - if state == 'started': + if state in ('started', 'running'): rc = _run("/sbin/service %s start" % name) elif state == 'stopped': rc = _run("/sbin/service %s stop" % name)