Source code for validations_common.library.validations_read_ini

# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Ansible module to read a value from an INI file.
Usage:
validations_read_ini: path=/path/to/file.ini section=default key=something

This will read the `path/to/file.ini` file and read the `Hello!` value under:
    [default]
    something = Hello!

You can register the result and use it later with `{{ my_ini.value }}`
"""

try:
    import configparser as ConfigParser
except ImportError:
    import ConfigParser

from enum import Enum
import os

from ansible.module_utils.basic import AnsibleModule
from yaml import safe_load as yaml_safe_load


DOCUMENTATION = '''
---
module: validations_read_ini
short_description: Get data from an ini file
description:
    - Get data from an ini file
options:
    path:
        required: true
        description:
            - File path
        type: str
    section:
        required: true
        description:
            - Section to look up
        type: str
    key:
        required: true
        description:
            - Section key to look up
        type: str
    default:
        required: false
        description:
            - Default value if key isn't found
    ignore_missing_file:
        required: false
        description:
            - Flag if a missing file should be ignored
        type: bool
author: "Tomas Sedovic"
'''

EXAMPLES = '''
- hosts: fizzbuz
  tasks:
    - name: Lookup bar value
      validations_read_ini:
        path: config.ini
        section: foo
        key: bar
        ignore_missing_file: True
      register: bar_value
'''


# Possible return values
[docs]class ReturnValue(Enum): OK = 0 INVALID_FORMAT = 1 KEY_NOT_FOUND = 2
[docs]def check_file(path): """Check if the requested file exists. :param path: path to configuration file :dtype path: `string` :returns: True if file exists, false otherwise :rtype: `bool` """ return (os.path.exists(path) and os.path.isfile(path))
[docs]def get_result(path, section, key, default=None): """Get value based on a section and a key. :param path: path to configuration file :dtype path: `string` :param section: name of the config file section :dtype section: `string` :param key: key for which we want to know the value :dtype key: `string` :param default: default value to use if the key does not exist :dtype default: `object` :returns: tuple of numeric return code, message and value of the requested key :rtype: `tuple` """ msg = '' value = None config = ConfigParser.SafeConfigParser(strict=False) try: config.read(path) except (OSError, ConfigParser.ParsingError) as exc_msg: msg = "The file '{}' is not in a valid INI format: {}".format( path, exc_msg) return (ReturnValue.INVALID_FORMAT, msg, value) try: value = config.get(section, key) msg = ("The key '{}' under the section '{}' in file {} " "has the value: '{}'").format(key, section, path, value) ret = ReturnValue.OK except ConfigParser.Error: if default: msg = ("There is no key '{}' under section '{}' in file {}. Using" " default value '{}'".format(key, section, path, default)) ret = ReturnValue.OK value = default else: value = None msg = "There is no key '{}' under the section '{}' in file {}.".format( key, section, path) ret = ReturnValue.KEY_NOT_FOUND return (ret, msg, value)
[docs]def main(): module = AnsibleModule( argument_spec=yaml_safe_load(DOCUMENTATION)['options']) ini_file_path = module.params.get('path') ignore_missing = module.params.get('ignore_missing_file') # Check that file exists file_exists = check_file(ini_file_path) if file_exists: # Try to parse the result from ini file section = module.params.get('section') key = module.params.get('key') default = module.params.get('default') ret, msg, value = get_result(ini_file_path, section, key, default) if ret == ReturnValue.INVALID_FORMAT: module.fail_json(msg=msg) elif ret == ReturnValue.KEY_NOT_FOUND: module.exit_json(msg=msg, changed=False, value=None) elif ret == ReturnValue.OK: module.exit_json(msg=msg, changed=False, value=value) else: # Opening file failed msg = "Could not open the ini file: '{}'".format(ini_file_path) if ignore_missing: module.exit_json(msg=msg, changed=False, value=None) else: module.fail_json(msg=msg)
if __name__ == '__main__': main()