From e147ad42137b428b3d82cfd4d4b58ae890fb14e0 Mon Sep 17 00:00:00 2001 From: Seth Vidal Date: Tue, 30 Oct 2012 17:36:33 -0400 Subject: [PATCH] add add_host action plugin - add hosts to inventory during a playbook run - lets act on those hosts in the next play --- lib/ansible/runner/action_plugins/add_host.py | 70 +++++++++++++++++++ library/add_host | 23 ++++++ 2 files changed, 93 insertions(+) create mode 100644 lib/ansible/runner/action_plugins/add_host.py create mode 100644 library/add_host diff --git a/lib/ansible/runner/action_plugins/add_host.py b/lib/ansible/runner/action_plugins/add_host.py new file mode 100644 index 00000000000..2dcb85c2404 --- /dev/null +++ b/lib/ansible/runner/action_plugins/add_host.py @@ -0,0 +1,70 @@ +# Copyright 2012, Seth Vidal +# +# 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 ansible + +from ansible.callbacks import vv +from ansible.errors import AnsibleError as ae +from ansible.runner.return_data import ReturnData +from ansible.utils import parse_kv, template +from ansible.inventory.host import Host +from ansible.inventory.group import Group + +class ActionModule(object): + ''' Create inventory hosts and groups in the memory inventory''' + + ### We need to be able to modify the inventory + BYPASS_HOST_LOOP = True + + def __init__(self, runner): + self.runner = runner + + def run(self, conn, tmp, module_name, module_args, inject): + args = parse_kv(self.runner.module_args) + if not 'hostname' in args: + raise ae("'hostname' is a required argument.") + + vv("created 'add_host' ActionModule: hostname=%s"%(args['hostname'])) + + + result = {'changed': True} + + new_host = Host(args['hostname']) + inventory = self.runner.inventory + + # add the new host to the 'all' group + allgroup = inventory.get_group('all') + allgroup.add_host(new_host) + result['changed'] = True + + # add it to the group if that was specified + if 'groupname' in args: + if not inventory.get_group(args['groupname']): + new_group = Group(args['groupname']) + inventory.add_group(new_group) + + ngobj = inventory.get_group(args['groupname']) + ngobj.add_host(new_host) + vv("created 'add_host' ActionModule: groupname=%s"%(args['groupname'])) + result['new_group'] = args['groupname'] + + result['new_host'] = args['hostname'] + + return ReturnData(conn=conn, comm_ok=True, result=result) + + + diff --git a/library/add_host b/library/add_host new file mode 100644 index 00000000000..fe9780e9219 --- /dev/null +++ b/library/add_host @@ -0,0 +1,23 @@ +# -*- mode: python -*- + +DOCUMENTATION = ''' +--- +module: add_host +short_description: add a host (and alternatively a group) to the ansible-playbook in-memory inventory +description: + - Use variables to create new hosts and groups in inventory for use in later plays of the same playbook +version_added: 0.9 +options: + hostname: + description: + - The hostname/ip of the host to add to the inventory + required: true + groupname: + description: + - The groupname to add the hostname to. + required: false +author: Seth Vidal +examples: + - description: add host to group 'just_created' + code: add_host hostname=${ip_from_ec2create} groupname=just_created +''' \ No newline at end of file