119 lines
3.6 KiB
Python
119 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
import os
|
|
from ansible.module_utils.basic import *
|
|
|
|
DOCUMENTATION = '''
|
|
---
|
|
module: goss
|
|
author: Mathieu Corbin
|
|
short_description: Launch goss (https://github.com/aelsabbahy/goss) test
|
|
description:
|
|
- Launch goss test. Always changed = False if success.
|
|
options:
|
|
path:
|
|
required: true
|
|
description:
|
|
- Test file to validate. Must be on the remote machine.
|
|
format:
|
|
required: false
|
|
description:
|
|
- change the output goss format.
|
|
- Goss format list : goss v --format => [documentation json junit nagios rspecish tap].
|
|
- Default: rspecish
|
|
output_file:
|
|
required: false
|
|
description:
|
|
- save the result of the goss command in a file whose path is output_file
|
|
examples:
|
|
- name: test goss file
|
|
goss:
|
|
path: "/path/to/file.yml"
|
|
|
|
- name: test goss files
|
|
goss:
|
|
path: "{{ item }}"
|
|
format: json
|
|
output_file : /my/output/file-{{ item }}
|
|
with_items: "{{ goss_files }}"
|
|
'''
|
|
|
|
|
|
# launch goss validate command on the file
|
|
def check(module, test_file_path, output_format):
|
|
cmd = ""
|
|
if output_format is not None:
|
|
cmd = "goss -g {0} v --format {1}".format(test_file_path, output_format)
|
|
else:
|
|
cmd = "goss -g {0} v".format(test_file_path)
|
|
return module.run_command(cmd)
|
|
|
|
|
|
# write goss result to output_file_path
|
|
def output_file(output_file_path, out):
|
|
if output_file_path is not None:
|
|
with open(output_file_path, 'w') as output_file:
|
|
output_file.write(out)
|
|
|
|
|
|
def main():
|
|
module = AnsibleModule(
|
|
argument_spec=dict(
|
|
path=dict(required=True, type='str'),
|
|
format=dict(required=False, type='str'),
|
|
output_file=dict(required=False, type='str'),
|
|
),
|
|
supports_check_mode=False
|
|
)
|
|
|
|
test_file_path = module.params['path'] # test file path
|
|
output_format = module.params['format'] # goss output format
|
|
output_file_path = module.params['output_file']
|
|
|
|
if test_file_path is None:
|
|
module.fail_json(msg="test file path is null")
|
|
|
|
test_file_path = os.path.expanduser(test_file_path)
|
|
|
|
# test if access to test file is ok
|
|
|
|
if not os.access(test_file_path, os.R_OK):
|
|
module.fail_json(msg="Test file %s not readable" % (test_file_path))
|
|
|
|
# test if test file is not a dir
|
|
if os.path.isdir(test_file_path):
|
|
module.fail_json(msg="Test file must be a file ! : %s" % (test_file_path))
|
|
|
|
(rc, out, err) = check(module, test_file_path, output_format)
|
|
|
|
if output_file_path is not None:
|
|
output_file_path = os.path.expanduser(output_file_path)
|
|
# check if output_file is a file
|
|
if output_file_path.endswith(os.sep):
|
|
module.fail_json(msg="output_file must be a file. Actually : %s "
|
|
% (output_file_path))
|
|
|
|
output_dirname = os.path.dirname(output_file_path)
|
|
|
|
# check if output directory exists
|
|
if not os.path.exists(output_dirname):
|
|
module.fail_json(msg="directory %s does not exists" % (output_dirname))
|
|
|
|
# check if writable
|
|
if not os.access(os.path.dirname(output_file_path), os.W_OK):
|
|
module.fail_json(msg="Destination %s not writable" % (os.path.dirname(output_file_path)))
|
|
# write goss result on the output file
|
|
output_file(output_file_path, out)
|
|
|
|
if rc is not None and rc != 0:
|
|
error_msg = "err : {0} ; out : {1}".format(err, out)
|
|
module.fail_json(msg=error_msg)
|
|
|
|
result = {}
|
|
result['stdout'] = out
|
|
result['changed'] = False
|
|
|
|
module.exit_json(**result)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|