summaryrefslogtreecommitdiff
path: root/plugins/modules
diff options
context:
space:
mode:
authoromnom62 <omnom62@outlook.com>2026-07-10 16:50:38 +1000
committeromnom62 <omnom62@outlook.com>2026-07-10 16:50:38 +1000
commit1e190aa2d3e8fcafdee25c3ee137fe03eccf6b7c (patch)
tree028454cc712e3be6e93df054d561667112d9c38a /plugins/modules
parentee7f171c6af8eb5ac37d34d1f58196fb3cb89cf4 (diff)
downloadrest.vyos-1e190aa2d3e8fcafdee25c3ee137fe03eccf6b7c.tar.gz
rest.vyos-1e190aa2d3e8fcafdee25c3ee137fe03eccf6b7c.zip
T8323: vyos_system module
Diffstat (limited to 'plugins/modules')
-rw-r--r--plugins/modules/vyos_system.py121
1 files changed, 26 insertions, 95 deletions
diff --git a/plugins/modules/vyos_system.py b/plugins/modules/vyos_system.py
index a7f7d09..474a804 100644
--- a/plugins/modules/vyos_system.py
+++ b/plugins/modules/vyos_system.py
@@ -12,29 +12,24 @@ module: vyos_system
short_description: Manage system settings on VyOS devices using REST API
description:
- Manages basic system settings on VyOS devices via the REST API.
- - Covers hostname, domain name, name servers, and domain search.
- Uses REST API (C(connection=httpapi)) instead of CLI.
version_added: "1.0.0"
author:
- VyOS Community (@vyos)
options:
host_name:
- description:
- - Device hostname.
+ description: Device hostname.
type: str
domain_name:
- description:
- - Device domain name.
+ description: Device domain name.
type: str
name_server:
- description:
- - List of DNS name servers.
+ description: List of DNS name servers.
type: list
elements: str
aliases: [name_servers]
domain_search:
- description:
- - List of domain search suffixes.
+ description: List of domain search suffixes.
type: list
elements: str
state:
@@ -54,22 +49,11 @@ EXAMPLES = r"""
vyos.rest.vyos_system:
host_name: router1
domain_name: example.com
- state: present
-
-- name: Configure name servers
- vyos.rest.vyos_system:
name_server:
- 8.8.8.8
- 8.8.4.4
state: present
-- name: Configure domain search
- vyos.rest.vyos_system:
- domain_search:
- - sub1.example.com
- - sub2.example.com
- state: present
-
- name: Remove domain name and name servers
vyos.rest.vyos_system:
domain_name: example.com
@@ -80,11 +64,11 @@ EXAMPLES = r"""
RETURN = r"""
before:
- description: System configuration before this module ran.
+ description: Module-owned system configuration before this module ran.
returned: always
type: dict
after:
- description: System configuration after this module ran.
+ description: Module-owned system configuration after this module ran.
returned: when changed
type: dict
commands:
@@ -102,71 +86,15 @@ response:
"""
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.vyos.rest.plugins.module_utils.vyos import VyOSModule
+from ansible_collections.vyos.rest.plugins.module_utils.vyos import (
+ VyOSModule,
+ dict_op,
+ owned_config,
+)
_BASE = ["system"]
-
-def _to_list(val):
- if val is None:
- return []
- if isinstance(val, list):
- return val
- return [val]
-
-
-def get_running_config(vyos):
- raw = vyos.get_config(_BASE)
- if not raw or not isinstance(raw, dict):
- return {}
- result = {}
- if "host-name" in raw:
- result["host_name"] = raw["host-name"]
- if "domain-name" in raw:
- result["domain_name"] = raw["domain-name"]
- if "name-server" in raw:
- result["name_server"] = _to_list(raw["name-server"])
- if "domain-search" in raw:
- result["domain_search"] = _to_list(raw["domain-search"])
- return result
-
-
-def build_commands(config, have, state):
- cmds = []
-
- if state == "absent":
- if config.get("host_name") and have.get("host_name"):
- cmds.append(("delete", _BASE + ["host-name"]))
- if config.get("domain_name") and have.get("domain_name"):
- cmds.append(("delete", _BASE + ["domain-name"]))
- for ns in config.get("name_server") or []:
- if ns in (have.get("name_server") or []):
- cmds.append(("delete", _BASE + ["name-server", ns]))
- for ds in config.get("domain_search") or []:
- if ds in (have.get("domain_search") or []):
- cmds.append(("delete", _BASE + ["domain-search", ds]))
- return cmds
-
- # state == "present"
- if config.get("host_name") and config["host_name"] != have.get("host_name"):
- cmds.append(("set", _BASE + ["host-name", config["host_name"]]))
- if config.get("domain_name") and config["domain_name"] != have.get("domain_name"):
- cmds.append(("set", _BASE + ["domain-name", config["domain_name"]]))
-
- have_ns = set(have.get("name_server") or [])
- for ns in config.get("name_server") or []:
- if ns not in have_ns:
- cmds.append(("set", _BASE + ["name-server", ns]))
-
- have_ds = set(have.get("domain_search") or [])
- for ds in config.get("domain_search") or []:
- if ds not in have_ds:
- cmds.append(("set", _BASE + ["domain-search", ds]))
-
- return cmds
-
-
ARGUMENT_SPEC = dict(
host_name=dict(type="str"),
domain_name=dict(type="str"),
@@ -181,33 +109,36 @@ def main():
vyos = VyOSModule(module)
state = module.params["state"]
- config = {
- "host_name": module.params.get("host_name"),
- "domain_name": module.params.get("domain_name"),
- "name_server": module.params.get("name_server"),
- "domain_search": module.params.get("domain_search"),
- }
- have = get_running_config(vyos)
+ # want: snake_case keys from YAML, nulls removed
+ want = {k: v for k, v in module.params.items() if k != "state" and v is not None}
+
+ # have: raw kebab-case keys from device, scoped by _BASE
+ have = vyos.get_config(_BASE)
+
+ # before/after: only keys owned by this module (declared in argspec)
+ before = owned_config(have, ARGUMENT_SPEC)
- commands = build_commands(config, have, state)
+ op = "set" if state == "present" else "delete"
+ commands = dict_op(want, have, _BASE, op=op)
if module.check_mode:
- module.exit_json(changed=bool(commands), commands=commands, before=have)
+ module.exit_json(changed=bool(commands), commands=commands, before=before)
if commands:
response = vyos.apply_commands(commands)
saved = vyos.save_config()
+ after = owned_config(vyos.get_config(_BASE), ARGUMENT_SPEC)
module.exit_json(
changed=True,
- before=have,
- after=get_running_config(vyos),
+ before=before,
+ after=after,
commands=commands,
saved=saved,
response=response,
)
- module.exit_json(changed=False, before=have, after=have, commands=[])
+ module.exit_json(changed=False, before=before, after=before, commands=[])
if __name__ == "__main__":