User Tools

Site Tools


burim:paloalto:api:python
#!/usr/bin/env python

from __future__ import absolute_import, division, print_function
__metaclass__ = type

#  Copyright 2017 Palo Alto Networks, Inc
#
#  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_METADATA = {'metadata_version': '1.1',
                    'status': ['preview'],
                    'supported_by': 'community'}


DOCUMENTATION = '''
---
module: panos_ipsec_tunnel
short_description: Configures IPSec Tunnels on the firewall with subset of settings.
description:
    - Use IPSec Tunnels to establish and manage IPSec VPN tunnels between firewalls. This is the Phase 2 portion of the
    - IKE/IPSec VPN setup.
author: "Ivan Bojer (@ivanbojer)"
version_added: "2.8"
requirements:
    - pan-python can be obtained from PyPI U(https://pypi.python.org/pypi/pan-python)
    - pandevice can be obtained from PyPI U(https://pypi.python.org/pypi/pandevice)
notes:
    - Checkmode is not supported.
    - Panorama is NOT supported.
options:
    ip_address:
        description:
            - IP address (or hostname) of PAN-OS device being configured.
        required: true
    username:
        description:
            - Username credentials to use for auth unless I(api_key) is set.
        default: "admin"
    password:
        description:
            - Password credentials to use for auth unless I(api_key) is set.
        required: true
    api_key:
        description:
            - API key that can be used instead of I(username)/I(password) credentials.
    state:
        description:
            - Create or remove static route.
        choices: ['present', 'absent']
        default: 'present'
    commit:
        description:
            - Commit configuration if changed.
        default: true
    name:
        description:
            - Name for the IPSec tunnel.
        required: true
    tunnel_interface:
        description:
            - Specify existing tunnel interface that will be used.
        default: 'tunnel.1'
    ike_gtw_name:
        description:
            - Name of the existing IKE gateway.
        default: 'default'
    ipsec_profile:
        description:
            - Name of the existing IPsec profile or use default.
        default: 'default'
'''

EXAMPLES = '''
- name: Add IPSec tunnel to IKE gateway profile
    panos_ipsec_tunnel:
      ip_address: '{{ ip_address }}'
      username: '{{ username }}'
      password: '{{ password }}'
      state: 'present'
      name: 'IPSecTunnel-Ansible'
      tunnel_interface: 'tunnel.2'
      ike_gtw_name: 'IKEGW-Ansible'
      ipsec_profile: 'IPSec-Ansible'
      commit: 'False'
'''

RETURN = '''
# Default return values
'''

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import get_exception

try:
    from pan.xapi import PanXapiError
    import pandevice
    from pandevice import base
    from pandevice import panorama
    from pandevice.errors import PanDeviceError
    from pandevice import network

    HAS_LIB = True
except ImportError:
    HAS_LIB = False


# def get_devicegroup(device, devicegroup):
#     dg_list = device.refresh_devices()
#     for group in dg_list:
#         if isinstance(group, pandevice.panorama.DeviceGroup):
#             if group.name == devicegroup:
#                 return group
#     return False


class IPSecTunnel:
    def __init__(self, *args, **kwargs):
        self.name = kwargs.get('name')
        self.key_type = 'auto-key'
        self.tunnel_interface = kwargs.get('tunnel_interface')
        self.ike_gw = args[0]
        self.ipsec_profile = args[1]


def main():
    argument_spec = dict(
        ip_address=dict(required=True),
        password=dict(no_log=True),
        username=dict(default='admin'),
        api_key=dict(no_log=True),
        state=dict(default='present', choices=['present', 'absent']),
        name=dict(required=True),
        tunnel_interface=dict(default='tunnel.1'),
        ike_gtw_name=dict(default='default'),
        ipsec_profile=dict(default='default'),
        commit=dict(type='bool', default=True)
    )
    module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=False,
                           required_one_of=[['api_key', 'password']])
    if not HAS_LIB:
        module.fail_json(msg='Missing required libraries.')

    ip_address = module.params['ip_address']
    password = module.params['password']
    username = module.params['username']
    api_key = module.params['api_key']
    state = module.params['state']
    name = module.params['name']
    tunnel_interface = module.params['tunnel_interface']
    ike_gtw_name = module.params['ike_gtw_name']
    ipsec_profile = module.params['ipsec_profile']
    commit = module.params['commit']

    # If Panorama, validate the devicegroup
    # dev_group = None
    # if devicegroup and isinstance(device, panorama.Panorama):
    #     dev_group = get_devicegroup(device, devicegroup)
    #     if dev_group:
    #         device.add(dev_group)
    #     else:
    #         module.fail_json(msg='\'%s\' device group not found in Panorama. Is the name correct?' % devicegroup)

    ipsecTunnel = IPSecTunnel(ike_gtw_name, ipsec_profile, name=name,
                              tunnel_interface=tunnel_interface)

    ipsec_tunnel = network.IpsecTunnel(name=ipsecTunnel.name, tunnel_interface=ipsecTunnel.tunnel_interface,
                                       type=ipsecTunnel.key_type,
                                       ak_ike_gateway=ipsecTunnel.ike_gw,
                                       ak_ipsec_crypto_profile=ipsecTunnel.ipsec_profile,
                                       ipv6=False,
                                       enable_tunnel_monitor=False,
                                       disabled=False)

    # Create the device with the appropriate pandevice type
    device = base.PanDevice.create_from_device(ip_address, username, password, api_key=api_key)

    changed = False
    try:
        # fetch all Ipsec tunnels
        tunnels = network.IpsecTunnel.refreshall(device)
        if state == "present":
            device.add(ipsec_tunnel)
            for t in tunnels:
                if t.name == ipsec_tunnel.name:
                    if not ipsec_tunnel.equal(t):
                        ipsec_tunnel.apply()
                        changed = True
            else:
                ipsec_tunnel.create()
                changed = True
        elif state == "absent":
            ipsec_tunnel = device.find(ipsec_tunnel.name, network.IpsecTunnel)
            if ipsec_tunnel:
                ipsec_tunnel.delete()
                changed = True
        else:
            module.fail_json(msg='[%s] state is not implemented yet' % state)
    except PanDeviceError:
        exc = get_exception()
        module.fail_json(msg=exc.message)

    if commit and changed:
        device.commit(sync=True)

    module.exit_json(msg='ipsec tunnel config successful.', changed=changed)


if __name__ == '__main__':
    main()
burim/paloalto/api/python.txt · Last modified: 2020/10/06 09:40 by burim

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki