mirror of
				https://github.com/ansible-collections/community.general.git
				synced 2025-10-26 05:50:36 -07:00 
			
		
		
		
	* fixed validation-modules for aix_devices.py * fixed validation-modules for aix_filesystem.py * fixed validation-modules for aix_inittab.py * fixed validation-modules for aix_lvg.py * fixed validation-modules for aix_lvol.py * fixed validation-modules for awall.py * fixed validation-modules for dconf.py * fixed validation-modules for gconftool2.py * fixed validation-modules for interfaces_file.py * fixed validation-modules for java_keystore.py * fixed validation-modules for kernel_blacklist.py * fixed validation-modules for plugins/modules/system/lbu.py * fixed validation-modules for plugins/modules/system/locale_gen.py * fixed validation-modules for plugins/modules/system/lvg.py * fixed validation-modules for plugins/modules/system/lvol.py * fixed validation-modules for plugins/modules/system/mksysb.py * fixed validation-modules for plugins/modules/system/modprobe.py * fixed validation-modules for plugins/modules/system/nosh.py * fixed validation-modules for plugins/modules/system/open_iscsi.py * fixed validation-modules for plugins/modules/system/openwrt_init.py * fixed validation-modules for plugins/modules/system/osx_defaults.py * fixed validation-modules for plugins/modules/system/pamd.py * fixed validation-modules for plugins/modules/system/pam_limits.py * fixed validation-modules for plugins/modules/system/parted.py * fixed validation-modules for plugins/modules/system/puppet.py * fixed validation-modules for plugins/modules/system/python_requirements_info.py * fixed validation-modules for plugins/modules/system/runit.py the parameter "dist" is not used anywhere in the module * fixed validation-modules for plugins/modules/system/sefcontext.py * fixed validation-modules for plugins/modules/system/selogin.py * fixed validation-modules for plugins/modules/system/seport.py * fixed validation-modules for plugins/modules/system/solaris_zone.py * fixed validation-modules for plugins/modules/system/syspatch.py * fixed validation-modules for plugins/modules/system/vdo.py * fixed validation-modules for plugins/modules/system/xfconf.py * removed ignore almost all validate-modules lines in system * removed unnecessary validations, per shippable test * kernel_blacklist: keeping blacklist_file as str instead of path * mksysb: keeping storage_path as str instead of path * pam_limits: keeping dest as str instead of path * rollback on adding doc for puppet.py legacy param * rolledback param seuser required in selogin module * rolledback changes in runit * rolledback changes in osx_defaults * rolledback changes in aix_defaults
		
			
				
	
	
		
			247 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python
 | |
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| # Copyright: (c) 2017, Joris Weijters <joris.weijters@gmail.com>
 | |
| # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
 | |
| 
 | |
| from __future__ import absolute_import, division, print_function
 | |
| __metaclass__ = type
 | |
| 
 | |
| DOCUMENTATION = r'''
 | |
| ---
 | |
| author:
 | |
| - Joris Weijters (@molekuul)
 | |
| module: aix_inittab
 | |
| short_description: Manages the inittab on AIX
 | |
| description:
 | |
|     - Manages the inittab on AIX.
 | |
| options:
 | |
|   name:
 | |
|     description:
 | |
|     - Name of the inittab entry.
 | |
|     type: str
 | |
|     required: yes
 | |
|     aliases: [ service ]
 | |
|   runlevel:
 | |
|     description:
 | |
|     - Runlevel of the entry.
 | |
|     type: str
 | |
|     required: yes
 | |
|   action:
 | |
|     description:
 | |
|     - Action what the init has to do with this entry.
 | |
|     type: str
 | |
|     choices:
 | |
|     - boot
 | |
|     - bootwait
 | |
|     - hold
 | |
|     - initdefault
 | |
|     - 'off'
 | |
|     - once
 | |
|     - ondemand
 | |
|     - powerfail
 | |
|     - powerwait
 | |
|     - respawn
 | |
|     - sysinit
 | |
|     - wait
 | |
|   command:
 | |
|     description:
 | |
|     - What command has to run.
 | |
|     type: str
 | |
|     required: yes
 | |
|   insertafter:
 | |
|     description:
 | |
|     - After which inittabline should the new entry inserted.
 | |
|     type: str
 | |
|   state:
 | |
|     description:
 | |
|     - Whether the entry should be present or absent in the inittab file.
 | |
|     type: str
 | |
|     choices: [ absent, present ]
 | |
|     default: present
 | |
| notes:
 | |
|   - The changes are persistent across reboots.
 | |
|   - You need root rights to read or adjust the inittab with the C(lsitab), C(chitab), C(mkitab) or C(rmitab) commands.
 | |
|   - Tested on AIX 7.1.
 | |
| requirements:
 | |
| - itertools
 | |
| '''
 | |
| 
 | |
| EXAMPLES = '''
 | |
| # Add service startmyservice to the inittab, directly after service existingservice.
 | |
| - name: Add startmyservice to inittab
 | |
|   community.general.aix_inittab:
 | |
|     name: startmyservice
 | |
|     runlevel: 4
 | |
|     action: once
 | |
|     command: echo hello
 | |
|     insertafter: existingservice
 | |
|     state: present
 | |
|   become: yes
 | |
| 
 | |
| # Change inittab entry startmyservice to runlevel "2" and processaction "wait".
 | |
| - name: Change startmyservice to inittab
 | |
|   community.general.aix_inittab:
 | |
|     name: startmyservice
 | |
|     runlevel: 2
 | |
|     action: wait
 | |
|     command: echo hello
 | |
|     state: present
 | |
|   become: yes
 | |
| 
 | |
| - name: Remove startmyservice from inittab
 | |
|   community.general.aix_inittab:
 | |
|     name: startmyservice
 | |
|     runlevel: 2
 | |
|     action: wait
 | |
|     command: echo hello
 | |
|     state: absent
 | |
|   become: yes
 | |
| '''
 | |
| 
 | |
| RETURN = '''
 | |
| name:
 | |
|     description: Name of the adjusted inittab entry
 | |
|     returned: always
 | |
|     type: str
 | |
|     sample: startmyservice
 | |
| msg:
 | |
|     description: Action done with the inittab entry
 | |
|     returned: changed
 | |
|     type: str
 | |
|     sample: changed inittab entry startmyservice
 | |
| changed:
 | |
|     description: Whether the inittab changed or not
 | |
|     returned: always
 | |
|     type: bool
 | |
|     sample: true
 | |
| '''
 | |
| 
 | |
| # Import necessary libraries
 | |
| try:
 | |
|     # python 2
 | |
|     from itertools import izip
 | |
| except ImportError:
 | |
|     izip = zip
 | |
| 
 | |
| from ansible.module_utils.basic import AnsibleModule
 | |
| 
 | |
| # end import modules
 | |
| # start defining the functions
 | |
| 
 | |
| 
 | |
| def check_current_entry(module):
 | |
|     # Check if entry exists, if not return False in exists in return dict,
 | |
|     # if true return True and the entry in return dict
 | |
|     existsdict = {'exist': False}
 | |
|     lsitab = module.get_bin_path('lsitab')
 | |
|     (rc, out, err) = module.run_command([lsitab, module.params['name']])
 | |
|     if rc == 0:
 | |
|         keys = ('name', 'runlevel', 'action', 'command')
 | |
|         values = out.split(":")
 | |
|         # strip non readable characters as \n
 | |
|         values = map(lambda s: s.strip(), values)
 | |
|         existsdict = dict(izip(keys, values))
 | |
|         existsdict.update({'exist': True})
 | |
|     return existsdict
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     # initialize
 | |
|     module = AnsibleModule(
 | |
|         argument_spec=dict(
 | |
|             name=dict(type='str', required=True, aliases=['service']),
 | |
|             runlevel=dict(type='str', required=True),
 | |
|             action=dict(type='str', choices=[
 | |
|                 'boot',
 | |
|                 'bootwait',
 | |
|                 'hold',
 | |
|                 'initdefault',
 | |
|                 'off',
 | |
|                 'once',
 | |
|                 'ondemand',
 | |
|                 'powerfail',
 | |
|                 'powerwait',
 | |
|                 'respawn',
 | |
|                 'sysinit',
 | |
|                 'wait',
 | |
|             ]),
 | |
|             command=dict(type='str', required=True),
 | |
|             insertafter=dict(type='str'),
 | |
|             state=dict(type='str', default='present', choices=['absent', 'present']),
 | |
|         ),
 | |
|         supports_check_mode=True,
 | |
|     )
 | |
| 
 | |
|     result = {
 | |
|         'name': module.params['name'],
 | |
|         'changed': False,
 | |
|         'msg': ""
 | |
|     }
 | |
| 
 | |
|     # Find commandline strings
 | |
|     mkitab = module.get_bin_path('mkitab')
 | |
|     rmitab = module.get_bin_path('rmitab')
 | |
|     chitab = module.get_bin_path('chitab')
 | |
|     rc = 0
 | |
| 
 | |
|     # check if the new entry exists
 | |
|     current_entry = check_current_entry(module)
 | |
| 
 | |
|     # if action is install or change,
 | |
|     if module.params['state'] == 'present':
 | |
| 
 | |
|         # create new entry string
 | |
|         new_entry = module.params['name'] + ":" + module.params['runlevel'] + \
 | |
|             ":" + module.params['action'] + ":" + module.params['command']
 | |
| 
 | |
|         # If current entry exists or fields are different(if the entry does not
 | |
|         # exists, then the entry wil be created
 | |
|         if (not current_entry['exist']) or (
 | |
|                 module.params['runlevel'] != current_entry['runlevel'] or
 | |
|                 module.params['action'] != current_entry['action'] or
 | |
|                 module.params['command'] != current_entry['command']):
 | |
| 
 | |
|             # If the entry does exist then change the entry
 | |
|             if current_entry['exist']:
 | |
|                 if not module.check_mode:
 | |
|                     (rc, out, err) = module.run_command([chitab, new_entry])
 | |
|                 if rc != 0:
 | |
|                     module.fail_json(
 | |
|                         msg="could not change inittab", rc=rc, err=err)
 | |
|                 result['msg'] = "changed inittab entry" + " " + current_entry['name']
 | |
|                 result['changed'] = True
 | |
| 
 | |
|             # If the entry does not exist create the entry
 | |
|             elif not current_entry['exist']:
 | |
|                 if module.params['insertafter']:
 | |
|                     if not module.check_mode:
 | |
|                         (rc, out, err) = module.run_command(
 | |
|                             [mkitab, '-i', module.params['insertafter'], new_entry])
 | |
|                 else:
 | |
|                     if not module.check_mode:
 | |
|                         (rc, out, err) = module.run_command(
 | |
|                             [mkitab, new_entry])
 | |
| 
 | |
|                 if rc != 0:
 | |
|                     module.fail_json(msg="could not adjust inittab", rc=rc, err=err)
 | |
|                 result['msg'] = "add inittab entry" + " " + module.params['name']
 | |
|                 result['changed'] = True
 | |
| 
 | |
|     elif module.params['state'] == 'absent':
 | |
|         # If the action is remove and the entry exists then remove the entry
 | |
|         if current_entry['exist']:
 | |
|             if not module.check_mode:
 | |
|                 (rc, out, err) = module.run_command(
 | |
|                     [rmitab, module.params['name']])
 | |
|                 if rc != 0:
 | |
|                     module.fail_json(
 | |
|                         msg="could not remove entry from inittab)", rc=rc, err=err)
 | |
|             result['msg'] = "removed inittab entry" + " " + current_entry['name']
 | |
|             result['changed'] = True
 | |
| 
 | |
|     module.exit_json(**result)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |