From 8660fb074a82e816d8cecbd4e702e01fd8558f4c Mon Sep 17 00:00:00 2001 From: Jeroen Hoekx Date: Thu, 23 Aug 2012 19:41:26 +0200 Subject: [PATCH] Add the wait_for module. This module waits until a specific port on a given host can be connected to. --- library/wait_for | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 library/wait_for diff --git a/library/wait_for b/library/wait_for new file mode 100644 index 00000000000..201063d6a02 --- /dev/null +++ b/library/wait_for @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# (c) 2012, Jeroen Hoekx +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +import socket +import datetime +import time +import sys + +def main(): + + module = AnsibleModule( + argument_spec = dict( + name=dict(required=True), + timeout=dict(default=300), + port=dict(default=22), + ), + ) + + params = module.params + + host = params['name'] + timeout = int(params['timeout']) + port = int(params['port']) + + end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) + + while datetime.datetime.now() < end: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect( (host, port) ) + s.close() + break + except: + time.sleep(1) + else: + module.fail_json(msg="Timeout when waiting for %s"%(host)) + + module.exit_json(msg="%s responds on %s"%(host, port)) + +# this is magic, see lib/ansible/module_common.py +#<> +main()