mirror of
https://github.com/zahodi/ansible-mikrotik.git
synced 2025-07-16 13:14:21 +02:00
190 lines
4.6 KiB
Python
190 lines
4.6 KiB
Python
# -*- 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()
|