mirror of https://github.com/ansible/ansible.git
Initial commit of fmgr_sys_proxy.py (#45518)
parent
73c8041ec0
commit
6040175186
@ -0,0 +1,192 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
#
|
||||||
|
# This file is part of Ansible
|
||||||
|
#
|
||||||
|
# Ansible is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Ansible is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
ANSIBLE_METADATA = {'status': ['preview'],
|
||||||
|
'supported_by': 'community',
|
||||||
|
'metadata_version': '1.1'}
|
||||||
|
|
||||||
|
DOCUMENTATION = '''
|
||||||
|
---
|
||||||
|
module: fmgr_sys_proxy
|
||||||
|
version_added: "2.8"
|
||||||
|
author: Andrew Welsh
|
||||||
|
short_description: Make FortiGate API calls via the FortiMananger
|
||||||
|
description:
|
||||||
|
- The FMG proxies FOS API calls via the FMG. Review FortiGate API documentation to ensure you are passing correct
|
||||||
|
parameters for both the FortiManager and FortiGate
|
||||||
|
|
||||||
|
options:
|
||||||
|
adom:
|
||||||
|
description:
|
||||||
|
- The administrative domain (admon) the configuration belongs to
|
||||||
|
required: true
|
||||||
|
host:
|
||||||
|
description:
|
||||||
|
- The FortiManager's Address.
|
||||||
|
required: true
|
||||||
|
username:
|
||||||
|
description:
|
||||||
|
- The username to log into the FortiManager
|
||||||
|
required: true
|
||||||
|
password:
|
||||||
|
description:
|
||||||
|
- The password associated with the username account.
|
||||||
|
required: false
|
||||||
|
|
||||||
|
action:
|
||||||
|
description:
|
||||||
|
- Specify HTTP action for the request. Either 'get' or 'post'
|
||||||
|
required: True
|
||||||
|
payload:
|
||||||
|
description:
|
||||||
|
- JSON payload of the request. The payload will be URL-encoded and becomes the "json" field in the query string for both GET and POST request.
|
||||||
|
required: False
|
||||||
|
resource:
|
||||||
|
description:
|
||||||
|
- URL on the remote device to be accessed, string
|
||||||
|
required: True
|
||||||
|
target:
|
||||||
|
description:
|
||||||
|
- FOS datasource, either device or group object
|
||||||
|
required: True
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
EXAMPLES = '''
|
||||||
|
- name: Proxy FOS requests via FMG
|
||||||
|
hosts: FortiManager
|
||||||
|
connection: local
|
||||||
|
gather_facts: False
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
|
||||||
|
- name: Get upgrade path for FGT1
|
||||||
|
fmgr_provision:
|
||||||
|
host: "{{ inventory_hostname }}"
|
||||||
|
username: "{{ username }}"
|
||||||
|
password: "{{ password }}"
|
||||||
|
adom: "root"
|
||||||
|
action: "get"
|
||||||
|
resource: "/api/v2/monitor/system/firmware/upgrade-paths?vdom=root"
|
||||||
|
target: ["/adom/root/device/FGT1"]
|
||||||
|
- name: Upgrade firmware of FGT1
|
||||||
|
fmgr_provision:
|
||||||
|
host: "{{ inventory_hostname }}"
|
||||||
|
username: "{{ username }}"
|
||||||
|
password: "{{ password }}"
|
||||||
|
adom: "root"
|
||||||
|
action: "post"
|
||||||
|
payload: {source: upload, file_content: b64_encoded_string, file_name: file_name}
|
||||||
|
resource: "/api/v2/monitor/system/firmware/upgrade?vdom=vdom"
|
||||||
|
target: ["/adom/root/device/FGT1"]
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = """
|
||||||
|
api_result:
|
||||||
|
description: full API response, includes status code and message
|
||||||
|
returned: always
|
||||||
|
type: string
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import AnsibleModule, env_fallback
|
||||||
|
from ansible.module_utils.network.fortimanager.fortimanager import AnsibleFortiManager
|
||||||
|
|
||||||
|
|
||||||
|
# check for pyFMG lib
|
||||||
|
try:
|
||||||
|
from pyFMG.fortimgr import FortiManager
|
||||||
|
HAS_PYFMGR = True
|
||||||
|
except ImportError:
|
||||||
|
HAS_PYFMGR = False
|
||||||
|
|
||||||
|
|
||||||
|
def fos_request(fmg, action, resource, target, payload, adom='root'):
|
||||||
|
|
||||||
|
datagram = {
|
||||||
|
"data": {
|
||||||
|
# get or post
|
||||||
|
"action": action,
|
||||||
|
# dictionary of data
|
||||||
|
"payload": payload,
|
||||||
|
# FOS API URL including vdom params
|
||||||
|
"resource": resource,
|
||||||
|
# FMG device to make API calls to
|
||||||
|
"target": target
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
url = "/sys/proxy/json"
|
||||||
|
|
||||||
|
status, response = fmg.execute(url, datagram)
|
||||||
|
return status, response
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
argument_spec = dict(
|
||||||
|
adom=dict(required=False, type="str"),
|
||||||
|
host=dict(required=True, type="str"),
|
||||||
|
password=dict(fallback=(env_fallback, ["ANSIBLE_NET_PASSWORD"]), no_log=True),
|
||||||
|
username=dict(fallback=(env_fallback, ["ANSIBLE_NET_USERNAME"]), no_log=True),
|
||||||
|
|
||||||
|
action=dict(required=False, type="str"),
|
||||||
|
resource=dict(required=False, type="str"),
|
||||||
|
target=dict(required=False, type="str"),
|
||||||
|
payload=dict(required=False, type="str"),
|
||||||
|
)
|
||||||
|
|
||||||
|
module = AnsibleModule(argument_spec, supports_check_mode=True, )
|
||||||
|
|
||||||
|
action = module.params["action"]
|
||||||
|
resource = module.params["resource"]
|
||||||
|
target = module.params["target"]
|
||||||
|
payload = module.params["payload"]
|
||||||
|
|
||||||
|
# check if params are set
|
||||||
|
if module.params["host"] is None or module.params["username"] is None:
|
||||||
|
module.fail_json(msg="Host and username are required for connection")
|
||||||
|
|
||||||
|
# check if login failed
|
||||||
|
fmg = AnsibleFortiManager(module, module.params["host"], module.params["username"], module.params["password"])
|
||||||
|
response = fmg.login()
|
||||||
|
|
||||||
|
if response[1]['status']['code'] != 0:
|
||||||
|
module.fail_json(msg="Connection to FortiManager Failed")
|
||||||
|
else:
|
||||||
|
if module.params["adom"] is None:
|
||||||
|
module.params["adom"] = 'root'
|
||||||
|
|
||||||
|
status, result = fos_request(fmg, action, resource, target, payload, module.params["adom"])
|
||||||
|
|
||||||
|
if not status == 0:
|
||||||
|
module.fail_json(msg="Failure showing upgrade path", **result)
|
||||||
|
|
||||||
|
fmg.logout()
|
||||||
|
|
||||||
|
# results is returned as a tuple
|
||||||
|
return module.exit_json(changed=True, **result)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue