diff options
| author | omnom62 <omnom62@outlook.com> | 2026-07-10 16:50:38 +1000 |
|---|---|---|
| committer | omnom62 <omnom62@outlook.com> | 2026-07-10 16:50:38 +1000 |
| commit | 1e190aa2d3e8fcafdee25c3ee137fe03eccf6b7c (patch) | |
| tree | 028454cc712e3be6e93df054d561667112d9c38a /plugins/modules | |
| parent | ee7f171c6af8eb5ac37d34d1f58196fb3cb89cf4 (diff) | |
| download | rest.vyos-1e190aa2d3e8fcafdee25c3ee137fe03eccf6b7c.tar.gz rest.vyos-1e190aa2d3e8fcafdee25c3ee137fe03eccf6b7c.zip | |
T8323: vyos_system module
Diffstat (limited to 'plugins/modules')
| -rw-r--r-- | plugins/modules/vyos_system.py | 121 |
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__": |
