6a89177a59
A collegue of mine has added basix AIX support to the setup, user and group modules. We have tested this on AIX 5.3 and 6.1 and it works "as advertised"
265 lines
7.8 KiB
Python
265 lines
7.8 KiB
Python
#!/usr/bin/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
|
|
import syslog
|
|
import platform
|
|
|
|
class Group(object):
|
|
"""
|
|
This is a generic Group manipulation class that is subclassed
|
|
based on platform.
|
|
|
|
A subclass may wish to override the following action methods:-
|
|
- group_del()
|
|
- group_add()
|
|
- group_mod()
|
|
|
|
All subclasses MUST define platform and distribution (which may be None).
|
|
"""
|
|
|
|
platform = 'Generic'
|
|
distribution = None
|
|
GROUPFILE = '/etc/group'
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
return load_platform_subclass(Group, args, kwargs)
|
|
|
|
def __init__(self, module):
|
|
self.module = module
|
|
self.state = module.params['state']
|
|
self.name = module.params['name']
|
|
self.gid = module.params['gid']
|
|
self.system = module.params['system']
|
|
self.syslogging = False
|
|
|
|
def execute_command(self, cmd):
|
|
if self.syslogging:
|
|
syslog.openlog('ansible-%s' % os.path.basename(__file__))
|
|
syslog.syslog(syslog.LOG_NOTICE, 'Command %s' % '|'.join(cmd))
|
|
|
|
return self.module.run_command(cmd)
|
|
|
|
def group_del(self):
|
|
cmd = [self.module.get_bin_path('groupdel', True), self.name]
|
|
return self.execute_command(cmd)
|
|
|
|
def group_add(self, **kwargs):
|
|
cmd = [self.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(self.name)
|
|
return self.execute_command(cmd)
|
|
|
|
def group_mod(self, **kwargs):
|
|
cmd = [self.module.get_bin_path('groupmod', True)]
|
|
info = self.group_info()
|
|
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(self.name)
|
|
return self.execute_command(cmd)
|
|
|
|
def group_exists(self):
|
|
try:
|
|
if grp.getgrnam(self.name):
|
|
return True
|
|
except KeyError:
|
|
return False
|
|
|
|
def group_info(self):
|
|
if not self.group_exists():
|
|
return False
|
|
try:
|
|
info = list(grp.getgrnam(self.name))
|
|
except KeyError:
|
|
return False
|
|
return info
|
|
|
|
# ===========================================
|
|
|
|
class SunOS(Group):
|
|
"""
|
|
This is a SunOS Group manipulation class. Solaris doesnt have
|
|
the 'system' group concept.
|
|
|
|
This overrides the following methods from the generic class:-
|
|
- group_add()
|
|
"""
|
|
|
|
platform = 'SunOS'
|
|
distribution = None
|
|
GROUPFILE = '/etc/group'
|
|
|
|
def group_add(self, **kwargs):
|
|
cmd = [self.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])
|
|
cmd.append(self.name)
|
|
return self.execute_command(cmd)
|
|
|
|
|
|
# ===========================================
|
|
|
|
class AIX(Group):
|
|
"""
|
|
This is a AIX Group manipulation class.
|
|
|
|
This overrides the following methods from the generic class:-
|
|
- group_del()
|
|
- group_add()
|
|
- group_mod()
|
|
"""
|
|
|
|
platform = 'AIX'
|
|
distribution = None
|
|
GROUPFILE = '/etc/group'
|
|
|
|
def group_del(self):
|
|
cmd = [self.module.get_bin_path('rmgroup', True), self.name]
|
|
return self.execute_command(cmd)
|
|
|
|
def group_add(self, **kwargs):
|
|
cmd = [self.module.get_bin_path('mkgroup', True)]
|
|
for key in kwargs:
|
|
if key == 'gid' and kwargs[key] is not None:
|
|
cmd.append('id='+kwargs[key])
|
|
elif key == 'system' and kwargs[key] == 'yes':
|
|
cmd.append('-a')
|
|
cmd.append(self.name)
|
|
return self.execute_command(cmd)
|
|
|
|
def group_mod(self, **kwargs):
|
|
cmd = [self.module.get_bin_path('chgroup', True)]
|
|
info = self.group_info()
|
|
for key in kwargs:
|
|
if key == 'gid':
|
|
if kwargs[key] is not None and info[2] != int(kwargs[key]):
|
|
cmd.append('id='+kwargs[key])
|
|
if len(cmd) == 1:
|
|
return (None, '', '')
|
|
cmd.append(self.name)
|
|
return self.execute_command(cmd)
|
|
|
|
# ===========================================
|
|
|
|
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']),
|
|
)
|
|
)
|
|
|
|
group = Group(module)
|
|
|
|
if group.syslogging:
|
|
syslog.openlog('ansible-%s' % os.path.basename(__file__))
|
|
syslog.syslog(syslog.LOG_NOTICE, 'Group instantiated - platform %s' % group.platform)
|
|
if user.distribution:
|
|
syslog.syslog(syslog.LOG_NOTICE, 'Group instantiated - distribution %s' % group.distribution)
|
|
|
|
rc = None
|
|
out = ''
|
|
err = ''
|
|
result = {}
|
|
result['name'] = group.name
|
|
result['state'] = group.state
|
|
if group.state == 'absent':
|
|
if group.group_exists():
|
|
(rc, out, err) = group.group_del()
|
|
if rc != 0:
|
|
module.fail_json(name=group.name, msg=err)
|
|
elif group.state == 'present':
|
|
if not group.group_exists():
|
|
(rc, out, err) = group.group_add(gid=group.gid, system=group.system)
|
|
else:
|
|
(rc, out, err) = group.group_mod(gid=group.gid)
|
|
|
|
if rc is not None and rc != 0:
|
|
module.fail_json(name=group.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.group_exists():
|
|
info = group.group_info()
|
|
result['system'] = group.system
|
|
result['gid'] = info[2]
|
|
|
|
module.exit_json(**result)
|
|
|
|
# include magic from lib/ansible/module_common.py
|
|
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
|
|
main()
|