mirror of https://github.com/ansible/ansible.git
Add the aix_inittab module to be able to modify the inittab at AIX systems (#21511)
* Added the aix_inittab module to be able to modify the inittab at AIX systems. * fixed identation errors * fixed identations and trailing whitespace changed if conditions * repaired tab-identation * adjusted to long line and identation * Adjusted the yaml in the example documentation * Adjusted the documentation yaml * Repaired return yaml * repaired typo * Removed unnecessary parameters from comment changed action to state, and changed the way to call this module changed proccessaction to action * adjusted result['warnings'] to module.warn() * adjusted the documentation * changed warning to failed ran module against autopep8 * added check_mode * fixed typo * changed description and short description, to be able to push again after a failure at shippablepull/21868/head
parent
466131198b
commit
7734dd5890
@ -0,0 +1,248 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# (c) 2017, Joris Weijters <joris.weijters@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/>.
|
||||||
|
#
|
||||||
|
ANSIBLE_METADATA = {'status': ['preview'],
|
||||||
|
'supported_by': 'community',
|
||||||
|
'version': '1.0'}
|
||||||
|
|
||||||
|
|
||||||
|
DOCUMENTATION = '''
|
||||||
|
---
|
||||||
|
author: "Joris Weijters (@molekuul)"
|
||||||
|
module: aix_inittab
|
||||||
|
short_description: Manages the inittab on AIX.
|
||||||
|
description:
|
||||||
|
- Manages the inittab on AIX.
|
||||||
|
version_added: "2.3"
|
||||||
|
options:
|
||||||
|
name:
|
||||||
|
description: Name of the inittab entry.
|
||||||
|
required: True
|
||||||
|
alias: service
|
||||||
|
type: string
|
||||||
|
runlevel:
|
||||||
|
description: Runlevel of the entry.
|
||||||
|
required: True
|
||||||
|
type: string
|
||||||
|
action:
|
||||||
|
description: Action what the init has to do with this entry.
|
||||||
|
required: True
|
||||||
|
choices: [
|
||||||
|
'respawn',
|
||||||
|
'wait',
|
||||||
|
'once',
|
||||||
|
'boot',
|
||||||
|
'bootwait',
|
||||||
|
'powerfail',
|
||||||
|
'powerwait',
|
||||||
|
'off',
|
||||||
|
'hold',
|
||||||
|
'ondemand',
|
||||||
|
'initdefault',
|
||||||
|
'sysinit'
|
||||||
|
]
|
||||||
|
type: string
|
||||||
|
command:
|
||||||
|
description: What command has to run.
|
||||||
|
required: True
|
||||||
|
type: string
|
||||||
|
insertafter:
|
||||||
|
description: After which inittabline should the new entry inserted.
|
||||||
|
type: string
|
||||||
|
state:
|
||||||
|
description: Whether the entry should be present or absent in the inittab file
|
||||||
|
type: string
|
||||||
|
choices: [ "present", "absent" ]
|
||||||
|
default: present
|
||||||
|
notes:
|
||||||
|
- The changes are persistent across reboots.
|
||||||
|
- You need root rights to read or adjust the inittab with the lsitab, chitab,
|
||||||
|
mkitab or 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
|
||||||
|
aix_inittab:
|
||||||
|
name: startmyservice
|
||||||
|
runlevel: 4
|
||||||
|
action: once
|
||||||
|
command: "echo hello"
|
||||||
|
insertafter: existingservice
|
||||||
|
state: present
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
# Change inittab enrty startmyservice to runlevel "2" and processaction "wait".
|
||||||
|
- name: Change startmyservice to inittab
|
||||||
|
aix_inittab:
|
||||||
|
name: startmyservice
|
||||||
|
runlevel: 2
|
||||||
|
action: wait
|
||||||
|
command: "echo hello"
|
||||||
|
state: present
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
# Remove inittab entry startmyservice.
|
||||||
|
- name: remove startmyservice from inittab
|
||||||
|
aix_inittab:
|
||||||
|
name: startmyservice
|
||||||
|
runlevel: 2
|
||||||
|
action: wait
|
||||||
|
command: "echo hello"
|
||||||
|
state: absent
|
||||||
|
become: yes
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = '''
|
||||||
|
# description: The result is deliverd in an dictionary.
|
||||||
|
- return:
|
||||||
|
changed: true
|
||||||
|
name: "startmyservice"
|
||||||
|
msg: "changed inittab entry startmyservice"
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Import necessary libraries
|
||||||
|
import itertools
|
||||||
|
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(itertools.izip(keys, values))
|
||||||
|
existsdict.update({'exist': True})
|
||||||
|
return existsdict
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# initialize
|
||||||
|
module = AnsibleModule(
|
||||||
|
argument_spec=dict(
|
||||||
|
name=dict(required=True, type='str', aliases=['service']),
|
||||||
|
runlevel=dict(required=True, type='str'),
|
||||||
|
action=dict(choices=[
|
||||||
|
'respawn',
|
||||||
|
'wait',
|
||||||
|
'once',
|
||||||
|
'boot',
|
||||||
|
'bootwait',
|
||||||
|
'powerfail',
|
||||||
|
'powerwait',
|
||||||
|
'off',
|
||||||
|
'hold',
|
||||||
|
'ondemand',
|
||||||
|
'initdefault',
|
||||||
|
'sysinit'
|
||||||
|
], type='str'),
|
||||||
|
command=dict(required=True, type='str'),
|
||||||
|
insertafter=dict(type='str'),
|
||||||
|
state=dict(choices=[
|
||||||
|
'present',
|
||||||
|
'absent',
|
||||||
|
], required=True, type='str'),
|
||||||
|
),
|
||||||
|
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(
|
||||||
|
"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 grom inittab)", rc=rc, err=err)
|
||||||
|
result['msg'] = "removed inittab entry" + " " + current_entry['name']
|
||||||
|
result['changed'] = True
|
||||||
|
|
||||||
|
module.exit_json(**result)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in New Issue