File: //lib/python3.9/site-packages/ansible_collections/netbox/netbox/plugins/modules/netbox_prefix.py
# -*- coding: utf-8 -*-
# Copyright: (c) 2018, Mikhail Yohman (@FragmentedPacket) <[email protected]>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
DOCUMENTATION = r"""
---
module: netbox_prefix
short_description: Creates or removes prefixes from NetBox
description:
- Creates or removes prefixes from NetBox
notes:
- Tags should be defined as a YAML list
- This should be ran with connection C(local) and hosts C(localhost)
author:
- Mikhail Yohman (@FragmentedPacket)
- Anthony Ruhier (@Anthony25)
requirements:
- pynetbox
version_added: '0.1.0'
extends_documentation_fragment:
- netbox.netbox.common
options:
data:
type: dict
description:
- Defines the prefix configuration
suboptions:
family:
description:
- Specifies which address family the prefix prefix belongs to
required: false
type: int
prefix:
description:
- Required if state is C(present) and first_available is False. Will allocate or free this prefix.
required: false
type: raw
parent:
description:
- Required if state is C(present) and first_available is C(yes). Will get a new available prefix in this parent prefix.
required: false
type: raw
prefix_length:
description:
- |
Required ONLY if state is C(present) and first_available is C(yes).
Will get a new available prefix of the given prefix_length in this parent prefix.
required: false
type: int
site:
description:
- Site that prefix is associated with
required: false
type: raw
vrf:
description:
- VRF that prefix is associated with
required: false
type: raw
tenant:
description:
- The tenant that the prefix will be assigned to
required: false
type: raw
vlan:
description:
- The VLAN the prefix will be assigned to
required: false
type: raw
status:
description:
- The status of the prefix
required: false
type: raw
prefix_role:
description:
- The role of the prefix
required: false
type: raw
is_pool:
description:
- All IP Addresses within this prefix are considered usable
required: false
type: bool
mark_utilized:
description:
- Treat as 100% utilized
required: false
type: bool
version_added: "3.8.0"
description:
description:
- The description of the prefix
required: false
type: str
comments:
description:
- Comments that may include additional information in regards to the prefix
required: false
type: str
version_added: "3.10.0"
tags:
description:
- Any tags that the prefix may need to be associated with
required: false
type: list
elements: raw
custom_fields:
description:
- Must exist in NetBox and in key/value format
required: false
type: dict
required: true
first_available:
description:
- If C(yes) and state C(present), if an parent is given, it will get the
first available prefix of the given prefix_length inside the given parent (and
vrf, if given).
Unused with state C(absent).
default: false
type: bool
"""
EXAMPLES = r"""
- name: "Test NetBox prefix module"
connection: local
hosts: localhost
gather_facts: False
tasks:
- name: Create prefix within NetBox with only required information
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
prefix: 10.156.0.0/19
state: present
- name: Delete prefix within netbox
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
prefix: 10.156.0.0/19
state: absent
- name: Create prefix with several specified options
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
family: 4
prefix: 10.156.32.0/19
site: Test Site
vrf: Test VRF
tenant: Test Tenant
vlan:
name: Test VLAN
site: Test Site
tenant: Test Tenant
vlan_group: Test Vlan Group
status: Reserved
prefix_role: Network of care
description: Test description
is_pool: true
tags:
- Schnozzberry
state: present
- name: Get a new /24 inside 10.156.0.0/19 within NetBox - Parent doesn't exist
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
parent: 10.156.0.0/19
prefix_length: 24
state: present
first_available: yes
- name: Create prefix within NetBox with only required information
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
prefix: 10.156.0.0/19
state: present
- name: Get a new /24 inside 10.156.0.0/19 within NetBox
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
parent: 10.156.0.0/19
prefix_length: 24
state: present
first_available: yes
- name: Get a new /24 inside 10.157.0.0/19 within NetBox with additional values
netbox.netbox.netbox_prefix:
netbox_url: http://netbox.local
netbox_token: thisIsMyToken
data:
parent: 10.157.0.0/19
prefix_length: 24
vrf: Test VRF
site: Test Site
state: present
first_available: yes
"""
RETURN = r"""
prefix:
description: Serialized object as created or already existent within NetBox
returned: on creation
type: dict
msg:
description: Message indicating failure or info about what has been achieved
returned: always
type: str
"""
from ansible_collections.netbox.netbox.plugins.module_utils.netbox_utils import (
NetboxAnsibleModule,
NETBOX_ARG_SPEC,
)
from ansible_collections.netbox.netbox.plugins.module_utils.netbox_ipam import (
NetboxIpamModule,
NB_PREFIXES,
)
from copy import deepcopy
def main():
"""
Main entry point for module execution
"""
argument_spec = deepcopy(NETBOX_ARG_SPEC)
argument_spec.update(
dict(
data=dict(
type="dict",
required=True,
options=dict(
family=dict(required=False, type="int"),
prefix=dict(required=False, type="raw"),
parent=dict(required=False, type="raw"),
prefix_length=dict(required=False, type="int"),
site=dict(required=False, type="raw"),
vrf=dict(required=False, type="raw"),
tenant=dict(required=False, type="raw"),
vlan=dict(required=False, type="raw"),
status=dict(required=False, type="raw"),
prefix_role=dict(required=False, type="raw"),
is_pool=dict(required=False, type="bool"),
mark_utilized=dict(required=False, type="bool"),
description=dict(required=False, type="str"),
comments=dict(required=False, type="str"),
tags=dict(required=False, type="list", elements="raw"),
custom_fields=dict(required=False, type="dict"),
),
),
first_available=dict(required=False, type="bool", default=False),
)
)
required_if = [
("state", "present", ["prefix", "parent"], True),
("state", "absent", ["prefix"]),
("first_available", "yes", ["parent"]),
]
module = NetboxAnsibleModule(
argument_spec=argument_spec, supports_check_mode=True, required_if=required_if
)
netbox_prefix = NetboxIpamModule(module, NB_PREFIXES)
netbox_prefix.run()
if __name__ == "__main__": # pragma: no cover
main()