combine service and pool modules

This commit is contained in:
Valentin Gurmeza 2017-06-05 13:44:06 -07:00
parent debe4f35d2
commit bc68163ccd
3 changed files with 186 additions and 224 deletions

114
library/mt_ip.py Normal file
View file

@ -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()

View file

@ -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()

View file

@ -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
###################