#!/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( host=dict(default='127.0.0.1'), timeout=dict(default=300), delay=dict(default=0), port=dict(required=True), state=dict(default='started', choices=['started', 'stopped']), ), ) params = module.params host = params['host'] timeout = int(params['timeout']) delay = int(params['delay']) port = int(params['port']) state = params['state'] if delay: time.sleep(delay) if state is 'stopped': ### first wait for the host to go down end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) while datetime.datetime.now() < end: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) try: s.connect( (host, port) ) s.close() time.sleep(1) except: break else: module.fail_json(msg="Timeout when waiting for %s to stop."%(host)) if state is 'started': ### wait for the host to come up 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(state=state, port=port) # this is magic, see lib/ansible/module_common.py #<> main()