From bc68163ccdde67757debf85d38ce44a17d5b47b3 Mon Sep 17 00:00:00 2001 From: Valentin Gurmeza Date: Mon, 5 Jun 2017 13:44:06 -0700 Subject: [PATCH] combine service and pool modules --- library/mt_ip.py | 114 ++++++++++++++++++++++ library/mt_service.py | 190 ------------------------------------ tests/integration/tests.yml | 106 +++++++++++++------- 3 files changed, 186 insertions(+), 224 deletions(-) create mode 100644 library/mt_ip.py delete mode 100644 library/mt_service.py diff --git a/library/mt_ip.py b/library/mt_ip.py new file mode 100644 index 0000000..a13b3cb --- /dev/null +++ b/library/mt_ip.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +DOCUMENTATION = ''' +module: mt_ip +author: + - "Valentin Gurmeza" + - "Shaun Smiley" +version_added: "2.3" +short_description: Manage mikrotik ip endpoints +requirements: + - mt_api +description: + - enable, disable, or modify a ip endpoint settings +options: + hostname: + description: + - hotstname of mikrotik router + required: True + username: + description: + - username used to connect to mikrotik router + required: True + password: + description: + - password used for authentication to mikrotik router + required: True + parameter: + description: + - sub endpoint for mikrotik snmp + required: True + options: + - netwatch + - e-mail + settings: + description: + - All Mikrotik compatible parameters for this particular endpoint. + Any yes/no values must be enclosed in double quotes + state: + description: + - absent or present +''' + +EXAMPLES = ''' +- mt_service: + hostname: "{{ inventory_hostname }}" + username: "{{ mt_user }}" + password: "{{ mt_pass }}" + disabled: no + name: ftp + address: 192.168.52.3 +''' + +from ansible.module_utils.basic import AnsibleModule +from mt_common import clean_params, MikrotikIdempotent + + +def main(): + module = AnsibleModule( + argument_spec = dict( + hostname = dict(required=True), + username = dict(required=True), + password = dict(required=True), + settings = dict(required=False, type='dict'), + parameter = dict( + required = True, + choices = ['service', 'pool'], + type = 'str' + ), + state = dict( + required = False, + choices = ['present', 'absent'], + type = 'str' + ), + ), + supports_check_mode=True + ) + + params = module.params + idempotent_parameter = 'name' + + mt_obj = MikrotikIdempotent( + hostname = params['hostname'], + username = params['username'], + password = params['password'], + state = params['state'], + desired_params = params['settings'], + idempotent_param = idempotent_parameter, + api_path = '/ip/' + str(params['parameter']), + check_mode = module.check_mode + ) + + mt_obj.sync_state() + + if mt_obj.failed: + module.fail_json( + msg = mt_obj.failed_msg + ) + elif mt_obj.changed: + module.exit_json( + failed=False, + changed=True, + msg=mt_obj.changed_msg, + diff={ "prepared": { + "old": mt_obj.old_params, + "new": mt_obj.new_params, + }}, + ) + else: + module.exit_json( + failed=False, + changed=False, + msg=params['settings'], + ) +if __name__ == '__main__': + main() diff --git a/library/mt_service.py b/library/mt_service.py deleted file mode 100644 index 459d967..0000000 --- a/library/mt_service.py +++ /dev/null @@ -1,190 +0,0 @@ -# -*- coding: utf-8 -*- -DOCUMENTATION = ''' -module: mt_service -author: - - "Valentin Gurmeza" - - "Shaun Smiley" -version_added: "2.3" -short_description: Manage mikrotik ip service -requirements: - - mt_api -description: - - enable, disable, or modify a ip service -options: - hostname: - description: - - hotstname of mikrotik router - required: True - username: - description: - - username used to connect to mikrotik router - required: True - password: - description: - - password used for authentication to mikrotik router - required: True - disabled: - description: - - service enabled or disabled - required: True - choices: - - no - - yes - name: - description: - - name of the service - required: True - choices: - - api - - api-ssl - - ftp - - ssh - - telnet - - winbox - - www - - www-ssl - address: - description: - - List of IP/IPv6 prefixes from which the service is accessible - certificate: - description: - - The name of the certificate used by particular service. Applicable only for services that depends on certificates (www-ssl, api-ssl) - port: - description: - - The port particular service listens on -''' - -EXAMPLES = ''' -- mt_service: - hostname: "{{ inventory_hostname }}" - username: "{{ mt_user }}" - password: "{{ mt_pass }}" - disabled: no - name: ftp - address: 192.168.52.3 -''' - -import mt_api -import re -from ansible.module_utils.basic import AnsibleModule - - -def main(): - - module = AnsibleModule( - argument_spec=dict( - hostname = dict(required=True), - username = dict(required=True), - password = dict(required=True), - interface = dict(required=False, type='str'), - address = dict(required=False, type='str'), - certificate= dict(required=False, type='str'), - name = dict( - required=True, - choices=[ - 'api', - 'api-ssl', - 'ftp', - 'ssh', - 'telnet', - 'winbox', - 'www', - 'www-ssl' - ], - type='str' - ), - disabled=dict( - required = True, - choices = ['yes', 'no'], - type = 'str' - ), - ) - ) - - hostname = module.params['hostname'] - username = module.params['username'] - password = module.params['password'] - ansible_service_name = module.params['name'] - changed = False - msg = "" - - mk = mt_api.Mikrotik(hostname, username, password) - try: - mk.login() - except: - module.fail_json( - msg="Could not log into Mikrotik device." + - " Check the username and password.", - ) - - service_path = '/ip/service' - - response = mk.api_print(base_path=service_path) - service_params = module.params - mikrotik_service = {} - for item in response: - if 'name' in item[1].keys(): - if ansible_service_name == item[1]['name']: - mikrotik_service = item[1] - - ####################################### - # remove keys with empty values - # remove unneeded parameters - # modify keys with '_' to match mikrotik parameters - # convert yes/no to true/false - ###################################### - - remove_params = ['hostname', 'username', 'password'] - for i in remove_params: - del service_params[i] - - for key in service_params.keys(): - if service_params[key] is None: - del service_params[key] - - for key in service_params: - if service_params[key] == "yes": - service_params[key] = "true" - if service_params[key] == "no": - service_params[key] = "false" - - if '.id' in mikrotik_service: - client_id = mikrotik_service['.id'] - else: - client_id = False - - service_diff_keys = {} - - for key in service_params: - if key in mikrotik_service: - if service_params[key] != mikrotik_service[key]: - service_diff_keys[key] = service_params[key] - else: - service_diff_keys[key] = service_params[key] - if service_diff_keys == {}: - #################### - # Already up date - ################### - module.exit_json( - failed=False, - changed=False, - ) - elif service_diff_keys != {}: - service_diff_keys['numbers'] = client_id - mk.api_edit(base_path=service_path, params=service_diff_keys) - module.exit_json( - failed=False, - changed=True, - msg="Changed service item: " + service_params['name'], - ) - else: - #################### - # Failure - ################### - module.exit_json( - failed=True, - changed=False - ) - -if __name__ == '__main__': - main() diff --git a/tests/integration/tests.yml b/tests/integration/tests.yml index f6c50cf..50e5607 100644 --- a/tests/integration/tests.yml +++ b/tests/integration/tests.yml @@ -181,66 +181,94 @@ ################### - block: - name: Test adding ip pool - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" state: present - name: ansible_test - ranges: 102.3.4.5 + parameter: pool + settings: + name: ansible_test + ranges: 102.3.4.5 - name: NEVER_CHANGES Test adding duplicate ip pool - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" state: present - name: ansible_test - ranges: 102.3.4.5 + parameter: pool + settings: + name: ansible_test + ranges: 102.3.4.5 register: ip_pool_test_1_add - failed_when: ( ip_pool_test_1_add | changed ) + failed_when: ( + not ansible_check_mode + ) and ( + ( ip_pool_test_1_add | changed ) + ) - name: ALWAYS_CHANGES Test adding second ip pool to be removed later - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" state: present - name: ansible_test2 - ranges: 102.3.4.22 + parameter: pool + settings: + name: ansible_test2 + ranges: 102.3.4.22 register: ip_pool_test_2_add - failed_when: not ( ip_pool_test_2_add | changed ) + failed_when: ( + not ansible_check_mode + ) and ( + not ( ip_pool_test_2_add | changed ) + ) - name: Test adding ip pool to be used as next_pool - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" state: present - name: next_pool1 - ranges: 10.1.2.30-10.2.3.40 + parameter: pool + settings: + name: next_pool1 + ranges: 10.1.2.30-10.2.3.40 - name: ALWAYS_CHANGES Test editing an existing ip-pool item (change ranges add next_pool) - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" state: present - name: ansible_test - ranges: 102.3.4.6 - next_pool: next_pool1 + parameter: pool + settings: + name: ansible_test + ranges: 102.3.4.6 + next_pool: next_pool1 register: ip_pool_test_1_edit - failed_when: not ( ip_pool_test_1_edit | changed ) + failed_when: ( + not ansible_check_mode + ) and ( + not ( ip_pool_test_1_edit | changed ) + ) - name: ALWAYS_CHANGES Test remove ip pool - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" state: absent - name: ansible_test2 + parameter: pool + settings: + name: ansible_test2 register: ip_pool_test_2_rem - failed_when: not ( ip_pool_test_2_rem | changed ) + failed_when: ( + not ansible_check_mode + ) and ( + not ( ip_pool_test_2_rem | changed ) + ) tags: ip-pool ################## @@ -248,7 +276,7 @@ ################### - block: - name: Test adding ip pool to be used by dhcp_server - mt_ip_pool: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" @@ -1113,35 +1141,45 @@ ################### - block: - name: Test enabling ftp service - mt_service: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" - disabled: no - name: ftp - address: 192.168.50.1/32 + parameter: service + settings: + disabled: "no" + name: ftp + address: 192.168.50.1/32 - name: Test disabling services - mt_service: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" - disabled: yes - name: "{{ item }}" + parameter: service + settings: + disabled: "yes" + name: "{{ item }}" with_items: - ftp - telnet - api-ssl - name: ALWAYS_CHANGES Test re-enabling telnet service - mt_service: + mt_ip: hostname: "{{ mt_hostname }}" username: "{{ mt_user }}" password: "{{ mt_pass }}" - disabled: no - name: telnet + parameter: service + settings: + disabled: "no" + name: telnet register: enable_telnet - failed_when: not ( enable_telnet | changed ) + failed_when: ( + not ansible_check_mode + ) and ( + not ( enable_telnet | changed ) + ) tags: service ###################