mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
bda08c8a1b
This ensures we don't litter remote systems with temporary directories that don't get cleaned up, as well as speeds things up from not having to touch every node.
74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
# Copyright 2012, Jeroen Hoekx <jeroen@hoekx.be>
|
|
#
|
|
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
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, check_conditional
|
|
|
|
class ActionModule(object):
|
|
''' Create inventory groups based on variables '''
|
|
|
|
### We need to be able to modify the inventory
|
|
BYPASS_HOST_LOOP = True
|
|
NEEDS_TMPPATH = False
|
|
|
|
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 'key' in args:
|
|
raise ae("'key' is a required argument.")
|
|
|
|
vv("created 'group_by' ActionModule: key=%s"%(args['key']))
|
|
|
|
inventory = self.runner.inventory
|
|
|
|
result = {'changed': False}
|
|
|
|
### find all groups
|
|
groups = {}
|
|
for host in self.runner.host_set:
|
|
data = inject['hostvars'][host]
|
|
if not check_conditional(template(self.runner.basedir, self.runner.conditional, data)):
|
|
continue
|
|
group_name = template(self.runner.basedir, args['key'], data)
|
|
group_name = group_name.replace(' ','-')
|
|
if group_name not in groups:
|
|
groups[group_name] = []
|
|
groups[group_name].append(host)
|
|
|
|
result['groups'] = groups
|
|
|
|
### add to inventory
|
|
for group, hosts in groups.items():
|
|
inv_group = inventory.get_group(group)
|
|
if not inv_group:
|
|
inv_group = ansible.inventory.Group(name=group)
|
|
inventory.add_group(inv_group)
|
|
for host in hosts:
|
|
inv_host = inventory.get_host(host)
|
|
if not inv_host:
|
|
inv_host = ansible.inventory.Host(name=host)
|
|
if inv_group not in inv_host.get_groups():
|
|
result['changed'] = True
|
|
inv_group.add_host(inv_host)
|
|
|
|
return ReturnData(conn=conn, comm_ok=True, result=result)
|