#!/usr/bin/env python # -*- coding: utf-8 -*- # (c) 2012, Stephen Fromm <sfromm@gmail.com> # # 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/>. DOCUMENTATION = ''' --- module: group author: Stephen Fromm version_added: 0.0.2 short_description: Add or remove groups requirements: [ groupadd, groupdel, groupmod ] description: - Manage presence of groups on a host. options: name: required: true description: - Name of the group to manage. gid: required: false description: - Optional I(GID) to set for the group. state: required: false default: "present" choices: [ present, absent ] description: - Whether the group should be present or not on the remote host. system: required: false default: "no" choices: [ yes, no ] description: - If I(yes), indicates that the group created is a system group. examples: - code: group name=somegroup state=present description: Example group command from Ansible Playbooks ''' import grp def group_del(module, group): cmd = [module.get_bin_path('groupdel', True), group] p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate() rc = p.returncode return (rc, out, err) def group_add(module, group, **kwargs): cmd = [module.get_bin_path('groupadd', True)] for key in kwargs: if key == 'gid' and kwargs[key] is not None: cmd.append('-g') cmd.append(kwargs[key]) elif key == 'system' and kwargs[key] == 'yes': cmd.append('-r') cmd.append(group) p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate() rc = p.returncode return (rc, out, err) def group_mod(module, group, **kwargs): cmd = [module.get_bin_path('groupmod', True)] info = group_info(group) for key in kwargs: if key == 'gid': if kwargs[key] is not None and info[2] != int(kwargs[key]): cmd.append('-g') cmd.append(kwargs[key]) if len(cmd) == 1: return (None, '', '') cmd.append(group) p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate() rc = p.returncode return (rc, out, err) def group_exists(group): try: if grp.getgrnam(group): return True except KeyError: return False def group_info(group): if not group_exists(group): return False try: info = list(grp.getgrnam(group)) except KeyError: return False return info # =========================================== def main(): module = AnsibleModule( argument_spec = dict( state=dict(default='present', choices=['present', 'absent']), name=dict(required=True), gid=dict(default=None), system=dict(default='no', choices=['yes', 'no']), ) ) state = module.params['state'] name = module.params['name'] gid = module.params['gid'] system = module.params['system'] rc = None out = '' err = '' result = {} result['name'] = name result['state'] = state if state == 'absent': if group_exists(name): (rc, out, err) = group_del(module, name) if rc != 0: module.fail_json(name=name, msg=err) elif state == 'present': if not group_exists(name): (rc, out, err) = group_add(module, name, gid=gid, system=system) else: (rc, out, err) = group_mod(module, name, gid=gid) if rc is not None and rc != 0: module.fail_json(name=name, msg=err) if rc is None: result['changed'] = False else: result['changed'] = True if out: result['stdout'] = out if err: result['stderr'] = err if group_exists(name): info = group_info(name) result['system'] = system result['gid'] = info[2] module.exit_json(**result) # include magic from lib/ansible/module_common.py #<<INCLUDE_ANSIBLE_MODULE_COMMON>> main()