diff --git a/docs/vyos.vyos.vyos_nat_module.rst b/docs/vyos.vyos.vyos_nat_module.rst index 648658d4..4657d9f1 100644 --- a/docs/vyos.vyos.vyos_nat_module.rst +++ b/docs/vyos.vyos.vyos_nat_module.rst @@ -1,870 +1,1635 @@ .. _vyos.vyos.vyos_nat_module: ****************** vyos.vyos.vyos_nat ****************** **NAT resource module** Version added: 1.0.0 .. contents:: :local: :depth: 1 Synopsis -------- - This module manages NAT configuration on devices running Vyos Parameters ---------- .. raw:: html - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
ParameterParameter Choices/Defaults Comments
+
config
dictionary
The desired configuration for the NAT resource represented as a dictionary.
+
+ cgnat + +
+ dictionary +
+
+ +
+
+ log_allocation + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
+
+ pool + +
+ dictionary +
+
+ +
+
+ external + +
+ list + / elements=dictionary +
+
+ +
+
+ external_port_range + +
+ string +
+
+ +
+
+ name + +
+ string + / required +
+
+ +
+
+ per_user_limit_port + +
+ integer +
+
+ +
+
+ ranges + +
+ list + / elements=string +
+
+ +
+
+ internal + +
+ list + / elements=dictionary +
+
+ +
+
+ name + +
+ string + / required +
+
+ +
+
+ ranges + +
+ list + / elements=string +
+
+ +
+
+ rule + +
+ list + / elements=dictionary +
+
+ +
+
+ id + +
+ integer + / required +
+
+ +
+
+ source + +
+ dictionary +
+
+ +
+
+ pool + +
+ string +
+
+ +
+
+ translation + +
+ dictionary +
+
+ +
+
+ pool + +
+ string +
+
+ +
+
+ destination + +
+ dictionary +
+
+ +
+
+ rule + +
+ list + / elements=dictionary +
+
+ +
+
+ description + +
+ string +
+
+ +
+
+ destination + +
+ dictionary +
+
+ +
+
+ address + +
+ string +
+
+ +
+
+ disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
+
+ exclude + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
+
+ fqdn + +
+ string +
+
+ +
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
+
+ port + +
+ string +
+
+ +
+
+ protocol + +
+ string +
+
+ +
+
+ id + +
+ integer + / required +
+
+ +
+
+ source + +
+ dictionary +
+
+ +
+
+ rule + +
+ list + / elements=dictionary +
+
+ +
+
+ description + +
+ string +
+
+ +
+
+ destination + +
+ dictionary +
+
+ +
+
+ address + +
+ string +
+
+ +
+
+ id + +
+ integer + / required +
+
+ +
+
+ static + +
+ dictionary +
+
+ +
+
+ rule + +
+ list + / elements=dictionary +
+
+ +
+
+ description + +
+ string +
+
+ +
+
+ id + +
+ integer + / required +
+
+ +
+
+ inbound_interface + +
+ list + / elements=string +
+
+ +
+
+ translation + +
+ dictionary +
+
+ +
+
+ address + +
+ string +
+
+ +
running_config
string
This option is used only with state parsed.
The value of this option should be the output received from the VYOS device by executing the command show configuration commands | grep ntp.
The states replaced and overridden have identical behaviour for this module.
The state parsed reads the configuration from show configuration commands | grep ntp option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
state
string
    Choices:
  • deleted
  • merged ←
  • overridden
  • replaced
  • gathered
  • rendered
  • parsed
The state the configuration should be left in.

Notes ----- .. note:: - Tested against VyOS 1.3.8, 1.4.2, the upcoming 1.5, and the rolling release of spring 2025 - This module works with connection ``network_cli``. Examples -------- .. code-block:: yaml # # ------------------- # # 1. Using merged # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # Task # # ------------- - name: Replace the existing ntp config with the new config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.6.6.0/24 listen_addresses: - 10.1.3.1 servers: - server: 203.0.113.0 options: - prefer # Task output: # ------------- # "after": { # "allow_clients": [ # "10.6.6.0/24" # ], # "listen_addresses": [ # "10.1.3.1" # ], # "servers": [ # { # "server": "ser", # "options": [ # "prefer" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # }, # "changed": true, # "commands": [ # "set service ntp allow-clients address 10.6.6.0/24", # "set service ntp listen-address 10.1.3.1", # "set service ntp server 203.0.113.0 prefer" # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.6.6.0/24' # set service ntp listen-address '10.1.3.1' # set service ntp server 203.0.113.0 prefer, # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 2. Using replaced # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.4.9.0/24' # set service ntp allow-clients address '10.4.7.0/24' # set service ntp allow-clients address '10.1.2.0/24' # set service ntp allow-clients address '10.2.3.0/24' # set service ntp listen-address '10.1.9.16' # set service ntp listen-address '10.5.3.2' # set service ntp listen-address '10.7.9.21' # set service ntp listen-address '10.8.9.4' # set service ntp listen-address '10.4.5.1' # set service ntp server 10.3.6.5 noselect # set service ntp server 10.3.6.5 dynamic # set service ntp server 10.3.6.5 preempt # set service ntp server 10.3.6.5 prefer # set service ntp server server4 noselect # set service ntp server server4 dynamic # set service ntp server server5 # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # Task # # ------------- - name: Replace the existing ntp config with the new config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.6.6.0/24 listen_addresses: - 10.1.3.1 servers: - server: 203.0.113.0 options: - prefer state: replaced # # Task output: # # ------------- # "after": { # "allow_clients": [ # "10.6.6.0/24" # ], # "listen_addresses": [ # "10.1.3.1" # ], # "servers": [ # { # "server": "ser", # "options": [ # "prefer" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # "allow_clients": [ # "10.4.7.0/24", # "10.2.3.0/24", # "10.1.2.0/24", # "10.4.9.0/24" # ], # "listen_addresses": [ # "10.7.9.21", # "10.4.5.1", # "10.5.3.2", # "10.8.9.4", # "10.1.9.16" # ], # "servers": [ # { # "server": "10.3.6.5", # "options": [ # "noselect", # "dynamic", # "preempt", # "prefer" # ] # }, # { # "server": "server4", # "options": [ # "noselect", # "dynamic" # ] # }, # { # "server": "server5" # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "changed": true, # "commands": [ # "delete service ntp allow-clients address 10.4.7.0/24", # "delete service ntp allow-clients address 10.2.3.0/24", # "delete service ntp allow-clients address 10.1.2.0/24", # "delete service ntp allow-clients address 10.4.9.0/24", # "delete service ntp listen-address 10.7.9.21", # "delete service ntp listen-address 10.4.5.1", # "delete service ntp listen-address 10.5.3.2", # "delete service ntp listen-address 10.8.9.4", # "delete service ntp listen-address 10.1.9.16", # "delete service ntp server 10.3.6.5", # "delete service ntp server server4", # "delete service ntp server server5", # "set service ntp allow-clients address 10.6.6.0/24", # "set service ntp listen-address 10.1.3.1", # "set service ntp server 203.0.113.0 prefer" # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.6.6.0/24' # set service ntp listen-address '10.1.3.1' # set service ntp server 203.0.113.0 prefer, # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 3. Using overridden # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.6.6.0/24' # set service ntp listen-address '10.1.3.1' # set service ntp server 203.0.113.0 prefer, # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Override ntp config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.3.3.0/24 listen_addresses: - 10.7.8.1 servers: - server: server1 options: - dynamic - prefer - server: server2 options: - noselect - preempt - server: serv state: overridden # # Task output: # # ------------- # "after": { # "allow_clients": [ # "10.3.3.0/24" # ], # "listen_addresses": [ # "10.7.8.1" # ], # "servers": [ # { # "server": "serv" # }, # { # "server": "server1", # "options": [ # "dynamic", # "prefer" # ] # }, # { # "server": "server2", # "options": [ # "noselect", # "preempt" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # "allow_clients": [ # "10.6.6.0/24" # ], # "listen_addresses": [ # "10.1.3.1" # ], # "servers": [ # { # "server": "ser", # "options": [ # "prefer" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "changed": true, # "commands": [ # "delete service ntp allow-clients address 10.6.6.0/24", # "delete service ntp listen-address 10.1.3.1", # "delete service ntp server ser", # "set service ntp allow-clients address 10.3.3.0/24", # "set service ntp listen-address 10.7.8.1", # "set service ntp server server1 dynamic", # "set service ntp server server1 prefer", # "set service ntp server server2 noselect", # "set service ntp server server2 preempt", # "set service ntp server serv" # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # 4. Using gathered # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Gather ntp config vyos.vyos.vyos_ntp_global: state: gathered # # Task output: # # ------------- # "gathered": { # "allow_clients": [ # "10.3.3.0/24" # ], # "listen_addresses": [ # "10.7.8.1" # ], # "servers": [ # { # "server": "serv" # }, # { # "server": "server1", # "options": [ # "dynamic", # "prefer" # ] # }, # { # "server": "server2", # "options": [ # "noselect", # "preempt" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # } # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 5. Using deleted # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # Task # # ------------- - name: Delete ntp config vyos.vyos.vyos_ntp_global: state: deleted # # Task output: # # ------------- # "after": { # "servers": [ # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # "allow_clients": [ # "10.3.3.0/24" # ], # "listen_addresses": [ # "10.7.8.1" # ], # "servers": [ # { # "server": "serv" # }, # { # "server": "server1", # "options": [ # "dynamic", # "prefer" # ] # }, # { # "server": "server2", # "options": [ # "noselect", # "preempt" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "changed": true, # "commands": [ # "delete service ntp allow-clients", # "delete service ntp listen-address", # "delete service ntp server serv", # "delete service ntp server server1", # "delete service ntp server server2" # # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 6. Using rendered # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Render ntp config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.7.7.0/24 - 10.8.8.0/24 listen_addresses: - 10.7.9.1 servers: - server: server7 - server: server45 options: - noselect - prefer - pool - server: time1.vyos.net - server: time2.vyos.net - server: time3.vyos.net state: rendered # # Task output: # # ------------- # "rendered": [ # "set service ntp allow-clients address 10.7.7.0/24", # "set service ntp allow-clients address 10.8.8.0/24", # "set service ntp listen-address 10.7.9.1", # "set service ntp server server7", # "set service ntp server server45 noselect", # "set service ntp server server45 prefer", # "set service ntp server server45 pool", # "set service ntp server time1.vyos.net", # "set service ntp server time2.vyos.net", # "set service ntp server time3.vyos.net" # ] # # ------------------- # # 7. Using parsed # # ------------------- # # sample_config.cfg: # # ------------- # "set service ntp allow-clients address 10.7.7.0/24", # "set service ntp listen-address 10.7.9.1", # "set service ntp server server45 noselect", # "set service ntp allow-clients addres 10.8.6.0/24", # "set service ntp listen-address 10.5.4.1", # "set service ntp server server45 dynamic", # "set service ntp server time1.vyos.net", # "set service ntp server time2.vyos.net", # "set service ntp server time3.vyos.net" # Task: # ------------- - name: Parse externally provided ntp configuration vyos.vyos.vyos_ntp_global: running_config: "{{ lookup('file', './sample_config.cfg') }}" state: parsed # # Task output: # # ------------- # parsed = { # "allow_clients": [ # "10.7.7.0/24", # "10.8.6.0/24 # ], # "listen_addresses": [ # "10.5.4.1", # "10.7.9.1" # ], # "servers": [ # { # "server": "server45", # "options": [ # "noselect", # "dynamic" # # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # # ] # } Return Values ------------- Common return values are documented `here `_, the following are the fields unique to this module: .. raw:: html
Key Returned Description
after
dictionary
when changed
The resulting configuration after module execution.

Sample:
This output will always be in the same format as the module argspec.
before
dictionary
when state is merged, replaced, overridden, deleted or purged
The configuration prior to the module execution.

Sample:
This output will always be in the same format as the module argspec.
commands
list
when state is merged, replaced, overridden, deleted or purged
The set of commands pushed to the remote device.

Sample:
['set system ntp server server1 dynamic', 'set system ntp server server1 prefer', 'set system ntp server server2 noselect', 'set system ntp server server2 preempt', 'set system ntp server server_add preempt']
gathered
list
when state is gathered
Facts about the network resource gathered from the remote device as structured data.

Sample:
This output will always be in the same format as the module argspec.
parsed
list
when state is parsed
The device native config provided in running_config option parsed into structured data as per module argspec.

Sample:
This output will always be in the same format as the module argspec.
rendered
list
when state is rendered
The provided configuration in the task rendered in device-native format (offline).

Sample:
['set system ntp server server1 dynamic', 'set system ntp server server1 prefer', 'set system ntp server server2 noselect', 'set system ntp server server2 preempt', 'set system ntp server server_add preempt']


Status ------ Authors ~~~~~~~ - Evgeny Molotkov (@omnom62) diff --git a/plugins/module_utils/network/vyos/argspec/nat/nat.py b/plugins/module_utils/network/vyos/argspec/nat/nat.py index ad953b21..d9aac59d 100644 --- a/plugins/module_utils/network/vyos/argspec/nat/nat.py +++ b/plugins/module_utils/network/vyos/argspec/nat/nat.py @@ -1,191 +1,299 @@ # -*- coding: utf-8 -*- # Copyright 2024 Red Hat # 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 ############################################# # WARNING # ############################################# # # This file is auto generated by the # cli_rm_builder. # # Manually editing this file is not advised. # # To update the argspec make the desired changes # in the module docstring and re-run # cli_rm_builder. # ############################################# """ The arg spec for the vyos_nat module """ class NatArgs(object): # pylint: disable=R0903 """The arg spec for the vyos_nat module""" argument_spec = { "config": { "type": "dict", "options": { "cgnat": { "type": "dict", "options": { "log_allocation": { "type": "bool", }, "pool": { "type": "dict", "options": { "external": { "type": "list", "elements": "dict", "options": { "name": { "type": "str", "required": True, }, "external_port_range": { "type": "str", }, "per_user_limit_port": { "type": "int", }, "ranges": { "type": "list", "elements": "str", }, }, }, "internal": { "type": "list", "elements": "dict", "options": { "name": { "type": "str", "required": True, }, "ranges": { "type": "list", "elements": "str", }, }, }, }, }, "rule": { "type": "list", "elements": "dict", "options": { "id": { "type": "int", "required": True, }, "source": { "type": "dict", "options": { "pool": { "type": "str", }, }, }, "translation": { "type": "dict", "options": { "pool": { "type": "str", }, }, }, }, }, }, }, "destination": { "type": "dict", "options": { "rule": { "type": "list", "elements": "dict", "options": { "id": { "type": "int", "required": True, }, "description": { "type": "str", }, "destination": { "type": "dict", "options": { "address": { "type": "str", }, "fqdn": { "type": "str", }, "group": { "type": "dict", "options": { "address-group": { "type": "str", }, "domain-group": { "type": "str", }, "mac-group": { "type": "str", }, "network-group": { "type": "str", }, "port-group": { "type": "str", }, }, }, "port": { "type": "str", }, "protocol": { "type": "str", }, "exclude": { "type": "bool", }, "log": { "type": "bool", }, "disable": { "type": "bool", }, }, }, }, }, }, }, + "source": { + "type": "dict", + "options": { + "rule": { + "type": "list", + "elements": "dict", + "options": { + "id": { + "type": "int", + "required": True, + }, + "description": { + "type": "str", + }, + "destination": { + "type": "dict", + "options": { + "address": { + "type": "str", + }, + "fqdn": { + "type": "str", + }, + "group": { + "type": "dict", + "options": { + "address-group": { + "type": "str", + }, + "domain-group": { + "type": "str", + }, + "mac-group": { + "type": "str", + }, + "network-group": { + "type": "str", + }, + "port-group": { + "type": "str", + }, + }, + }, + "port": { + "type": "str", + }, + "protocol": { + "type": "str", + }, + "exclude": { + "type": "bool", + }, + "log": { + "type": "bool", + }, + "disable": { + "type": "bool", + }, + }, + }, + }, + }, + }, + }, + "static": { + "type": "dict", + "options": { + "rule": { + "type": "list", + "elements": "dict", + "options": { + "id": { + "type": "int", + "required": True, + }, + "description": { + "type": "str", + }, + "destination": { + "type": "dict", + "options": { + "address": { + "type": "str", + }, + }, + }, + "inbound_interface": { + "type": "list", + "elements": "str", + }, + "log": { + "type": "bool", + }, + "disable": { + "type": "bool", + }, + "translation": { + "type": "dict", + "options": { + "address": { + "type": "str", + }, + }, + }, + }, + }, + }, + }, }, }, "running_config": {"type": "str"}, "state": { "type": "str", "choices": [ "deleted", "merged", "overridden", "replaced", "gathered", "rendered", "parsed", ], "default": "merged", }, } # pylint: disable=C0301 diff --git a/plugins/module_utils/network/vyos/rm_templates/nat.py b/plugins/module_utils/network/vyos/rm_templates/nat.py index e35181df..9671ad93 100644 --- a/plugins/module_utils/network/vyos/rm_templates/nat.py +++ b/plugins/module_utils/network/vyos/rm_templates/nat.py @@ -1,419 +1,643 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function __metaclass__ = type import re from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import ( NetworkTemplate, ) class NatTemplate(NetworkTemplate): def __init__(self, lines=None, module=None): prefix = {"set": "set", "remove": "delete"} super(NatTemplate, self).__init__(lines=lines, tmplt=self, prefix=prefix, module=module) # fmt: off PARSERS = [ # # ------------------------- # CGNAT (keep explicit) # ------------------------- # { "name": "cgnat_log_allocation", - "getval": re.compile(r"^set\s+nat\s+cgnat\s+log-allocation$"), + "getval": re.compile( + r""" + ^set + \s+nat + \s+cgnat + \s+log-allocation + $""", + re.VERBOSE, + ), "setval": "nat cgnat log-allocation", "result": {"cgnat": {"log_allocation": True}}, }, { "name": "cgnat_pool_external_range", "getval": re.compile( - r"^set\s+nat\s+cgnat\s+pool\s+external\s+(?P\S+)\s+range\s+(?P\S+)(?:\s+seq\s+(?P\d+))?$", + r""" + ^set + \s+nat + \s+cgnat + \s+pool + \s+external + \s+(?P\S+) + \s+range + \s+(?P\S+)(?:\s+seq\s+(?P\d+))? + $""", + re.VERBOSE, ), "setval": "nat cgnat pool external {{ name }} range {{ range }}{% if seq is defined %} seq {{ seq }}{% endif %}", "result": { "cgnat": { "pool": { "external": [ { "name": "{{ name }}", "ranges": ["{{ range }}"], "seq": "{{ seq }}", }, ], }, }, }, }, { "name": "cgnat_pool_external_port_range", "getval": re.compile( - r"^set\s+nat\s+cgnat\s+pool\s+external\s+(?P\S+)\s+external-port-range\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+cgnat + \s+pool + \s+external + \s+(?P\S+) + \s+external-port-range + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat cgnat pool external {{ name }} external-port-range {{ range }}", "result": { "cgnat": { "pool": { "external": [ { "name": "{{ name }}", "external_port_range": "{{ range }}", }, ], }, }, }, }, { "name": "cgnat_pool_external_per_user", "getval": re.compile( - r"^set\s+nat\s+cgnat\s+pool\s+external\s+(?P\S+)\s+per-user-limit\s+port\s+(?P\d+)$", + r""" + ^set + \s+nat + \s+cgnat + \s+pool + \s+external + \s+(?P\S+) + \s+per-user-limit + \s+port + \s+(?P\d+) + $""", + re.VERBOSE, ), "setval": "nat cgnat pool external {{ name }} per-user-limit port {{ limit }}", "result": { "cgnat": { "pool": { "external": [ { "name": "{{ name }}", "per_user_limit_port": "{{ limit }}", }, ], }, }, }, }, { "name": "cgnat_pool_internal_range", "getval": re.compile( - r"^set\s+nat\s+cgnat\s+pool\s+internal\s+(?P\S+)\s+range\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+cgnat + \s+pool + \s+internal + \s+(?P\S+) + \s+range + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat cgnat pool internal {{ name }} range {{ range }}", "result": { "cgnat": { "pool": { "internal": [ { "name": "{{ name }}", "ranges": ["{{ range }}"], }, ], }, }, }, }, { "name": "cgnat_rule_source_pool", "getval": re.compile( - r"^set\s+nat\s+cgnat\s+rule\s+(?P\d+)\s+source\s+pool\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+cgnat + \s+rule + \s+(?P\d+) + \s+source + \s+pool + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat cgnat rule {{ id }} source pool {{ pool }}", "result": { "cgnat": { "rule": [ { "id": "{{ id }}", "source": {"pool": "{{ pool }}"}, }, ], }, }, }, { "name": "cgnat_rule_translation_pool", "getval": re.compile( - r"^set\s+nat\s+cgnat\s+rule\s+(?P\d+)\s+translation\s+pool\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+cgnat + \s+rule + \s+(?P\d+) + \s+translation + \s+pool + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat cgnat rule {{ id }} translation pool {{ pool }}", "result": { "cgnat": { "rule": [ { "id": "{{ id }}", "translation": {"pool": "{{ pool }}"}, }, ], }, }, }, # # ------------------------- # GENERIC NAT (destination/source/static) # ------------------------- # # description { "name": "nat_type_description", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+description\s+(?P.+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+description + \s+(?P.+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} description {{ description }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": {"description": "{{ description }}"}, }, }, }, }, # protocol { "name": "nat_type_protocol", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+protocol\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+protocol + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} protocol {{ protocol }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": {"protocol": "{{ protocol }}"}, }, }, }, }, # flags { "name": "nat_type_disable", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+disable$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+disable + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} disable", "result": {"{{ type }}": {"rule": {"{{ rule }}": {"disable": True}}}}, }, { "name": "nat_type_exclude", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+exclude$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+exclude + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} exclude", "result": {"{{ type }}": {"rule": {"{{ rule }}": {"exclude": True}}}}, }, { "name": "nat_type_log", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+log$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+log + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} log", "result": {"{{ type }}": {"rule": {"{{ rule }}": {"log": True}}}}, }, # address (destination/source) { "name": "nat_type_address", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+(?Pdestination|source)\s+address\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+(?Pdestination|source) + \s+address + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} {{ atype }} address {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "{{ atype }}": {"address": "{{ value }}"}, }, }, }, }, }, # fqdn { "name": "nat_type_fqdn", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+(?Pdestination|source)\s+fqdn\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+(?Pdestination|source) + \s+fqdn + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} {{ atype }} fqdn {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "{{ atype }}": {"fqdn": "{{ value }}"}, }, }, }, }, }, # port { "name": "nat_type_port", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+(?Pdestination|source)\s+port\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+(?Pdestination|source) + \s+port + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} {{ atype }} port {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "{{ atype }}": {"port": "{{ value }}"}, }, }, }, }, }, # translation address { "name": "nat_type_translation_address", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+translation\s+address\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+translation + \s+address + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} translation address {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "translation": {"address": "{{ value }}"}, }, }, }, }, }, # translation port { "name": "nat_type_translation_port", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+translation\s+port\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+translation + \s+port + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} translation port {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "translation": {"port": "{{ value }}"}, }, }, }, }, }, # inbound interface { "name": "nat_type_inbound_interface", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source|static)\s+rule\s+(?P\S+)\s+inbound-interface\s+(?Pgroup|name)\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source|static) + \s+rule + \s+(?P\S+) + \s+inbound-interface + \s+(?Pgroup|name) + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} inbound-interface {{ mode }} {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "inbound_interface": { "{{ mode }}": "{{ value }}", }, }, }, }, }, }, # packet type { "name": "nat_type_packet_type", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+packet-type\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+packet-type + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} packet-type {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": {"packet_type": "{{ value }}"}, }, }, }, }, # load balance backend { "name": "nat_type_lb_backend", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+load-balance\s+backend\s+(?P\S+)\s+weight\s+(?P\d+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+load-balance + \s+backend + \s+(?P\S+) + \s+weight + \s+(?P\d+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} load-balance backend {{ ip }} weight {{ weight }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "load_balance": { "backend": { "ip": "{{ ip }}", "weight": "{{ weight }}", }, }, }, }, }, }, }, # load balance hash { "name": "nat_type_lb_hash", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+load-balance\s+hash\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+load-balance + \s+hash + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} load-balance hash {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "load_balance": {"hash": "{{ value }}"}, }, }, }, }, }, # translation options { "name": "nat_type_translation_options", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+translation\s+options\s+(?Paddress-mapping|port-mapping)\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+translation + \s+options + \s+(?Paddress-mapping|port-mapping) + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} translation options {{ opt }} {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "translation": { "options": { "{{ opt }}": "{{ value }}", }, }, }, }, }, }, }, # redirect port { "name": "nat_type_translation_redirect", "getval": re.compile( - r"^set\s+nat\s+(?Pdestination|source)\s+rule\s+(?P\S+)\s+translation\s+redirect\s+port\s+(?P\S+)$", + r""" + ^set + \s+nat + \s+(?Pdestination|source) + \s+rule + \s+(?P\S+) + \s+translation + \s+redirect + \s+port + \s+(?P\S+) + $""", + re.VERBOSE, ), "setval": "nat {{ type }} rule {{ rule }} translation redirect port {{ value }}", "result": { "{{ type }}": { "rule": { "{{ rule }}": { "translation": { "redirect_port": "{{ value }}", }, }, }, }, }, }, ] # fmt: on diff --git a/plugins/modules/vyos_nat.py b/plugins/modules/vyos_nat.py index a6f99a0b..6be371c3 100644 --- a/plugins/modules/vyos_nat.py +++ b/plugins/modules/vyos_nat.py @@ -1,778 +1,893 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # Copyright 2024 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) """ The module file for vyos_nat """ from __future__ import absolute_import, division, print_function __metaclass__ = type DOCUMENTATION = """ module: vyos_nat version_added: 1.0.0 short_description: NAT resource module description: - This module manages NAT configuration on devices running Vyos author: - Evgeny Molotkov (@omnom62) notes: - Tested against VyOS 1.3.8, 1.4.2, the upcoming 1.5, and the rolling release of spring 2025 - This module works with connection C(network_cli). options: config: description: - The desired configuration for the NAT resource represented as a dictionary. type: dict - + suboptions: + cgnat: + type: dict + suboptions: + log_allocation: + type: bool + pool: + type: dict + suboptions: + external: + type: list + elements: dict + suboptions: + name: + type: str + required: true + external_port_range: + type: str + per_user_limit_port: + type: int + ranges: + type: list + elements: str + internal: + type: list + elements: dict + suboptions: + name: + type: str + required: true + ranges: + type: list + elements: str + rule: + type: list + elements: dict + suboptions: + id: + type: int + required: true + source: + type: dict + suboptions: + pool: + type: str + translation: + type: dict + suboptions: + pool: + type: str + destination: + type: dict + suboptions: + rule: + type: list + elements: dict + suboptions: + id: + type: int + required: true + description: + type: str + destination: + type: dict + suboptions: + address: + type: str + fqdn: + type: str + port: + type: str + protocol: + type: str + exclude: + type: bool + log: + type: bool + disable: + type: bool + source: + type: dict + suboptions: + rule: + type: list + elements: dict + suboptions: + id: + type: int + required: true + description: + type: str + destination: + type: dict + suboptions: + address: + type: str + static: + type: dict + suboptions: + rule: + type: list + elements: dict + suboptions: + id: + type: int + required: true + description: + type: str + inbound_interface: + type: list + elements: str + translation: + type: dict + suboptions: + address: + type: str running_config: description: - This option is used only with state I(parsed). - The value of this option should be the output received from the VYOS device by executing the command B(show configuration commands | grep ntp). - The states I(replaced) and I(overridden) have identical behaviour for this module. - The state I(parsed) reads the configuration from C(show configuration commands | grep ntp) option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the I(parsed) key within the result. type: str state: description: - The state the configuration should be left in. type: str choices: - deleted - merged - overridden - replaced - gathered - rendered - parsed default: merged """ EXAMPLES = """ # # ------------------- # # 1. Using merged # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # Task # # ------------- - name: Replace the existing ntp config with the new config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.6.6.0/24 listen_addresses: - 10.1.3.1 servers: - server: 203.0.113.0 options: - prefer # Task output: # ------------- # "after": { # "allow_clients": [ # "10.6.6.0/24" # ], # "listen_addresses": [ # "10.1.3.1" # ], # "servers": [ # { # "server": "ser", # "options": [ # "prefer" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # }, # "changed": true, # "commands": [ # "set service ntp allow-clients address 10.6.6.0/24", # "set service ntp listen-address 10.1.3.1", # "set service ntp server 203.0.113.0 prefer" # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.6.6.0/24' # set service ntp listen-address '10.1.3.1' # set service ntp server 203.0.113.0 prefer, # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 2. Using replaced # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.4.9.0/24' # set service ntp allow-clients address '10.4.7.0/24' # set service ntp allow-clients address '10.1.2.0/24' # set service ntp allow-clients address '10.2.3.0/24' # set service ntp listen-address '10.1.9.16' # set service ntp listen-address '10.5.3.2' # set service ntp listen-address '10.7.9.21' # set service ntp listen-address '10.8.9.4' # set service ntp listen-address '10.4.5.1' # set service ntp server 10.3.6.5 noselect # set service ntp server 10.3.6.5 dynamic # set service ntp server 10.3.6.5 preempt # set service ntp server 10.3.6.5 prefer # set service ntp server server4 noselect # set service ntp server server4 dynamic # set service ntp server server5 # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # Task # # ------------- - name: Replace the existing ntp config with the new config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.6.6.0/24 listen_addresses: - 10.1.3.1 servers: - server: 203.0.113.0 options: - prefer state: replaced # # Task output: # # ------------- # "after": { # "allow_clients": [ # "10.6.6.0/24" # ], # "listen_addresses": [ # "10.1.3.1" # ], # "servers": [ # { # "server": "ser", # "options": [ # "prefer" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # "allow_clients": [ # "10.4.7.0/24", # "10.2.3.0/24", # "10.1.2.0/24", # "10.4.9.0/24" # ], # "listen_addresses": [ # "10.7.9.21", # "10.4.5.1", # "10.5.3.2", # "10.8.9.4", # "10.1.9.16" # ], # "servers": [ # { # "server": "10.3.6.5", # "options": [ # "noselect", # "dynamic", # "preempt", # "prefer" # ] # }, # { # "server": "server4", # "options": [ # "noselect", # "dynamic" # ] # }, # { # "server": "server5" # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "changed": true, # "commands": [ # "delete service ntp allow-clients address 10.4.7.0/24", # "delete service ntp allow-clients address 10.2.3.0/24", # "delete service ntp allow-clients address 10.1.2.0/24", # "delete service ntp allow-clients address 10.4.9.0/24", # "delete service ntp listen-address 10.7.9.21", # "delete service ntp listen-address 10.4.5.1", # "delete service ntp listen-address 10.5.3.2", # "delete service ntp listen-address 10.8.9.4", # "delete service ntp listen-address 10.1.9.16", # "delete service ntp server 10.3.6.5", # "delete service ntp server server4", # "delete service ntp server server5", # "set service ntp allow-clients address 10.6.6.0/24", # "set service ntp listen-address 10.1.3.1", # "set service ntp server 203.0.113.0 prefer" # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.6.6.0/24' # set service ntp listen-address '10.1.3.1' # set service ntp server 203.0.113.0 prefer, # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 3. Using overridden # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.6.6.0/24' # set service ntp listen-address '10.1.3.1' # set service ntp server 203.0.113.0 prefer, # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Override ntp config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.3.3.0/24 listen_addresses: - 10.7.8.1 servers: - server: server1 options: - dynamic - prefer - server: server2 options: - noselect - preempt - server: serv state: overridden # # Task output: # # ------------- # "after": { # "allow_clients": [ # "10.3.3.0/24" # ], # "listen_addresses": [ # "10.7.8.1" # ], # "servers": [ # { # "server": "serv" # }, # { # "server": "server1", # "options": [ # "dynamic", # "prefer" # ] # }, # { # "server": "server2", # "options": [ # "noselect", # "preempt" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # "allow_clients": [ # "10.6.6.0/24" # ], # "listen_addresses": [ # "10.1.3.1" # ], # "servers": [ # { # "server": "ser", # "options": [ # "prefer" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "changed": true, # "commands": [ # "delete service ntp allow-clients address 10.6.6.0/24", # "delete service ntp listen-address 10.1.3.1", # "delete service ntp server ser", # "set service ntp allow-clients address 10.3.3.0/24", # "set service ntp listen-address 10.7.8.1", # "set service ntp server server1 dynamic", # "set service ntp server server1 prefer", # "set service ntp server server2 noselect", # "set service ntp server server2 preempt", # "set service ntp server serv" # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # 4. Using gathered # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Gather ntp config vyos.vyos.vyos_ntp_global: state: gathered # # Task output: # # ------------- # "gathered": { # "allow_clients": [ # "10.3.3.0/24" # ], # "listen_addresses": [ # "10.7.8.1" # ], # "servers": [ # { # "server": "serv" # }, # { # "server": "server1", # "options": [ # "dynamic", # "prefer" # ] # }, # { # "server": "server2", # "options": [ # "noselect", # "preempt" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # } # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 5. Using deleted # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp allow-clients address '10.3.3.0/24' # set service ntp listen-address '10.7.8.1' # set service ntp server serv # set service ntp server server1 dynamic # set service ntp server server1 prefer # set service ntp server server2 noselect # set service ntp server server2 preempt # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # Task # # ------------- - name: Delete ntp config vyos.vyos.vyos_ntp_global: state: deleted # # Task output: # # ------------- # "after": { # "servers": [ # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "before": { # "allow_clients": [ # "10.3.3.0/24" # ], # "listen_addresses": [ # "10.7.8.1" # ], # "servers": [ # { # "server": "serv" # }, # { # "server": "server1", # "options": [ # "dynamic", # "prefer" # ] # }, # { # "server": "server2", # "options": [ # "noselect", # "preempt" # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # ] # }, # "changed": true, # "commands": [ # "delete service ntp allow-clients", # "delete service ntp listen-address", # "delete service ntp server serv", # "delete service ntp server server1", # "delete service ntp server server2" # # ] # After state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # # ------------------- # # 6. Using rendered # # ------------------- # # Before state: # # ------------- # vyos@vyos:~$ show configuration commands | grep ntp # set service ntp server time1.vyos.net # set service ntp server time2.vyos.net # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Render ntp config vyos.vyos.vyos_ntp_global: config: allow_clients: - 10.7.7.0/24 - 10.8.8.0/24 listen_addresses: - 10.7.9.1 servers: - server: server7 - server: server45 options: - noselect - prefer - pool - server: time1.vyos.net - server: time2.vyos.net - server: time3.vyos.net state: rendered # # Task output: # # ------------- # "rendered": [ # "set service ntp allow-clients address 10.7.7.0/24", # "set service ntp allow-clients address 10.8.8.0/24", # "set service ntp listen-address 10.7.9.1", # "set service ntp server server7", # "set service ntp server server45 noselect", # "set service ntp server server45 prefer", # "set service ntp server server45 pool", # "set service ntp server time1.vyos.net", # "set service ntp server time2.vyos.net", # "set service ntp server time3.vyos.net" # ] # # ------------------- # # 7. Using parsed # # ------------------- # # sample_config.cfg: # # ------------- # "set service ntp allow-clients address 10.7.7.0/24", # "set service ntp listen-address 10.7.9.1", # "set service ntp server server45 noselect", # "set service ntp allow-clients addres 10.8.6.0/24", # "set service ntp listen-address 10.5.4.1", # "set service ntp server server45 dynamic", # "set service ntp server time1.vyos.net", # "set service ntp server time2.vyos.net", # "set service ntp server time3.vyos.net" # Task: # ------------- - name: Parse externally provided ntp configuration vyos.vyos.vyos_ntp_global: running_config: "{{ lookup('file', './sample_config.cfg') }}" state: parsed # # Task output: # # ------------- # parsed = { # "allow_clients": [ # "10.7.7.0/24", # "10.8.6.0/24 # ], # "listen_addresses": [ # "10.5.4.1", # "10.7.9.1" # ], # "servers": [ # { # "server": "server45", # "options": [ # "noselect", # "dynamic" # # ] # }, # { # "server": "time1.vyos.net" # }, # { # "server": "time2.vyos.net" # }, # { # "server": "time3.vyos.net" # } # # ] # } """ RETURN = """ before: description: The configuration prior to the module execution. returned: when I(state) is C(merged), C(replaced), C(overridden), C(deleted) or C(purged) type: dict sample: > This output will always be in the same format as the module argspec. after: description: The resulting configuration after module execution. returned: when changed type: dict sample: > This output will always be in the same format as the module argspec. commands: description: The set of commands pushed to the remote device. returned: when I(state) is C(merged), C(replaced), C(overridden), C(deleted) or C(purged) type: list sample: - set system ntp server server1 dynamic - set system ntp server server1 prefer - set system ntp server server2 noselect - set system ntp server server2 preempt - set system ntp server server_add preempt rendered: description: The provided configuration in the task rendered in device-native format (offline). returned: when I(state) is C(rendered) type: list sample: - set system ntp server server1 dynamic - set system ntp server server1 prefer - set system ntp server server2 noselect - set system ntp server server2 preempt - set system ntp server server_add preempt gathered: description: Facts about the network resource gathered from the remote device as structured data. returned: when I(state) is C(gathered) type: list sample: > This output will always be in the same format as the module argspec. parsed: description: The device native config provided in I(running_config) option parsed into structured data as per module argspec. returned: when I(state) is C(parsed) type: list sample: > This output will always be in the same format as the module argspec. """ from ansible.module_utils.basic import AnsibleModule from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.nat.nat import ( NatArgs, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.nat.nat import ( Nat, ) def main(): """ Main entry point for module execution :returns: the result form module invocation """ module = AnsibleModule( argument_spec=NatArgs.argument_spec, mutually_exclusive=[["config", "running_config"]], required_if=[ ["state", "merged", ["config"]], ["state", "replaced", ["config"]], ["state", "overridden", ["config"]], ["state", "rendered", ["config"]], ["state", "parsed", ["running_config"]], ], supports_check_mode=True, ) result = Nat(module).execute_module() module.exit_json(**result) if __name__ == "__main__": main()