import files
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user