Compare commits

...

31 commits
3.6.0 ... main

Author SHA1 Message Date
Jefferson Raylan
7395011b0c
fix: Fix pattern to handle long system identity (#386)
Some checks failed
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Build Ansible Docs (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
* fix: Fix pattern to handle long system identity names

When the system identity string is too long, the terminal output may be
truncated. The truncated output is marked by multiple carriage returns
(`\r`) and a `<` symbol.

This is a example of a truncated output:
`\r\n\r\r\r\r<MY_VERYVERY-LONG-SYSTEM-IDENTIY-NAME] > `

The existing regex failed to match these truncated prompts.
This update introduces a more flexible regex that matches both, the truncated and the preserved output.

* add change-log fragment for pr 386

* refactoring change-log fragment for pr 386

* Update changelogs/fragments/386-fix-pattern-to-handle-long-identity.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
2025-07-31 22:02:47 +02:00
Felix Fontein
8edc8018a7
Ansible-core devel EE: use Python 3.12. (#387)
Some checks are pending
Collection Docs / Build Ansible Docs (push) Waiting to run
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
2025-07-31 07:18:42 +02:00
Felix Fontein
e78df4a4cf Prepare 3.9.0.
Some checks failed
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Build Ansible Docs (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-07-28 22:35:44 +02:00
Michael Jenny
c9d15bc43a
OVPN server accepts now multiple items (RouterOS >= 7.17) (#383)
* Since RouterOS 7.17 VRF is supported for OVPN server. It now supports
multiple entries and single-value is now obsolete. This demands for a
versioned API.

* Add change fragment

* Add change fragment

* add license field

* Update changelogs/fragments/385-vrf-support-for-ovpn-server

Co-authored-by: Felix Fontein <felix@fontein.de>

* rename

* remove license field

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
2025-07-28 22:34:15 +02:00
Tr4sK
008b5f893a
Update logging action fields for ROS 7.18 (#381)
* Update logging action fields for ROS 7.18

* Add changelog fragment

* Update changelogs/fragments/381-logging-cef.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
2025-07-28 22:33:40 +02:00
hansmi
b70b4a72b3
Set mangle passthrough default for RouterOS 7.19 (#382)
The behaviour of the `passthrough` property in `ip/firewall/mangle` has
changed in RouterOS 7.19:

```
*) firewall - always show "passthrough" when exporting mangle table;
```

Per the documentation at [1] the default is `true`.

[1] https://help.mikrotik.com/docs/spaces/ROS/pages/48660587/Mangle
2025-07-28 22:33:24 +02:00
hansmi
1f38be9e56
Update IPv6 settings fields for RouterOS 7.17/7.18 (#380)
From the RouterOS 7.17 changelog:

*) ipv6 - added IPv6 settings related to stale IPv6 neighbor cleanup;
*) ipv6 - added support for manual link-local address configuration;

And from the RouterOS 7.18 changelog:

*) ipv6 - added FastTrack support;
*) ipv6 - added support for neighbor removal and static entries;

The change also removes the default value for the `max-neighbor-entries`
field. It's documented to vary depending on the RAM size.
2025-07-28 22:33:11 +02:00
Felix Fontein
e988b18acf Normalize changelog configs.
Some checks are pending
Collection Docs / Build Ansible Docs (push) Waiting to run
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
2025-07-27 16:35:29 +02:00
Felix Fontein
6e9d2e1379 Release 3.8.1.
Some checks are pending
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
Collection Docs / Build Ansible Docs (push) Waiting to run
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
2025-07-26 14:38:22 +02:00
Felix Fontein
1c182725ce
Prevent deprecation warnings when using ansible-core 2.19. (#385)
Some checks are pending
Collection Docs / Build Ansible Docs (push) Waiting to run
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
2025-07-25 22:26:39 +02:00
Felix Fontein
9099fcd698 Prepare 3.8.1. 2025-07-25 22:19:29 +02:00
Felix Fontein
852e21a2f2
Move EE tests to antsibull-nox. (#384)
Some checks are pending
Collection Docs / Build Ansible Docs (push) Waiting to run
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
2025-07-25 18:59:28 +02:00
Felix Fontein
bb7eadbc9f Avoid tabs.
Some checks failed
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-07-06 18:05:28 +02:00
Felix Fontein
d9be02bdb8 Adjust README.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-07-01 22:34:37 +02:00
Felix Fontein
3475751b30
Add stable-2.19 to CI; add ignore-2.20.txt (#378)
Some checks are pending
Collection Docs / Build Ansible Docs (push) Waiting to run
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Waiting to run
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Waiting to run
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
* Add ignore-2.20.txt.

* Restrict stable-2.19 versions.
2025-07-01 07:24:51 +02:00
Felix Fontein
6008397375 Add linting check for RST code blocks.
Some checks failed
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-06-18 21:48:53 +02:00
Felix Fontein
b751d79a98 Update yamllint config, fix YAML.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-06-17 07:19:14 +02:00
Felix Fontein
aa83116c78 Release 3.8.0.
Some checks failed
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-06-14 16:49:40 +02:00
Felix Fontein
4571d777de Prepare 3.8.0.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-06-13 08:11:36 +02:00
Michael Jenny
c7b2275f2c
Support RouterOS path /interface ethernet switch port-isolation and /routing bfd configuration (#375)
* Update _api_data.py

Add /interface/bridge property "port-cost-mode" which is supported since RouterOS 7.13.

See changelog for details: https://mikrotik.com/download/changelogs

* Create 371-add-bridge-port-cost-mode.yml

* Update changelogs/fragments/371-add-bridge-port-cost-mode.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Support for /interface ethernet switch port-isolation
  RouterOS has supported the /interface ethernet switch port-isolation path since version 6.43.
  This feature enables hardware offloaded Layer‑2 port isolation on supported switch chips

Support for /routing bfd configuration
  Since RouterOS 7.11 it supports stable bfd support.
  See: https://iparchitechs.com/mikrotik-routeros-v7-11-stable-released/

* .

* Add change file

* attr order

* Add name to fields

* PEP8

* Update changelogs/fragments/375-port_isolation-and-routing_bfd_configuration.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update changelogs/fragments/375-port_isolation-and-routing_bfd_configuration.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
Co-authored-by: Michael Jenny <mjenny@ansible.zvcloud.de>
2025-06-13 08:10:37 +02:00
SdVSysAdmin
49e4b83594
support for 'ip ipsec mode-config' (#376)
* Added support for 'ip ipsec mode-config'

* Create 376-ipsec-mode-config.yml

---------

Co-authored-by: Laurent Papier <papier@sdv.fr>
2025-06-13 08:10:27 +02:00
Felix Fontein
88806047e3 Enable no-trailing-whitespace test.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-06-04 15:19:28 +02:00
Felix Fontein
221a697af9 Release 3.7.0.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-05-31 16:57:51 +02:00
Felix Fontein
ab1026504c
Allow to ignore dynamic and builtin entries. (#373) 2025-05-31 16:50:52 +02:00
Felix Fontein
bfd6b0bb13 Prepare 3.7.0.
Some checks failed
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-05-29 14:59:45 +02:00
Michael Jenny
f5b952751e
Update _api_data.py (#371)
* Update _api_data.py

Add /interface/bridge property "port-cost-mode" which is supported since RouterOS 7.13.

See changelog for details: https://mikrotik.com/download/changelogs

* Create 371-add-bridge-port-cost-mode.yml

* Update changelogs/fragments/371-add-bridge-port-cost-mode.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
2025-05-29 14:58:38 +02:00
Felix Fontein
5b81c157fe Add reformat commit to .git-blame-ignore-revs.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-04-26 12:22:44 +02:00
Felix Fontein
08152376de Fix linting errors. 2025-04-26 12:18:29 +02:00
Felix Fontein
3af45c33f1 Add yamllint to antsibull-nox and add config files. 2025-04-26 12:18:29 +02:00
Felix Fontein
e52978b6d2 Fix info on blanket license statement for changelog fragments.
Some checks failed
Collection Docs / Build Ansible Docs (push) Has been cancelled
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Has been cancelled
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled
nox / ansible-test (push) Has been cancelled
Collection Docs / Publish Ansible Docs (push) Has been cancelled
2025-04-24 22:48:23 +02:00
Felix Fontein
d1db4bec92
Adjust EE tests. (#366)
Some checks are pending
Collection Docs / Build Ansible Docs (push) Waiting to run
Collection Docs / Publish Ansible Docs (push) Blocked by required conditions
execution environment / Build and test EE (ansible-core devel @ RHEL UBI 9) (push) Waiting to run
execution environment / Build and test EE (ansible-core 2.15 @ Rocky Linux 9) (push) Waiting to run
nox / Run extra sanity tests (push) Waiting to run
nox / ansible-test (push) Waiting to run
2025-04-24 20:38:56 +02:00
43 changed files with 902 additions and 429 deletions

6
.git-blame-ignore-revs Normal file
View file

@ -0,0 +1,6 @@
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# Reformat YAML: https://github.com/ansible-collections/community.routeros/pull/369
08152376de116e7d933d19ee25318f7a2eb222ae

View file

@ -7,7 +7,7 @@ name: Collection Docs
concurrency:
group: docs-pr-${{ github.head_ref }}
cancel-in-progress: true
on:
'on':
pull_request_target:
types: [opened, synchronize, reopened, closed]

View file

@ -7,7 +7,7 @@ name: Collection Docs
concurrency:
group: docs-push-${{ github.sha }}
cancel-in-progress: true
on:
'on':
push:
branches:
- main

View file

@ -1,159 +0,0 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
name: execution environment
on:
# Run CI against all pushes (direct commits, also merged PRs), Pull Requests
push:
branches:
- main
- stable-*
pull_request:
# Run CI once per day (at 05:15 UTC)
# This ensures that even if there haven't been commits that we are still testing against latest version of ansible-builder
schedule:
- cron: '15 5 * * *'
env:
NAMESPACE: community
COLLECTION_NAME: routeros
jobs:
build:
name: Build and test EE (${{ matrix.name }})
strategy:
fail-fast: false
matrix:
name:
- ''
ansible_core:
- ''
ansible_runner:
- ''
base_image:
- ''
pre_base:
- ''
extra_vars:
- ''
other_deps:
- ''
exclude:
- ansible_core: ''
include:
- name: ansible-core devel @ RHEL UBI 9
ansible_core: https://github.com/ansible/ansible/archive/devel.tar.gz
ansible_runner: ansible-runner
other_deps: |2
python_interpreter:
package_system: python3.11 python3.11-pip python3.11-wheel python3.11-cryptography
python_path: "/usr/bin/python3.11"
base_image: docker.io/redhat/ubi9:latest
pre_base: '"#"'
- name: ansible-core 2.15 @ Rocky Linux 9
ansible_core: https://github.com/ansible/ansible/archive/stable-2.15.tar.gz
ansible_runner: ansible-runner
base_image: quay.io/rockylinux/rockylinux:9
pre_base: '"#"'
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
with:
path: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install ansible-builder and ansible-navigator
run: pip install ansible-builder ansible-navigator
- name: Verify requirements
run: ansible-builder introspect --sanitize .
- name: Make sure galaxy.yml has version entry
run: >-
python -c
'import yaml ;
f = open("galaxy.yml", "rb") ;
data = yaml.safe_load(f) ;
f.close() ;
data["version"] = data.get("version") or "0.0.1" ;
f = open("galaxy.yml", "wb") ;
f.write(yaml.dump(data).encode("utf-8")) ;
f.close() ;
'
working-directory: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}
- name: Build collection
run: |
ansible-galaxy collection build --output-path ../../../
working-directory: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}
- name: Create files for building execution environment
run: |
COLLECTION_FILENAME="$(ls "${NAMESPACE}-${COLLECTION_NAME}"-*.tar.gz)"
# EE config
cat > execution-environment.yml <<EOF
---
version: 3
dependencies:
ansible_core:
package_pip: ${{ matrix.ansible_core }}
ansible_runner:
package_pip: ${{ matrix.ansible_runner }}
galaxy: requirements.yml
${{ matrix.other_deps }}
images:
base_image:
name: ${{ matrix.base_image }}
additional_build_files:
- src: ${COLLECTION_FILENAME}
dest: src
additional_build_steps:
prepend_base:
- ${{ matrix.pre_base }}
EOF
echo "::group::execution-environment.yml"
cat execution-environment.yml
echo "::endgroup::"
# Requirements
cat > requirements.yml <<EOF
---
collections:
- name: src/${COLLECTION_FILENAME}
type: file
EOF
echo "::group::requirements.yml"
cat requirements.yml
echo "::endgroup::"
- name: Build image based on ${{ matrix.base_image }}
run: |
ansible-builder build --verbosity 3 --tag test-ee:latest --container-runtime docker
- name: Show images
run: docker image ls
- name: Run basic tests
run: >
ansible-navigator run
--mode stdout
--container-engine docker
--pull-policy never
--set-environment-variable ANSIBLE_PRIVATE_ROLE_VARS=true
--execution-environment-image test-ee:latest
-v
all.yml
${{ matrix.extra_vars }}
working-directory: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}/tests/ee

1
.gitignore vendored
View file

@ -4,6 +4,7 @@
/tests/output/
/changelogs/.plugin-cache.yaml
/tests/integration/inventory
# Byte-compiled / optimized / DLL files
__pycache__/

53
.yamllint Normal file
View file

@ -0,0 +1,53 @@
---
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 Felix Fontein <felix@fontein.de>
extends: default
ignore: |
/changelogs/
rules:
line-length:
max: 300
level: error
document-start:
present: true
document-end: false
truthy:
level: error
allowed-values:
- 'true'
- 'false'
indentation:
spaces: 2
indent-sequences: true
key-duplicates: enable
trailing-spaces: enable
new-line-at-end-of-file: disable
hyphens:
max-spaces-after: 1
empty-lines:
max: 2
max-start: 0
max-end: 0
commas:
max-spaces-before: 0
min-spaces-after: 1
max-spaces-after: 1
colons:
max-spaces-before: 0
max-spaces-after: 1
brackets:
min-spaces-inside: 0
max-spaces-inside: 0
braces:
min-spaces-inside: 0
max-spaces-inside: 1
octal-values:
forbid-implicit-octal: true
forbid-explicit-octal: true
comments:
min-spaces-from-content: 1
comments-indentation: false

54
.yamllint-docs Normal file
View file

@ -0,0 +1,54 @@
---
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 Felix Fontein <felix@fontein.de>
extends: default
ignore: |
/changelogs/
rules:
line-length:
max: 160
level: error
document-start:
present: false
document-end:
present: false
truthy:
level: error
allowed-values:
- 'true'
- 'false'
indentation:
spaces: 2
indent-sequences: true
key-duplicates: enable
trailing-spaces: enable
new-line-at-end-of-file: disable
hyphens:
max-spaces-after: 1
empty-lines:
max: 2
max-start: 0
max-end: 0
commas:
max-spaces-before: 0
min-spaces-after: 1
max-spaces-after: 1
colons:
max-spaces-before: 0
max-spaces-after: 1
brackets:
min-spaces-inside: 0
max-spaces-inside: 0
braces:
min-spaces-inside: 0
max-spaces-inside: 1
octal-values:
forbid-implicit-octal: true
forbid-explicit-octal: true
comments:
min-spaces-from-content: 1
comments-indentation: false

54
.yamllint-examples Normal file
View file

@ -0,0 +1,54 @@
---
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 Felix Fontein <felix@fontein.de>
extends: default
ignore: |
/changelogs/
rules:
line-length:
max: 160
level: error
document-start:
present: true
document-end:
present: false
truthy:
level: error
allowed-values:
- 'true'
- 'false'
indentation:
spaces: 2
indent-sequences: true
key-duplicates: enable
trailing-spaces: enable
new-line-at-end-of-file: disable
hyphens:
max-spaces-after: 1
empty-lines:
max: 2
max-start: 0
max-end: 0
commas:
max-spaces-before: 0
min-spaces-after: 1
max-spaces-after: 1
colons:
max-spaces-before: 0
max-spaces-after: 1
brackets:
min-spaces-inside: 0
max-spaces-inside: 0
braces:
min-spaces-inside: 0
max-spaces-inside: 1
octal-values:
forbid-implicit-octal: true
forbid-explicit-octal: true
comments:
min-spaces-from-content: 1
comments-indentation: false

53
.yamllint-extra-docs Normal file
View file

@ -0,0 +1,53 @@
---
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 Felix Fontein <felix@fontein.de>
extends: default
ignore: |
/changelogs/
rules:
line-length:
max: 160
level: error
document-start: disable
document-end:
present: false
truthy:
level: error
allowed-values:
- 'true'
- 'false'
indentation:
spaces: 2
indent-sequences: true
key-duplicates: enable
trailing-spaces: enable
new-line-at-end-of-file: disable
hyphens:
max-spaces-after: 1
empty-lines:
max: 2
max-start: 0
max-end: 0
commas:
max-spaces-before: 0
min-spaces-after: 1
max-spaces-after: 1
colons:
max-spaces-before: 0
max-spaces-after: 1
brackets:
min-spaces-inside: 0
max-spaces-inside: 0
braces:
min-spaces-inside: 0
max-spaces-inside: 1
octal-values:
forbid-implicit-octal: true
forbid-explicit-octal: true
comments:
min-spaces-from-content: 1
comments-indentation: false

View file

@ -2,159 +2,211 @@
**Topics**
- <a href="#v3-6-0">v3\.6\.0</a>
- <a href="#v3-8-1">v3\.8\.1</a>
- <a href="#release-summary">Release Summary</a>
- <a href="#minor-changes">Minor Changes</a>
- <a href="#v3-5-0">v3\.5\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#v3-4-0">v3\.4\.0</a>
- <a href="#release-summary-2">Release Summary</a>
- <a href="#minor-changes-2">Minor Changes</a>
- <a href="#bugfixes">Bugfixes</a>
- <a href="#v3-3-0">v3\.3\.0</a>
- <a href="#v3-8-0">v3\.8\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- <a href="#minor-changes">Minor Changes</a>
- <a href="#v3-7-0">v3\.7\.0</a>
- <a href="#release-summary-2">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#v3-6-0">v3\.6\.0</a>
- <a href="#release-summary-3">Release Summary</a>
- <a href="#minor-changes-3">Minor Changes</a>
- <a href="#v3-2-0">v3\.2\.0</a>
- <a href="#minor-changes-2">Minor Changes</a>
- <a href="#v3-5-0">v3\.5\.0</a>
- <a href="#release-summary-4">Release Summary</a>
- <a href="#minor-changes-4">Minor Changes</a>
- <a href="#v3-1-0">v3\.1\.0</a>
- <a href="#minor-changes-3">Minor Changes</a>
- <a href="#v3-4-0">v3\.4\.0</a>
- <a href="#release-summary-5">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</a>
- <a href="#minor-changes-4">Minor Changes</a>
- <a href="#bugfixes-1">Bugfixes</a>
- <a href="#v3-0-0">v3\.0\.0</a>
- <a href="#v3-3-0">v3\.3\.0</a>
- <a href="#release-summary-6">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</a>
- <a href="#v3-2-0">v3\.2\.0</a>
- <a href="#release-summary-7">Release Summary</a>
- <a href="#minor-changes-6">Minor Changes</a>
- <a href="#v3-1-0">v3\.1\.0</a>
- <a href="#release-summary-8">Release Summary</a>
- <a href="#minor-changes-7">Minor Changes</a>
- <a href="#bugfixes-2">Bugfixes</a>
- <a href="#v3-0-0">v3\.0\.0</a>
- <a href="#release-summary-9">Release Summary</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- <a href="#v2-20-0">v2\.20\.0</a>
- <a href="#release-summary-7">Release Summary</a>
- <a href="#minor-changes-6">Minor Changes</a>
- <a href="#v2-19-0">v2\.19\.0</a>
- <a href="#release-summary-8">Release Summary</a>
- <a href="#minor-changes-7">Minor Changes</a>
- <a href="#v2-18-0">v2\.18\.0</a>
- <a href="#release-summary-9">Release Summary</a>
- <a href="#minor-changes-8">Minor Changes</a>
- <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-2">Bugfixes</a>
- <a href="#v2-17-0">v2\.17\.0</a>
- <a href="#release-summary-10">Release Summary</a>
- <a href="#minor-changes-9">Minor Changes</a>
- <a href="#v2-16-0">v2\.16\.0</a>
- <a href="#minor-changes-8">Minor Changes</a>
- <a href="#v2-19-0">v2\.19\.0</a>
- <a href="#release-summary-11">Release Summary</a>
- <a href="#minor-changes-10">Minor Changes</a>
- <a href="#v2-15-0">v2\.15\.0</a>
- <a href="#minor-changes-9">Minor Changes</a>
- <a href="#v2-18-0">v2\.18\.0</a>
- <a href="#release-summary-12">Release Summary</a>
- <a href="#minor-changes-11">Minor Changes</a>
- <a href="#v2-14-0">v2\.14\.0</a>
- <a href="#release-summary-13">Release Summary</a>
- <a href="#minor-changes-12">Minor Changes</a>
- <a href="#v2-13-0">v2\.13\.0</a>
- <a href="#release-summary-14">Release Summary</a>
- <a href="#minor-changes-13">Minor Changes</a>
- <a href="#minor-changes-10">Minor Changes</a>
- <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-3">Bugfixes</a>
- <a href="#v2-12-0">v2\.12\.0</a>
- <a href="#v2-17-0">v2\.17\.0</a>
- <a href="#release-summary-13">Release Summary</a>
- <a href="#minor-changes-11">Minor Changes</a>
- <a href="#v2-16-0">v2\.16\.0</a>
- <a href="#release-summary-14">Release Summary</a>
- <a href="#minor-changes-12">Minor Changes</a>
- <a href="#v2-15-0">v2\.15\.0</a>
- <a href="#release-summary-15">Release Summary</a>
- <a href="#minor-changes-14">Minor Changes</a>
- <a href="#v2-11-0">v2\.11\.0</a>
- <a href="#minor-changes-13">Minor Changes</a>
- <a href="#v2-14-0">v2\.14\.0</a>
- <a href="#release-summary-16">Release Summary</a>
- <a href="#minor-changes-15">Minor Changes</a>
- <a href="#v2-10-0">v2\.10\.0</a>
- <a href="#minor-changes-14">Minor Changes</a>
- <a href="#v2-13-0">v2\.13\.0</a>
- <a href="#release-summary-17">Release Summary</a>
- <a href="#minor-changes-16">Minor Changes</a>
- <a href="#minor-changes-15">Minor Changes</a>
- <a href="#bugfixes-4">Bugfixes</a>
- <a href="#v2-9-0">v2\.9\.0</a>
- <a href="#v2-12-0">v2\.12\.0</a>
- <a href="#release-summary-18">Release Summary</a>
- <a href="#minor-changes-17">Minor Changes</a>
- <a href="#bugfixes-5">Bugfixes</a>
- <a href="#v2-8-3">v2\.8\.3</a>
- <a href="#minor-changes-16">Minor Changes</a>
- <a href="#v2-11-0">v2\.11\.0</a>
- <a href="#release-summary-19">Release Summary</a>
- <a href="#minor-changes-17">Minor Changes</a>
- <a href="#v2-10-0">v2\.10\.0</a>
- <a href="#release-summary-20">Release Summary</a>
- <a href="#minor-changes-18">Minor Changes</a>
- <a href="#bugfixes-5">Bugfixes</a>
- <a href="#v2-9-0">v2\.9\.0</a>
- <a href="#release-summary-21">Release Summary</a>
- <a href="#minor-changes-19">Minor Changes</a>
- <a href="#bugfixes-6">Bugfixes</a>
- <a href="#v2-8-3">v2\.8\.3</a>
- <a href="#release-summary-22">Release Summary</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#v2-8-2">v2\.8\.2</a>
- <a href="#release-summary-20">Release Summary</a>
- <a href="#bugfixes-6">Bugfixes</a>
- <a href="#v2-8-1">v2\.8\.1</a>
- <a href="#release-summary-21">Release Summary</a>
- <a href="#bugfixes-7">Bugfixes</a>
- <a href="#v2-8-0">v2\.8\.0</a>
- <a href="#release-summary-22">Release Summary</a>
- <a href="#minor-changes-18">Minor Changes</a>
- <a href="#bugfixes-8">Bugfixes</a>
- <a href="#v2-7-0">v2\.7\.0</a>
- <a href="#release-summary-23">Release Summary</a>
- <a href="#minor-changes-19">Minor Changes</a>
- <a href="#bugfixes-9">Bugfixes</a>
- <a href="#v2-6-0">v2\.6\.0</a>
- <a href="#bugfixes-7">Bugfixes</a>
- <a href="#v2-8-1">v2\.8\.1</a>
- <a href="#release-summary-24">Release Summary</a>
- <a href="#minor-changes-20">Minor Changes</a>
- <a href="#bugfixes-10">Bugfixes</a>
- <a href="#v2-5-0">v2\.5\.0</a>
- <a href="#bugfixes-8">Bugfixes</a>
- <a href="#v2-8-0">v2\.8\.0</a>
- <a href="#release-summary-25">Release Summary</a>
- <a href="#minor-changes-21">Minor Changes</a>
- <a href="#bugfixes-11">Bugfixes</a>
- <a href="#v2-4-0">v2\.4\.0</a>
- <a href="#minor-changes-20">Minor Changes</a>
- <a href="#bugfixes-9">Bugfixes</a>
- <a href="#v2-7-0">v2\.7\.0</a>
- <a href="#release-summary-26">Release Summary</a>
- <a href="#minor-changes-22">Minor Changes</a>
- <a href="#bugfixes-12">Bugfixes</a>
- <a href="#known-issues-1">Known Issues</a>
- <a href="#v2-3-1">v2\.3\.1</a>
- <a href="#minor-changes-21">Minor Changes</a>
- <a href="#bugfixes-10">Bugfixes</a>
- <a href="#v2-6-0">v2\.6\.0</a>
- <a href="#release-summary-27">Release Summary</a>
- <a href="#known-issues-2">Known Issues</a>
- <a href="#v2-3-0">v2\.3\.0</a>
- <a href="#minor-changes-22">Minor Changes</a>
- <a href="#bugfixes-11">Bugfixes</a>
- <a href="#v2-5-0">v2\.5\.0</a>
- <a href="#release-summary-28">Release Summary</a>
- <a href="#minor-changes-23">Minor Changes</a>
- <a href="#bugfixes-13">Bugfixes</a>
- <a href="#v2-2-1">v2\.2\.1</a>
- <a href="#bugfixes-12">Bugfixes</a>
- <a href="#v2-4-0">v2\.4\.0</a>
- <a href="#release-summary-29">Release Summary</a>
- <a href="#bugfixes-14">Bugfixes</a>
- <a href="#v2-2-0">v2\.2\.0</a>
- <a href="#release-summary-30">Release Summary</a>
- <a href="#minor-changes-24">Minor Changes</a>
- <a href="#bugfixes-15">Bugfixes</a>
- <a href="#new-modules">New Modules</a>
- <a href="#v2-1-0">v2\.1\.0</a>
- <a href="#bugfixes-13">Bugfixes</a>
- <a href="#known-issues-1">Known Issues</a>
- <a href="#v2-3-1">v2\.3\.1</a>
- <a href="#release-summary-30">Release Summary</a>
- <a href="#known-issues-2">Known Issues</a>
- <a href="#v2-3-0">v2\.3\.0</a>
- <a href="#release-summary-31">Release Summary</a>
- <a href="#minor-changes-25">Minor Changes</a>
- <a href="#bugfixes-14">Bugfixes</a>
- <a href="#v2-2-1">v2\.2\.1</a>
- <a href="#release-summary-32">Release Summary</a>
- <a href="#bugfixes-15">Bugfixes</a>
- <a href="#v2-2-0">v2\.2\.0</a>
- <a href="#release-summary-33">Release Summary</a>
- <a href="#minor-changes-26">Minor Changes</a>
- <a href="#bugfixes-16">Bugfixes</a>
- <a href="#new-modules">New Modules</a>
- <a href="#v2-1-0">v2\.1\.0</a>
- <a href="#release-summary-34">Release Summary</a>
- <a href="#minor-changes-27">Minor Changes</a>
- <a href="#bugfixes-17">Bugfixes</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#v2-0-0">v2\.0\.0</a>
- <a href="#release-summary-32">Release Summary</a>
- <a href="#minor-changes-26">Minor Changes</a>
- <a href="#release-summary-35">Release Summary</a>
- <a href="#minor-changes-28">Minor Changes</a>
- <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a>
- <a href="#bugfixes-17">Bugfixes</a>
- <a href="#bugfixes-18">Bugfixes</a>
- <a href="#new-plugins">New Plugins</a>
- <a href="#filter">Filter</a>
- <a href="#v1-2-0">v1\.2\.0</a>
- <a href="#release-summary-33">Release Summary</a>
- <a href="#minor-changes-27">Minor Changes</a>
- <a href="#bugfixes-18">Bugfixes</a>
- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-34">Release Summary</a>
- <a href="#minor-changes-28">Minor Changes</a>
- <a href="#v1-0-1">v1\.0\.1</a>
- <a href="#release-summary-35">Release Summary</a>
- <a href="#bugfixes-19">Bugfixes</a>
- <a href="#v1-0-0">v1\.0\.0</a>
- <a href="#release-summary-36">Release Summary</a>
- <a href="#bugfixes-20">Bugfixes</a>
- <a href="#v0-1-1">v0\.1\.1</a>
- <a href="#release-summary-37">Release Summary</a>
- <a href="#bugfixes-21">Bugfixes</a>
- <a href="#v0-1-0">v0\.1\.0</a>
- <a href="#release-summary-38">Release Summary</a>
- <a href="#minor-changes-29">Minor Changes</a>
- <a href="#bugfixes-19">Bugfixes</a>
- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-37">Release Summary</a>
- <a href="#minor-changes-30">Minor Changes</a>
- <a href="#v1-0-1">v1\.0\.1</a>
- <a href="#release-summary-38">Release Summary</a>
- <a href="#bugfixes-20">Bugfixes</a>
- <a href="#v1-0-0">v1\.0\.0</a>
- <a href="#release-summary-39">Release Summary</a>
- <a href="#bugfixes-21">Bugfixes</a>
- <a href="#v0-1-1">v0\.1\.1</a>
- <a href="#release-summary-40">Release Summary</a>
- <a href="#bugfixes-22">Bugfixes</a>
- <a href="#v0-1-0">v0\.1\.0</a>
- <a href="#release-summary-41">Release Summary</a>
- <a href="#minor-changes-31">Minor Changes</a>
<a id="v3-6-0"></a>
## v3\.6\.0
<a id="v3-8-1"></a>
## v3\.8\.1
<a id="release-summary"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes"></a>
### Bugfixes
* facts and api\_facts modules \- prevent deprecation warnings when used with ansible\-core 2\.19 \([https\://github\.com/ansible\-collections/community\.routeros/pull/384](https\://github\.com/ansible\-collections/community\.routeros/pull/384)\)\.
<a id="v3-8-0"></a>
## v3\.8\.0
<a id="release-summary-1"></a>
### Release Summary
Feature release\.
<a id="minor-changes"></a>
### Minor Changes
* api\_info\, api\_modify \- add <code>interface ethernet switch port\-isolation</code> which is supported since RouterOS 6\.43 \([https\://github\.com/ansible\-collections/community\.routeros/pull/375](https\://github\.com/ansible\-collections/community\.routeros/pull/375)\)\.
* api\_info\, api\_modify \- add <code>routing bfd configuration</code>\. Officially stabilized BFD support for BGP and OSPF is available since RouterOS 7\.11
\([https\://github\.com/ansible\-collections/community\.routeros/pull/375](https\://github\.com/ansible\-collections/community\.routeros/pull/375)\)\.
* api\_modify\, api\_info \- support API path <code>ip ipsec mode\-config</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/376](https\://github\.com/ansible\-collections/community\.routeros/pull/376)\)\.
<a id="v3-7-0"></a>
## v3\.7\.0
<a id="release-summary-2"></a>
### Release Summary
Feature release\.
<a id="minor-changes-1"></a>
### Minor Changes
* api\_find\_and\_modify \- allow to control whether <code>dynamic</code> and/or <code>builtin</code> entries are ignored with the new <code>ignore\_dynamic</code> and <code>ignore\_builtin</code> options \([https\://github\.com/ansible\-collections/community\.routeros/issues/372](https\://github\.com/ansible\-collections/community\.routeros/issues/372)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/373](https\://github\.com/ansible\-collections/community\.routeros/pull/373)\)\.
* api\_info\, api\_modify \- add <code>port\-cost\-mode</code> to <code>interface bridge</code> which is supported since RouterOS 7\.13 \([https\://github\.com/ansible\-collections/community\.routeros/pull/371](https\://github\.com/ansible\-collections/community\.routeros/pull/371)\)\.
<a id="v3-6-0"></a>
## v3\.6\.0
<a id="release-summary-3"></a>
### Release Summary
Feature release\.
<a id="minor-changes-2"></a>
### Minor Changes
* api\_info\, api\_modify \- add <code>mdns\-repeat\-ifaces</code> to <code>ip dns</code> for RouterOS 7\.16 and newer \([https\://github\.com/ansible\-collections/community\.routeros/pull/358](https\://github\.com/ansible\-collections/community\.routeros/pull/358)\)\.
* api\_info\, api\_modify \- field name change in <code>routing bgp connection</code> path implemented by RouterOS 7\.19 and newer \([https\://github\.com/ansible\-collections/community\.routeros/pull/360](https\://github\.com/ansible\-collections/community\.routeros/pull/360)\)\.
* api\_info\, api\_modify \- rename <code>is\-responder</code> property in <code>interface wireguard peers</code> to <code>responder</code> for RouterOS 7\.17 and newer \([https\://github\.com/ansible\-collections/community\.routeros/pull/364](https\://github\.com/ansible\-collections/community\.routeros/pull/364)\)\.
@ -162,12 +214,12 @@ Feature release\.
<a id="v3-5-0"></a>
## v3\.5\.0
<a id="release-summary-1"></a>
<a id="release-summary-4"></a>
### Release Summary
Feature release\.
<a id="minor-changes-1"></a>
<a id="minor-changes-3"></a>
### Minor Changes
* api\_info\, api\_modify \- change default for <code>/ip/cloud/ddns\-enabled</code> for RouterOS 7\.17 and newer from <code>yes</code> to <code>auto</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/350](https\://github\.com/ansible\-collections/community\.routeros/pull/350)\)\.
@ -175,17 +227,17 @@ Feature release\.
<a id="v3-4-0"></a>
## v3\.4\.0
<a id="release-summary-2"></a>
<a id="release-summary-5"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-2"></a>
<a id="minor-changes-4"></a>
### Minor Changes
* api\_info\, api\_modify \- add support for the <code>ip dns forwarders</code> path implemented by RouterOS 7\.17 and newer \([https\://github\.com/ansible\-collections/community\.routeros/pull/343](https\://github\.com/ansible\-collections/community\.routeros/pull/343)\)\.
<a id="bugfixes"></a>
<a id="bugfixes-1"></a>
### Bugfixes
* api\_info\, api\_modify \- remove the primary key <code>action</code> from the <code>interface wifi provisioning</code> path\, since RouterOS also allows to create completely duplicate entries \([https\://github\.com/ansible\-collections/community\.routeros/issues/344](https\://github\.com/ansible\-collections/community\.routeros/issues/344)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/345](https\://github\.com/ansible\-collections/community\.routeros/pull/345)\)\.
@ -193,12 +245,12 @@ Feature and bugfix release\.
<a id="v3-3-0"></a>
## v3\.3\.0
<a id="release-summary-3"></a>
<a id="release-summary-6"></a>
### Release Summary
Feature release\.
<a id="minor-changes-3"></a>
<a id="minor-changes-5"></a>
### Minor Changes
* api\_info\, api\_modify \- add missing attribute <code>require\-message\-auth</code> for the <code>radius</code> path which exists since RouterOS version 7\.15 \([https\://github\.com/ansible\-collections/community\.routeros/issues/338](https\://github\.com/ansible\-collections/community\.routeros/issues/338)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/339](https\://github\.com/ansible\-collections/community\.routeros/pull/339)\)\.
@ -209,12 +261,12 @@ Feature release\.
<a id="v3-2-0"></a>
## v3\.2\.0
<a id="release-summary-4"></a>
<a id="release-summary-7"></a>
### Release Summary
Feature release\.
<a id="minor-changes-4"></a>
<a id="minor-changes-6"></a>
### Minor Changes
* api\_info\, api\_modify \- add support for the <code>routing filter community\-list</code> path implemented by RouterOS 7 and newer \([https\://github\.com/ansible\-collections/community\.routeros/pull/331](https\://github\.com/ansible\-collections/community\.routeros/pull/331)\)\.
@ -222,17 +274,17 @@ Feature release\.
<a id="v3-1-0"></a>
## v3\.1\.0
<a id="release-summary-5"></a>
<a id="release-summary-8"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-5"></a>
<a id="minor-changes-7"></a>
### Minor Changes
* api\_info\, api\_modify \- add missing fields <code>comment</code>\, <code>next\-pool</code> to <code>ip pool</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/327](https\://github\.com/ansible\-collections/community\.routeros/pull/327)\)\.
<a id="bugfixes-1"></a>
<a id="bugfixes-2"></a>
### Bugfixes
* api\_info\, api\_modify \- fields <code>log</code> and <code>log\-prefix</code> in paths <code>ip firewall filter</code>\, <code>ip firewall mangle</code>\, <code>ip firewall nat</code>\, <code>ip firewall raw</code> now have the correct default values \([https\://github\.com/ansible\-collections/community\.routeros/pull/324](https\://github\.com/ansible\-collections/community\.routeros/pull/324)\)\.
@ -240,7 +292,7 @@ Bugfix and feature release\.
<a id="v3-0-0"></a>
## v3\.0\.0
<a id="release-summary-6"></a>
<a id="release-summary-9"></a>
### Release Summary
Major release that drops support for End of Life Python versions and fixes check mode for community\.routeros\.command\.
@ -258,12 +310,12 @@ Major release that drops support for End of Life Python versions and fixes check
<a id="v2-20-0"></a>
## v2\.20\.0
<a id="release-summary-7"></a>
<a id="release-summary-10"></a>
### Release Summary
Feature release\.
<a id="minor-changes-6"></a>
<a id="minor-changes-8"></a>
### Minor Changes
* api\_info\, api\_modify \- add new parameters from the RouterOS 7\.16 release \([https\://github\.com/ansible\-collections/community\.routeros/pull/323](https\://github\.com/ansible\-collections/community\.routeros/pull/323)\)\.
@ -274,12 +326,12 @@ Feature release\.
<a id="v2-19-0"></a>
## v2\.19\.0
<a id="release-summary-8"></a>
<a id="release-summary-11"></a>
### Release Summary
Feature release\.
<a id="minor-changes-7"></a>
<a id="minor-changes-9"></a>
### Minor Changes
* api\_info\, api\_modify \- add support for the <code>ip dns adlist</code> path implemented by RouterOS 7\.15 and newer \([https\://github\.com/ansible\-collections/community\.routeros/pull/310](https\://github\.com/ansible\-collections/community\.routeros/pull/310)\)\.
@ -291,12 +343,12 @@ Feature release\.
<a id="v2-18-0"></a>
## v2\.18\.0
<a id="release-summary-9"></a>
<a id="release-summary-12"></a>
### Release Summary
Feature release\.
<a id="minor-changes-8"></a>
<a id="minor-changes-10"></a>
### Minor Changes
* api\_info \- allow to restrict the output by limiting fields to specific values with the new <code>restrict</code> option \([https\://github\.com/ansible\-collections/community\.routeros/pull/305](https\://github\.com/ansible\-collections/community\.routeros/pull/305)\)\.
@ -312,7 +364,7 @@ Feature release\.
* The collection deprecates support for all Ansible/ansible\-base/ansible\-core versions that are currently End of Life\, [according to the ansible\-core support matrix](https\://docs\.ansible\.com/ansible\-core/devel/reference\_appendices/release\_and\_maintenance\.html\#ansible\-core\-support\-matrix)\. This means that the next major release of the collection will no longer support Ansible 2\.9\, ansible\-base 2\.10\, ansible\-core 2\.11\, ansible\-core 2\.12\, ansible\-core 2\.13\, and ansible\-core 2\.14\.
<a id="bugfixes-2"></a>
<a id="bugfixes-3"></a>
### Bugfixes
* api\_modify\, api\_info \- change the default of <code>ingress\-filtering</code> in paths <code>interface bridge</code> and <code>interface bridge port</code> back to <code>false</code> for RouterOS before version 7 \([https\://github\.com/ansible\-collections/community\.routeros/pull/305](https\://github\.com/ansible\-collections/community\.routeros/pull/305)\)\.
@ -320,12 +372,12 @@ Feature release\.
<a id="v2-17-0"></a>
## v2\.17\.0
<a id="release-summary-10"></a>
<a id="release-summary-13"></a>
### Release Summary
Feature release\.
<a id="minor-changes-9"></a>
<a id="minor-changes-11"></a>
### Minor Changes
* api\_info\, api\_modify \- add <code>system health settings</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/294](https\://github\.com/ansible\-collections/community\.routeros/pull/294)\)\.
@ -335,12 +387,12 @@ Feature release\.
<a id="v2-16-0"></a>
## v2\.16\.0
<a id="release-summary-11"></a>
<a id="release-summary-14"></a>
### Release Summary
Feature release\.
<a id="minor-changes-10"></a>
<a id="minor-changes-12"></a>
### Minor Changes
* api\_info\, api\_modify \- add missing path <code>/ppp secret</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/286](https\://github\.com/ansible\-collections/community\.routeros/pull/286)\)\.
@ -349,12 +401,12 @@ Feature release\.
<a id="v2-15-0"></a>
## v2\.15\.0
<a id="release-summary-12"></a>
<a id="release-summary-15"></a>
### Release Summary
Feature release\.
<a id="minor-changes-11"></a>
<a id="minor-changes-13"></a>
### Minor Changes
* api\_info\, api\_modify \- Add RouterOS 7\.x support to <code>/mpls ldp</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/271](https\://github\.com/ansible\-collections/community\.routeros/pull/271)\)\.
@ -371,12 +423,12 @@ Feature release\.
<a id="v2-14-0"></a>
## v2\.14\.0
<a id="release-summary-13"></a>
<a id="release-summary-16"></a>
### Release Summary
Feature release\.
<a id="minor-changes-12"></a>
<a id="minor-changes-14"></a>
### Minor Changes
* api\_info\, api\_modify \- add read\-only fields <code>installed\-version</code>\, <code>latest\-version</code> and <code>status</code> in <code>system package update</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/263](https\://github\.com/ansible\-collections/community\.routeros/pull/263)\)\.
@ -386,18 +438,18 @@ Feature release\.
<a id="v2-13-0"></a>
## v2\.13\.0
<a id="release-summary-14"></a>
<a id="release-summary-17"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-13"></a>
<a id="minor-changes-15"></a>
### Minor Changes
* api\_info\, api\_modify \- make path <code>user group</code> modifiable and add <code>comment</code> attribute \([https\://github\.com/ansible\-collections/community\.routeros/issues/256](https\://github\.com/ansible\-collections/community\.routeros/issues/256)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/257](https\://github\.com/ansible\-collections/community\.routeros/pull/257)\)\.
* api\_modify\, api\_info \- add support for the <code>ip vrf</code> path in RouterOS 7 \([https\://github\.com/ansible\-collections/community\.routeros/pull/259](https\://github\.com/ansible\-collections/community\.routeros/pull/259)\)
<a id="bugfixes-3"></a>
<a id="bugfixes-4"></a>
### Bugfixes
* facts \- fix date not getting removed for idempotent config export \([https\://github\.com/ansible\-collections/community\.routeros/pull/262](https\://github\.com/ansible\-collections/community\.routeros/pull/262)\)\.
@ -405,12 +457,12 @@ Bugfix and feature release\.
<a id="v2-12-0"></a>
## v2\.12\.0
<a id="release-summary-15"></a>
<a id="release-summary-18"></a>
### Release Summary
Feature release\.
<a id="minor-changes-14"></a>
<a id="minor-changes-16"></a>
### Minor Changes
* api\_info\, api\_modify \- add <code>interface ovpn\-client</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/242](https\://github\.com/ansible\-collections/community\.routeros/issues/242)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/244](https\://github\.com/ansible\-collections/community\.routeros/pull/244)\)\.
@ -424,12 +476,12 @@ Feature release\.
<a id="v2-11-0"></a>
## v2\.11\.0
<a id="release-summary-16"></a>
<a id="release-summary-19"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-15"></a>
<a id="minor-changes-17"></a>
### Minor Changes
* api\_info\, api\_modify \- add missing DoH parameters <code>doh\-max\-concurrent\-queries</code>\, <code>doh\-max\-server\-connections</code>\, and <code>doh\-timeout</code> to the <code>ip dns</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/230](https\://github\.com/ansible\-collections/community\.routeros/issues/230)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/235](https\://github\.com/ansible\-collections/community\.routeros/pull/235)\)
@ -444,12 +496,12 @@ Feature and bugfix release\.
<a id="v2-10-0"></a>
## v2\.10\.0
<a id="release-summary-17"></a>
<a id="release-summary-20"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-16"></a>
<a id="minor-changes-18"></a>
### Minor Changes
* api\_info \- add new <code>include\_read\_only</code> option to select behavior for read\-only values\. By default these are not returned \([https\://github\.com/ansible\-collections/community\.routeros/pull/213](https\://github\.com/ansible\-collections/community\.routeros/pull/213)\)\.
@ -473,7 +525,7 @@ Bugfix and feature release\.
* api\_modify \- add new <code>handle\_read\_only</code> and <code>handle\_write\_only</code> options to handle the module\'s behavior for read\-only and write\-only fields \([https\://github\.com/ansible\-collections/community\.routeros/pull/213](https\://github\.com/ansible\-collections/community\.routeros/pull/213)\)\.
* api\_modify\, api\_info \- support API paths <code>routing id</code>\, <code>routing bgp connection</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/220](https\://github\.com/ansible\-collections/community\.routeros/pull/220)\)\.
<a id="bugfixes-4"></a>
<a id="bugfixes-5"></a>
### Bugfixes
* api\_info\, api\_modify \- in the <code>snmp</code> path\, ensure that <code>engine\-id\-suffix</code> is only available on RouterOS 7\.10\+\, and that <code>engine\-id</code> is read\-only on RouterOS 7\.10\+ \([https\://github\.com/ansible\-collections/community\.routeros/issues/208](https\://github\.com/ansible\-collections/community\.routeros/issues/208)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/218](https\://github\.com/ansible\-collections/community\.routeros/pull/218)\)\.
@ -481,18 +533,18 @@ Bugfix and feature release\.
<a id="v2-9-0"></a>
## v2\.9\.0
<a id="release-summary-18"></a>
<a id="release-summary-21"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-17"></a>
<a id="minor-changes-19"></a>
### Minor Changes
* api\_info\, api\_modify \- add path <code>caps\-man channel</code> and enable path <code>caps\-man manager interface</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/193](https\://github\.com/ansible\-collections/community\.routeros/issues/193)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/194](https\://github\.com/ansible\-collections/community\.routeros/pull/194)\)\.
* api\_info\, api\_modify \- add path <code>ip traffic\-flow target</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/191](https\://github\.com/ansible\-collections/community\.routeros/issues/191)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/192](https\://github\.com/ansible\-collections/community\.routeros/pull/192)\)\.
<a id="bugfixes-5"></a>
<a id="bugfixes-6"></a>
### Bugfixes
* api\_modify\, api\_info \- add missing parameter <code>engine\-id\-suffix</code> for the <code>snmp</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/189](https\://github\.com/ansible\-collections/community\.routeros/issues/189)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/190](https\://github\.com/ansible\-collections/community\.routeros/pull/190)\)\.
@ -500,7 +552,7 @@ Bugfix and feature release\.
<a id="v2-8-3"></a>
## v2\.8\.3
<a id="release-summary-19"></a>
<a id="release-summary-22"></a>
### Release Summary
Maintenance release with updated documentation\.
@ -521,20 +573,7 @@ for the rendered HTML version of the documentation of the latest release\.
<a id="v2-8-2"></a>
## v2\.8\.2
<a id="release-summary-20"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes-6"></a>
### Bugfixes
* api\_modify\, api\_info \- add missing parameter <code>tls</code> for the <code>tool e\-mail</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/179](https\://github\.com/ansible\-collections/community\.routeros/issues/179)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/180](https\://github\.com/ansible\-collections/community\.routeros/pull/180)\)\.
<a id="v2-8-1"></a>
## v2\.8\.1
<a id="release-summary-21"></a>
<a id="release-summary-23"></a>
### Release Summary
Bugfix release\.
@ -542,17 +581,30 @@ Bugfix release\.
<a id="bugfixes-7"></a>
### Bugfixes
* api\_modify\, api\_info \- add missing parameter <code>tls</code> for the <code>tool e\-mail</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/179](https\://github\.com/ansible\-collections/community\.routeros/issues/179)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/180](https\://github\.com/ansible\-collections/community\.routeros/pull/180)\)\.
<a id="v2-8-1"></a>
## v2\.8\.1
<a id="release-summary-24"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes-8"></a>
### Bugfixes
* facts \- do not crash in CLI output preprocessing in unexpected situations during line unwrapping \([https\://github\.com/ansible\-collections/community\.routeros/issues/170](https\://github\.com/ansible\-collections/community\.routeros/issues/170)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/177](https\://github\.com/ansible\-collections/community\.routeros/pull/177)\)\.
<a id="v2-8-0"></a>
## v2\.8\.0
<a id="release-summary-22"></a>
<a id="release-summary-25"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-18"></a>
<a id="minor-changes-20"></a>
### Minor Changes
* api\_modify \- adapt data for API paths <code>ip dhcp\-server network</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/156](https\://github\.com/ansible\-collections/community\.routeros/pull/156)\)\.
@ -562,7 +614,7 @@ Bugfix and feature release\.
* api\_modify \- support API paths <code>ip firewall layer7\-protocol</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/153](https\://github\.com/ansible\-collections/community\.routeros/pull/153)\)\.
* command \- workaround for extra characters in stdout in RouterOS versions between 6\.49 and 7\.1\.5 \([https\://github\.com/ansible\-collections/community\.routeros/issues/62](https\://github\.com/ansible\-collections/community\.routeros/issues/62)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/161](https\://github\.com/ansible\-collections/community\.routeros/pull/161)\)\.
<a id="bugfixes-8"></a>
<a id="bugfixes-9"></a>
### Bugfixes
* api\_info\, api\_modify \- fix default and remove behavior for <code>dhcp\-options</code> in path <code>ip dhcp\-client</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/148](https\://github\.com/ansible\-collections/community\.routeros/issues/148)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/154](https\://github\.com/ansible\-collections/community\.routeros/pull/154)\)\.
@ -572,17 +624,17 @@ Bugfix and feature release\.
<a id="v2-7-0"></a>
## v2\.7\.0
<a id="release-summary-23"></a>
<a id="release-summary-26"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-19"></a>
<a id="minor-changes-21"></a>
### Minor Changes
* api\_modify\, api\_info \- support API paths <code>ip arp</code>\, <code>ip firewall raw</code>\, <code>ipv6 firewall raw</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/144](https\://github\.com/ansible\-collections/community\.routeros/pull/144)\)\.
<a id="bugfixes-9"></a>
<a id="bugfixes-10"></a>
### Bugfixes
* api\_modify\, api\_info \- defaults corrected for fields in <code>interface wireguard peers</code> API path \([https\://github\.com/ansible\-collections/community\.routeros/pull/144](https\://github\.com/ansible\-collections/community\.routeros/pull/144)\)\.
@ -590,18 +642,18 @@ Bugfix and feature release\.
<a id="v2-6-0"></a>
## v2\.6\.0
<a id="release-summary-24"></a>
<a id="release-summary-27"></a>
### Release Summary
Regular bugfix and feature release\.
<a id="minor-changes-20"></a>
<a id="minor-changes-22"></a>
### Minor Changes
* api\_modify\, api\_info \- add field <code>regexp</code> to <code>ip dns static</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/141](https\://github\.com/ansible\-collections/community\.routeros/issues/141)\)\.
* api\_modify\, api\_info \- support API paths <code>interface wireguard</code>\, <code>interface wireguard peers</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/143](https\://github\.com/ansible\-collections/community\.routeros/pull/143)\)\.
<a id="bugfixes-10"></a>
<a id="bugfixes-11"></a>
### Bugfixes
* api\_modify \- do not use <code>name</code> as a unique key in <code>ip dns static</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/141](https\://github\.com/ansible\-collections/community\.routeros/issues/141)\)\.
@ -610,17 +662,17 @@ Regular bugfix and feature release\.
<a id="v2-5-0"></a>
## v2\.5\.0
<a id="release-summary-25"></a>
<a id="release-summary-28"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-21"></a>
<a id="minor-changes-23"></a>
### Minor Changes
* api\_info\, api\_modify \- support API paths <code>interface ethernet poe</code>\, <code>interface gre6</code>\, <code>interface vrrp</code> and also support all previously missing fields of entries in <code>ip dhcp\-server</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/137](https\://github\.com/ansible\-collections/community\.routeros/pull/137)\)\.
<a id="bugfixes-11"></a>
<a id="bugfixes-12"></a>
### Bugfixes
* api\_modify \- <code>address\-pool</code> field of entries in API path <code>ip dhcp\-server</code> is not required anymore \([https\://github\.com/ansible\-collections/community\.routeros/pull/137](https\://github\.com/ansible\-collections/community\.routeros/pull/137)\)\.
@ -628,12 +680,12 @@ Feature and bugfix release\.
<a id="v2-4-0"></a>
## v2\.4\.0
<a id="release-summary-26"></a>
<a id="release-summary-29"></a>
### Release Summary
Feature release improving the <code>api\*</code> modules\.
<a id="minor-changes-22"></a>
<a id="minor-changes-24"></a>
### Minor Changes
* api\* modules \- Add new option <code>force\_no\_cert</code> to connect with ADH ciphers \([https\://github\.com/ansible\-collections/community\.routeros/pull/124](https\://github\.com/ansible\-collections/community\.routeros/pull/124)\)\.
@ -654,7 +706,7 @@ Feature release improving the <code>api\*</code> modules\.
* api\_modify\, api\_info \- support for fields <code>blackhole</code>\, <code>pref\-src</code>\, <code>routing\-table</code>\, <code>suppress\-hw\-offload</code>\, <code>type</code>\, <code>vrf\-interface</code> in <code>ip route</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/131](https\://github\.com/ansible\-collections/community\.routeros/pull/131)\)\.
* api\_modify\, api\_info \- support paths <code>system ntp client servers</code> and <code>system ntp server</code> available in ROS7\, as well as new fields <code>servers</code>\, <code>mode</code>\, and <code>vrf</code> for <code>system ntp client</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/122](https\://github\.com/ansible\-collections/community\.routeros/pull/122)\)\.
<a id="bugfixes-12"></a>
<a id="bugfixes-13"></a>
### Bugfixes
* api\_modify \- <code>ip route</code> entry can be defined without the need of <code>gateway</code> field\, which is correct for unreachable/blackhole type of routes \([https\://github\.com/ansible\-collections/community\.routeros/pull/131](https\://github\.com/ansible\-collections/community\.routeros/pull/131)\)\.
@ -672,7 +724,7 @@ Feature release improving the <code>api\*</code> modules\.
<a id="v2-3-1"></a>
## v2\.3\.1
<a id="release-summary-27"></a>
<a id="release-summary-30"></a>
### Release Summary
Maintenance release with improved documentation\.
@ -685,19 +737,19 @@ Maintenance release with improved documentation\.
<a id="v2-3-0"></a>
## v2\.3\.0
<a id="release-summary-28"></a>
<a id="release-summary-31"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-23"></a>
<a id="minor-changes-25"></a>
### Minor Changes
* The collection repository conforms to the [REUSE specification](https\://reuse\.software/spec/) except for the changelog fragments \([https\://github\.com/ansible\-collections/community\.routeros/pull/108](https\://github\.com/ansible\-collections/community\.routeros/pull/108)\)\.
* api\* modules \- added <code>timeout</code> parameter \([https\://github\.com/ansible\-collections/community\.routeros/pull/109](https\://github\.com/ansible\-collections/community\.routeros/pull/109)\)\.
* api\_modify\, api\_info \- support API path <code>ip firewall mangle</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/110](https\://github\.com/ansible\-collections/community\.routeros/pull/110)\)\.
<a id="bugfixes-13"></a>
<a id="bugfixes-14"></a>
### Bugfixes
* api\_modify\, api\_info \- make API path <code>ip dhcp\-server</code> support <code>script</code>\, and <code>ip firewall nat</code> support <code>in\-interface</code> and <code>in\-interface\-list</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/110](https\://github\.com/ansible\-collections/community\.routeros/pull/110)\)\.
@ -705,12 +757,12 @@ Feature and bugfix release\.
<a id="v2-2-1"></a>
## v2\.2\.1
<a id="release-summary-29"></a>
<a id="release-summary-32"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes-14"></a>
<a id="bugfixes-15"></a>
### Bugfixes
* api\_modify\, api\_info \- make API path <code>ip dhcp\-server lease</code> support <code>server\=all</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/104](https\://github\.com/ansible\-collections/community\.routeros/issues/104)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/107](https\://github\.com/ansible\-collections/community\.routeros/pull/107)\)\.
@ -719,17 +771,17 @@ Bugfix release\.
<a id="v2-2-0"></a>
## v2\.2\.0
<a id="release-summary-30"></a>
<a id="release-summary-33"></a>
### Release Summary
New feature release\.
<a id="minor-changes-24"></a>
<a id="minor-changes-26"></a>
### Minor Changes
* All software licenses are now in the <code>LICENSES/</code> directory of the collection root\. Moreover\, <code>SPDX\-License\-Identifier\:</code> is used to declare the applicable license for every file that is not automatically generated \([https\://github\.com/ansible\-collections/community\.routeros/pull/101](https\://github\.com/ansible\-collections/community\.routeros/pull/101)\)\.
<a id="bugfixes-15"></a>
<a id="bugfixes-16"></a>
### Bugfixes
* Include <code>LICENSES/BSD\-2\-Clause\.txt</code> file for the <code>routeros</code> module utils \([https\://github\.com/ansible\-collections/community\.routeros/pull/101](https\://github\.com/ansible\-collections/community\.routeros/pull/101)\)\.
@ -743,12 +795,12 @@ New feature release\.
<a id="v2-1-0"></a>
## v2\.1\.0
<a id="release-summary-31"></a>
<a id="release-summary-34"></a>
### Release Summary
Feature and bugfix release with new modules\.
<a id="minor-changes-25"></a>
<a id="minor-changes-27"></a>
### Minor Changes
* Added a <code>community\.routeros\.api</code> module defaults group\. Use with <code>group/community\.routeros\.api</code> to provide options for all API\-based modules \([https\://github\.com/ansible\-collections/community\.routeros/pull/89](https\://github\.com/ansible\-collections/community\.routeros/pull/89)\)\.
@ -757,7 +809,7 @@ Feature and bugfix release with new modules\.
* api \- update <code>query</code> to accept symbolic parameters \([https\://github\.com/ansible\-collections/community\.routeros/pull/63](https\://github\.com/ansible\-collections/community\.routeros/pull/63)\)\.
* api\* modules \- allow to set an encoding other than the default ASCII for communicating with the API \([https\://github\.com/ansible\-collections/community\.routeros/pull/95](https\://github\.com/ansible\-collections/community\.routeros/pull/95)\)\.
<a id="bugfixes-16"></a>
<a id="bugfixes-17"></a>
### Bugfixes
* query \- fix query function check for <code>\.id</code> vs\. <code>id</code> arguments to not conflict with routeros arguments like <code>identity</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/68](https\://github\.com/ansible\-collections/community\.routeros/pull/68)\, [https\://github\.com/ansible\-collections/community\.routeros/issues/67](https\://github\.com/ansible\-collections/community\.routeros/issues/67)\)\.
@ -772,12 +824,12 @@ Feature and bugfix release with new modules\.
<a id="v2-0-0"></a>
## v2\.0\.0
<a id="release-summary-32"></a>
<a id="release-summary-35"></a>
### Release Summary
A new major release with breaking changes in the behavior of <code>community\.routeros\.api</code> and <code>community\.routeros\.command</code>\.
<a id="minor-changes-26"></a>
<a id="minor-changes-28"></a>
### Minor Changes
* api \- make validation of <code>WHERE</code> for <code>query</code> more strict \([https\://github\.com/ansible\-collections/community\.routeros/pull/53](https\://github\.com/ansible\-collections/community\.routeros/pull/53)\)\.
@ -791,7 +843,7 @@ A new major release with breaking changes in the behavior of <code>community\.ro
* api \- splitting commands no longer uses a naive split by whitespace\, but a more RouterOS CLI compatible splitting algorithm \([https\://github\.com/ansible\-collections/community\.routeros/pull/45](https\://github\.com/ansible\-collections/community\.routeros/pull/45)\)\.
* command \- the module now always indicates that a change happens\. If this is not correct\, please use <code>changed\_when</code> to determine the correct changed status for a task \([https\://github\.com/ansible\-collections/community\.routeros/pull/50](https\://github\.com/ansible\-collections/community\.routeros/pull/50)\)\.
<a id="bugfixes-17"></a>
<a id="bugfixes-18"></a>
### Bugfixes
* api \- improve splitting of <code>WHERE</code> queries \([https\://github\.com/ansible\-collections/community\.routeros/pull/47](https\://github\.com/ansible\-collections/community\.routeros/pull/47)\)\.
@ -813,12 +865,12 @@ A new major release with breaking changes in the behavior of <code>community\.ro
<a id="v1-2-0"></a>
## v1\.2\.0
<a id="release-summary-33"></a>
<a id="release-summary-36"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-27"></a>
<a id="minor-changes-29"></a>
### Minor Changes
* Avoid internal ansible\-core module\_utils in favor of equivalent public API available since at least Ansible 2\.9 \([https\://github\.com/ansible\-collections/community\.routeros/pull/38](https\://github\.com/ansible\-collections/community\.routeros/pull/38)\)\.
@ -826,7 +878,7 @@ Bugfix and feature release\.
* api \- rename option <code>ssl</code> to <code>tls</code>\, and keep the old name as an alias \([https\://github\.com/ansible\-collections/community\.routeros/pull/37](https\://github\.com/ansible\-collections/community\.routeros/pull/37)\)\.
* fact \- add fact <code>ansible\_net\_config\_nonverbose</code> to get idempotent config \(no date\, no verbose\) \([https\://github\.com/ansible\-collections/community\.routeros/pull/23](https\://github\.com/ansible\-collections/community\.routeros/pull/23)\)\.
<a id="bugfixes-18"></a>
<a id="bugfixes-19"></a>
### Bugfixes
* api \- when using TLS/SSL\, remove explicit cipher configuration to insecure values\, which also makes it impossible to connect to newer RouterOS versions \([https\://github\.com/ansible\-collections/community\.routeros/pull/34](https\://github\.com/ansible\-collections/community\.routeros/pull/34)\)\.
@ -834,12 +886,12 @@ Bugfix and feature release\.
<a id="v1-1-0"></a>
## v1\.1\.0
<a id="release-summary-34"></a>
<a id="release-summary-37"></a>
### Release Summary
This release allow dashes in usernames for SSH\-based modules\.
<a id="minor-changes-28"></a>
<a id="minor-changes-30"></a>
### Minor Changes
* command \- added support for a dash \(<code>\-</code>\) in username \([https\://github\.com/ansible\-collections/community\.routeros/pull/18](https\://github\.com/ansible\-collections/community\.routeros/pull/18)\)\.
@ -848,12 +900,12 @@ This release allow dashes in usernames for SSH\-based modules\.
<a id="v1-0-1"></a>
## v1\.0\.1
<a id="release-summary-35"></a>
<a id="release-summary-38"></a>
### Release Summary
Maintenance release with a bugfix for <code>api</code>\.
<a id="bugfixes-19"></a>
<a id="bugfixes-20"></a>
### Bugfixes
* api \- remove <code>id to \.id</code> as default requirement which conflicts with RouterOS <code>id</code> configuration parameter \([https\://github\.com/ansible\-collections/community\.routeros/pull/15](https\://github\.com/ansible\-collections/community\.routeros/pull/15)\)\.
@ -861,12 +913,12 @@ Maintenance release with a bugfix for <code>api</code>\.
<a id="v1-0-0"></a>
## v1\.0\.0
<a id="release-summary-36"></a>
<a id="release-summary-39"></a>
### Release Summary
This is the first production \(non\-prerelease\) release of <code>community\.routeros</code>\.
<a id="bugfixes-20"></a>
<a id="bugfixes-21"></a>
### Bugfixes
* routeros terminal plugin \- allow slashes in hostnames for terminal detection\. Without this\, slashes in hostnames will result in connection timeouts \([https\://github\.com/ansible\-collections/community\.network/pull/138](https\://github\.com/ansible\-collections/community\.network/pull/138)\)\.
@ -874,12 +926,12 @@ This is the first production \(non\-prerelease\) release of <code>community\.rou
<a id="v0-1-1"></a>
## v0\.1\.1
<a id="release-summary-37"></a>
<a id="release-summary-40"></a>
### Release Summary
Small improvements and bugfixes over the initial release\.
<a id="bugfixes-21"></a>
<a id="bugfixes-22"></a>
### Bugfixes
* api \- fix crash when the <code>ssl</code> parameter is used \([https\://github\.com/ansible\-collections/community\.routeros/pull/3](https\://github\.com/ansible\-collections/community\.routeros/pull/3)\)\.
@ -887,12 +939,12 @@ Small improvements and bugfixes over the initial release\.
<a id="v0-1-0"></a>
## v0\.1\.0
<a id="release-summary-38"></a>
<a id="release-summary-41"></a>
### Release Summary
The <code>community\.routeros</code> continues the work on the Ansible RouterOS modules from their state in <code>community\.network</code> 1\.2\.0\. The changes listed here are thus relative to the modules <code>community\.network\.routeros\_\*</code>\.
<a id="minor-changes-29"></a>
<a id="minor-changes-31"></a>
### Minor Changes
* facts \- now also collecting data about BGP and OSPF \([https\://github\.com/ansible\-collections/community\.network/pull/101](https\://github\.com/ansible\-collections/community\.network/pull/101)\)\.

View file

@ -4,6 +4,49 @@ Community RouterOS Release Notes
.. contents:: Topics
v3.8.1
======
Release Summary
---------------
Bugfix release.
Bugfixes
--------
- facts and api_facts modules - prevent deprecation warnings when used with ansible-core 2.19 (https://github.com/ansible-collections/community.routeros/pull/384).
v3.8.0
======
Release Summary
---------------
Feature release.
Minor Changes
-------------
- api_info, api_modify - add ``interface ethernet switch port-isolation`` which is supported since RouterOS 6.43 (https://github.com/ansible-collections/community.routeros/pull/375).
- api_info, api_modify - add ``routing bfd configuration``. Officially stabilized BFD support for BGP and OSPF is available since RouterOS 7.11
(https://github.com/ansible-collections/community.routeros/pull/375).
- api_modify, api_info - support API path ``ip ipsec mode-config`` (https://github.com/ansible-collections/community.routeros/pull/376).
v3.7.0
======
Release Summary
---------------
Feature release.
Minor Changes
-------------
- api_find_and_modify - allow to control whether ``dynamic`` and/or ``builtin`` entries are ignored with the new ``ignore_dynamic`` and ``ignore_builtin`` options (https://github.com/ansible-collections/community.routeros/issues/372, https://github.com/ansible-collections/community.routeros/pull/373).
- api_info, api_modify - add ``port-cost-mode`` to ``interface bridge`` which is supported since RouterOS 7.13 (https://github.com/ansible-collections/community.routeros/pull/371).
v3.6.0
======

View file

@ -34,11 +34,11 @@ For more information about communication, see the [Ansible communication guide](
## Tested with Ansible
Tested with the current ansible-core 2.15, ansible-core 2.16, ansible-core 2.17, and ansible-core 2.18 releases and the current development version of ansible-core. Ansible 2.9, ansible-base 2.10, and ansible-core versions before 2.15.0 are not supported.
Tested with the current ansible-core 2.15, ansible-core 2.16, ansible-core 2.17, ansible-core 2.18, and ansible-core 2.19 releases and the current development version of ansible-core. Ansible 2.9, ansible-base 2.10, and ansible-core versions before 2.15.0 are not supported.
## External requirements
The exact requirements for every module are listed in the module documentation.
The exact requirements for every module are listed in the module documentation.
### Supported connections
@ -208,4 +208,4 @@ See [LICENSES/GPL-3.0-or-later.txt](https://github.com/ansible-collections/commu
Parts of the collection are licensed under the [BSD 2-Clause license](https://github.com/ansible-collections/community.routeros/blob/main/LICENSES/BSD-2-Clause.txt).
All files have a machine readable `SDPX-License-Identifier:` comment denoting its respective license(s) or an equivalent entry in an accompanying `.license` file. Only changelog fragments (which will not be part of a release) are covered by a blanket statement in `.reuse/dep5`. This conforms to the [REUSE specification](https://reuse.software/spec/).
All files have a machine readable `SDPX-License-Identifier:` comment denoting its respective license(s) or an equivalent entry in an accompanying `.license` file. Only changelog fragments (which will not be part of a release) are covered by a blanket statement in `REUSE.toml`. This conforms to the [REUSE specification](https://reuse.software/spec/).

View file

@ -10,20 +10,28 @@
[sessions]
[sessions.lint]
# https://ansible.readthedocs.io/projects/antsibull-nox/config-file/#basic-linting-sessions
# disable reformatting for now
run_isort = false
run_black = false
# disable most linters
run_flake8 = false
run_pylint = false
run_yamllint = false
run_yamllint = true
yamllint_config = ".yamllint"
yamllint_config_plugins = ".yamllint-docs"
yamllint_config_plugins_examples = ".yamllint-examples"
yamllint_config_extra_docs = ".yamllint-extra-docs"
run_mypy = false
[sessions.docs_check]
validate_collection_refs="all"
codeblocks_restrict_types = [
"ansible-output",
"ini",
"yaml",
"yaml+jinja",
]
codeblocks_restrict_type_exact_case = true
codeblocks_allow_without_type = false
codeblocks_allow_literal_blocks = false
[sessions.license_check]
@ -32,6 +40,11 @@ run_no_unwanted_files = true
no_unwanted_files_module_extensions = [".py"]
no_unwanted_files_yaml_extensions = [".yml"]
run_action_groups = true
run_no_trailing_whitespace = true
no_trailing_whitespace_skip_directories = [
"tests/unit/plugins/modules/fixtures/",
]
run_avoid_characters = true
[[sessions.extra_checks.action_groups_config]]
name = "api"
@ -39,6 +52,10 @@ pattern = "^api.*$"
exclusions = []
doc_fragment = "community.routeros.attributes.actiongroup_api"
[[sessions.extra_checks.avoid_character_group]]
name = "tab"
regex = "\\x09"
[sessions.build_import_check]
run_galaxy_importer = true
@ -57,3 +74,24 @@ controller_python_versions_only = true
"2.16" = ["3.10"]
"2.17" = ["3.8"]
"2.18" = ["3.9"]
"2.19" = ["3.11"]
[[sessions.ee_check.execution_environments]]
name = "devel-ubi-9"
description = "ansible-core devel @ RHEL UBI 9"
test_playbooks = ["tests/ee/all.yml"]
config.images.base_image.name = "docker.io/redhat/ubi9:latest"
config.dependencies.ansible_core.package_pip = "https://github.com/ansible/ansible/archive/devel.tar.gz"
config.dependencies.ansible_runner.package_pip = "ansible-runner"
config.dependencies.python_interpreter.package_system = "python3.12 python3.12-pip python3.12-wheel python3.12-cryptography"
config.dependencies.python_interpreter.python_path = "/usr/bin/python3.12"
runtime_environment = {"ANSIBLE_PRIVATE_ROLE_VARS" = "true"}
[[sessions.ee_check.execution_environments]]
name = "2.15-rocky-9"
description = "ansible-core 2.15 @ Rocky Linux 9"
test_playbooks = ["tests/ee/all.yml"]
config.images.base_image.name = "quay.io/rockylinux/rockylinux:9"
config.dependencies.ansible_core.package_pip = "https://github.com/ansible/ansible/archive/stable-2.15.tar.gz"
config.dependencies.ansible_runner.package_pip = "ansible-runner"
runtime_environment = {"ANSIBLE_PRIVATE_ROLE_VARS" = "true"}

View file

@ -901,3 +901,46 @@ releases:
- 360-bgp-connection-afi.yml
- 364-wireguard-responder.yml
release_date: '2025-04-21'
3.7.0:
changes:
minor_changes:
- api_find_and_modify - allow to control whether ``dynamic`` and/or ``builtin``
entries are ignored with the new ``ignore_dynamic`` and ``ignore_builtin``
options (https://github.com/ansible-collections/community.routeros/issues/372,
https://github.com/ansible-collections/community.routeros/pull/373).
- api_info, api_modify - add ``port-cost-mode`` to ``interface bridge`` which
is supported since RouterOS 7.13 (https://github.com/ansible-collections/community.routeros/pull/371).
release_summary: Feature release.
fragments:
- 3.7.0.yml
- 371-add-bridge-port-cost-mode.yml
- 373-api_find_and_modify-dynamic-builtin.yml
release_date: '2025-05-31'
3.8.0:
changes:
minor_changes:
- api_info, api_modify - add ``interface ethernet switch port-isolation``
which is supported since RouterOS 6.43 (https://github.com/ansible-collections/community.routeros/pull/375).
- 'api_info, api_modify - add ``routing bfd configuration``. Officially stabilized
BFD support for BGP and OSPF is available since RouterOS 7.11
(https://github.com/ansible-collections/community.routeros/pull/375).
'
- api_modify, api_info - support API path ``ip ipsec mode-config`` (https://github.com/ansible-collections/community.routeros/pull/376).
release_summary: Feature release.
fragments:
- 3.8.0.yml
- 375-port_isolation-and-routing_bfd_configuration.yml
- 376-ipsec-mode-config.yml
release_date: '2025-06-14'
3.8.1:
changes:
bugfixes:
- facts and api_facts modules - prevent deprecation warnings when used with
ansible-core 2.19 (https://github.com/ansible-collections/community.routeros/pull/384).
release_summary: Bugfix release.
fragments:
- 3.8.1.yml
- 384-warnings.yml
release_date: '2025-07-26'

View file

@ -7,9 +7,9 @@ changelog_filename_template: ../CHANGELOG.rst
changelog_filename_version_depth: 0
changes_file: changelog.yaml
changes_format: combined
ignore_other_fragment_extensions: true
keep_fragments: false
mention_ancestor: true
flatmap: true
new_plugins_after_name: removed_features
notesdir: fragments
output_formats:
@ -40,3 +40,4 @@ use_fqcn: true
add_plugin_period: true
changelog_nice_yaml: true
changelog_sort: version
vcs: auto

View file

@ -0,0 +1 @@
release_summary: Feature release.

View file

@ -0,0 +1,3 @@
minor_changes:
- api_info, api_modify - add ``disable-link-local-address`` and ``stale-neighbor-timeout`` fields to ``ipv6 settings`` (https://github.com/ansible-collections/community.routeros/pull/380).
- api_info, api_modify - adjust neighbor limit fields in ``ipv6 settings`` to match RouterOS 7.18 and newer (https://github.com/ansible-collections/community.routeros/pull/380).

View file

@ -0,0 +1,2 @@
minor_changes:
- api_info, api modify - add ``remote-log-format``, ``remote-protocol``, and ``event-delimiter`` to ``system logging action`` (https://github.com/ansible-collections/community.routeros/pull/381).

View file

@ -0,0 +1,2 @@
minor_changes:
- api_info, api_modify - set ``passthrough`` default in ``ip firewall mangle`` to ``true`` for RouterOS 7.19 and newer (https://github.com/ansible-collections/community.routeros/pull/382).

View file

@ -0,0 +1,7 @@
---
minor_changes:
- api_info, api_modify - since RouterOS 7.17 VRF is supported for OVPN server.
It now supports multiple entries, while ``api_modify`` so far only accepted a single entry.
The ``interface ovpn-server server`` path now allows multiple entries
on RouterOS 7.17 and newer
(https://github.com/ansible-collections/community.routeros/pull/383).

View file

@ -0,0 +1,3 @@
---
bugfixes:
- routeros terminal plugin - fix ``terminal_stdout_re`` pattern to handle long system identities when connecting to RouterOS through SSH (https://github.com/ansible-collections/community.routeros/pull/386).

View file

@ -57,7 +57,7 @@ This results in the following output:
}
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Check out the documentation of the :ansplugin:`community.routeros.api module <community.routeros.api#module>` for details on the options.
@ -191,7 +191,7 @@ When this playbook completed successfully, you should be able to use the HTTPS a
.. code-block:: yaml+jinja
- community.routeros.api:
...
# ...
tls: true
validate_certs: true
validate_cert_hostname: true

View file

@ -66,22 +66,22 @@ With the above inventory, you can use the following playbook to execute ``/syste
gather_facts: false
tasks:
- name: Gather system resources
community.routeros.command:
commands:
- /system resource print
register: system_resource_print
- name: Gather system resources
community.routeros.command:
commands:
- /system resource print
register: system_resource_print
- name: Show system resources
debug:
var: system_resource_print.stdout_lines
- name: Show system resources
debug:
var: system_resource_print.stdout_lines
- name: Gather facts
community.routeros.facts:
- name: Gather facts
community.routeros.facts:
- name: Show a fact
debug:
msg: "First IP address: {{ ansible_net_all_ipv4_addresses[0] }}"
- name: Show a fact
debug:
msg: "First IP address: {{ ansible_net_all_ipv4_addresses[0] }}"
This results in the following output:
@ -126,4 +126,4 @@ This results in the following output:
}
PLAY RECAP *******************************************************************************************************
router : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
router : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

View file

@ -7,7 +7,7 @@
namespace: community
name: routeros
version: 3.6.0
version: 3.9.0
readme: README.md
authors:
- Egor Zaitsev (github.com/heuels)
@ -16,7 +16,7 @@ authors:
description: Modules and plugins for MikroTik RouterOS
license:
- GPL-3.0-or-later
#license_file: COPYING
# license_file: COPYING
tags:
- network
- mikrotik

View file

@ -20,6 +20,7 @@ DOCUMENTATION:
- Felix Fontein (@felixfontein)
EXAMPLES: |
---
- name: Join arguments for a RouterOS CLI command
ansible.builtin.set_fact:
arguments: "{{ ['foo=bar', 'comment=foo is bar'] | community.routeros.join }}"

View file

@ -30,6 +30,7 @@ DOCUMENTATION:
- Felix Fontein (@felixfontein)
EXAMPLES: |
---
- name: Convert a list to a dictionary
ansible.builtin.set_fact:
dictionary: "{{ ['foo=bar', 'comment=foo is bar'] | community.routeros.list_to_dict }}"

View file

@ -19,9 +19,11 @@ DOCUMENTATION:
- Felix Fontein (@felixfontein)
EXAMPLES: |
---
- name: Quote a RouterOS CLI command argument
ansible.builtin.set_fact:
quoted: "{{ 'comment=this is a "comment"' | community.routeros.quote_argument }}"
quoted: >-
{{ 'comment=this is a "comment"' | community.routeros.quote_argument }}
# Should result in 'comment="this is a \"comment\""'
RETURN:

View file

@ -19,9 +19,11 @@ DOCUMENTATION:
- Felix Fontein (@felixfontein)
EXAMPLES: |
---
- name: Quote a RouterOS CLI command argument's value
ansible.builtin.set_fact:
quoted: "{{ 'this is a "comment"' | community.routeros.quote_argument_value }}"
quoted: >-
{{ 'this is a "comment"' | community.routeros.quote_argument_value }}
# Should result in '"this is a \"comment\""'
RETURN:

View file

@ -19,9 +19,11 @@ DOCUMENTATION:
- Felix Fontein (@felixfontein)
EXAMPLES: |
---
- name: Split command into list of arguments
ansible.builtin.set_fact:
argument_list: "{{ 'foo=bar comment="foo is bar" baz' | community.routeros.split }}"
argument_list: >-
{{ 'foo=bar comment="foo is bar" baz' | community.routeros.split }}
# Should result in ['foo=bar', 'comment=foo is bar', 'baz']
RETURN:

View file

@ -281,6 +281,7 @@ PATHS = {
versioned_fields=[
([('7.0', '<')], 'ingress-filtering', KeyInfo(default=False)),
([('7.0', '>=')], 'ingress-filtering', KeyInfo(default=True)),
([('7.13', '>=')], 'port-cost-mode', KeyInfo(default='long')),
([('7.16', '>=')], 'forward-reserved-addresses', KeyInfo(default=False)),
([('7.16', '>=')], 'max-learned-entries', KeyInfo(default='auto')),
],
@ -651,13 +652,22 @@ PATHS = {
),
('ip', 'ipsec', 'mode-config'): APIData(
unversioned=VersionedAPIData(
unknown_mechanism=True,
# primary_keys=('default', ),
fully_understood=True,
primary_keys=('name', ),
versioned_fields=[
([('6.43', '>=')], 'responder', KeyInfo(default=False)),
([('6.44', '>=')], 'address', KeyInfo(can_disable=True, remove_value='0.0.0.0')),
],
fields={
'default': KeyInfo(),
'address-pool': KeyInfo(can_disable=True, remove_value='none'),
'address-prefix-length': KeyInfo(),
'comment': KeyInfo(can_disable=True, remove_value=''),
'name': KeyInfo(),
'responder': KeyInfo(),
'use-responder-dns': KeyInfo(),
'split-dns': KeyInfo(can_disable=True, remove_value=''),
'split-include': KeyInfo(can_disable=True, remove_value=''),
'src-address-list': KeyInfo(can_disable=True, remove_value=''),
'static-dns': KeyInfo(can_disable=True, remove_value=''),
'system-dns': KeyInfo(default=False),
},
),
),
@ -1543,13 +1553,19 @@ PATHS = {
fully_understood=True,
versioned_fields=[
([('7.16', '>=')], 'multipath-hash-policy', KeyInfo(default='l3')),
([('7.17', '>=')], 'disable-link-local-address', KeyInfo(default=False)),
([('7.17', '>=')], 'stale-neighbor-timeout', KeyInfo(default=60)),
([('7.18', '>=')], 'allow-fast-path', KeyInfo(default=True)),
([('7.18', '<')], 'max-neighbor-entries', KeyInfo(default=8192)),
([('7.18', '>=')], 'min-neighbor-entries', KeyInfo()),
([('7.18', '>=')], 'soft-max-neighbor-entries', KeyInfo()),
([('7.18', '>=')], 'max-neighbor-entries', KeyInfo()),
],
fields={
'accept-redirects': KeyInfo(default='yes-if-forwarding-disabled'),
'accept-router-advertisements': KeyInfo(default='yes-if-forwarding-disabled'),
'disable-ipv6': KeyInfo(default=False),
'forward': KeyInfo(default=True),
'max-neighbor-entries': KeyInfo(default=8192),
},
),
),
@ -1648,23 +1664,46 @@ PATHS = {
),
),
('interface', 'ovpn-server', 'server'): APIData(
unversioned=VersionedAPIData(
single_value=True,
fully_understood=True,
fields={
'auth': KeyInfo(),
'cipher': KeyInfo(),
'default-profile': KeyInfo(default='default'),
'enabled': KeyInfo(default=False),
'keepalive-timeout': KeyInfo(default=60),
'mac-address': KeyInfo(),
'max-mtu': KeyInfo(default=1500),
'mode': KeyInfo(default='ip'),
'netmask': KeyInfo(default=24),
'port': KeyInfo(default=1194),
'require-client-certificate': KeyInfo(default=False),
},
),
versioned=[
('7.17', '>=', VersionedAPIData(
fully_understood=True,
fields={
'auth': KeyInfo(),
'cipher': KeyInfo(),
'default-profile': KeyInfo(default='default'),
'enabled': KeyInfo(default=False),
'keepalive-timeout': KeyInfo(default=60),
'mac-address': KeyInfo(),
'max-mtu': KeyInfo(default=1500),
'mode': KeyInfo(default='ip'),
'name': KeyInfo(default=''),
'netmask': KeyInfo(default=24),
'port': KeyInfo(default=1194),
'protocol': KeyInfo(default='tcp'),
'require-client-certificate': KeyInfo(default=False),
'vrf': KeyInfo(default='main'),
},
)),
('7.17', '<', VersionedAPIData(
single_value=True,
fully_understood=True,
fields={
'auth': KeyInfo(),
'cipher': KeyInfo(),
'default-profile': KeyInfo(default='default'),
'enabled': KeyInfo(default=False),
'keepalive-timeout': KeyInfo(default=60),
'mac-address': KeyInfo(),
'max-mtu': KeyInfo(default=1500),
'mode': KeyInfo(default='ip'),
'name': KeyInfo(default=''),
'netmask': KeyInfo(default=24),
'port': KeyInfo(default=1194),
'protocol': KeyInfo(default='tcp'),
'require-client-certificate': KeyInfo(default=False),
},
))
]
),
('interface', 'pppoe-server', 'server'): APIData(
unversioned=VersionedAPIData(
@ -3135,6 +3174,10 @@ PATHS = {
unversioned=VersionedAPIData(
fully_understood=True,
stratify_keys=('chain', ),
versioned_fields=[
([('7.19', '<')], 'passthrough', KeyInfo(can_disable=True)),
([('7.19', '>=')], 'passthrough', KeyInfo(default=True)),
],
fields={
'action': KeyInfo(),
'address-list': KeyInfo(can_disable=True),
@ -3186,7 +3229,6 @@ PATHS = {
'p2p': KeyInfo(can_disable=True),
'packet-mark': KeyInfo(can_disable=True),
'packet-size': KeyInfo(can_disable=True),
'passthrough': KeyInfo(can_disable=True),
'per-connection-classifier': KeyInfo(can_disable=True),
'port': KeyInfo(can_disable=True),
'priority': KeyInfo(can_disable=True),
@ -4177,6 +4219,28 @@ PATHS = {
},
),
),
('routing', 'bfd', 'configuration'): APIData(
versioned=[
('7.11', '>=', VersionedAPIData(
fully_understood=True,
fields={
'address-list': KeyInfo(),
'addresses': KeyInfo(),
'comment': KeyInfo(can_disable=True, remove_value=''),
'copy-from': KeyInfo(),
'disabled': KeyInfo(default=False),
'forbid-bfd': KeyInfo(),
'interfaces': KeyInfo(),
'min-echo-rx': KeyInfo(),
'min-rx': KeyInfo(),
'min-tx': KeyInfo(),
'multiplier': KeyInfo(),
'place-before': KeyInfo(),
'vrf': KeyInfo(),
},
))
],
),
('routing', 'bfd', 'interface'): APIData(
unversioned=VersionedAPIData(
unknown_mechanism=True,
@ -4893,6 +4957,18 @@ PATHS = {
},
),
),
('interface', 'ethernet', 'switch', 'port-isolation'): APIData(
versioned=[
('6.43', '>=', VersionedAPIData(
primary_keys=('name', ),
fully_understood=True,
fields={
'forwarding-override': KeyInfo(),
'name': KeyInfo(),
},
)),
],
),
('ip', 'dhcp-client', 'option'): APIData(
unversioned=VersionedAPIData(
fixed_entries=True,
@ -5168,6 +5244,11 @@ PATHS = {
unversioned=VersionedAPIData(
fully_understood=True,
primary_keys=('name',),
versioned_fields=[
([('7.18', '>=')], 'remote-log-format', KeyInfo(default='default')),
([('7.18', '>=')], 'remote-protocol', KeyInfo(default='udp')),
([('7.18', '>=')], 'cef-event-delimiter', KeyInfo(default='\r\n')),
],
fields={
'bsd-syslog': KeyInfo(default=False),
'comment': KeyInfo(can_disable=True, remove_value=''),

View file

@ -164,6 +164,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Get example - ip address print
community.routeros.api:
hostname: "{{ hostname }}"

View file

@ -55,6 +55,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Collect all facts from the device
community.routeros.api_facts:
hostname: 192.168.88.1
@ -418,8 +419,6 @@ FACT_SUBSETS = dict(
VALID_SUBSETS = frozenset(FACT_SUBSETS.keys())
warnings = []
def main():
argument_spec = dict(
@ -484,7 +483,7 @@ def main():
key = 'ansible_net_%s' % key
ansible_facts[key] = value
module.exit_json(ansible_facts=ansible_facts, warnings=warnings)
module.exit_json(ansible_facts=ansible_facts)
if __name__ == '__main__':

View file

@ -75,6 +75,22 @@ options:
- Whether to allow that no match is found.
- If not specified, this value is induced from whether O(require_matches_min) is 0 or larger.
type: bool
ignore_dynamic:
description:
- Whether to ignore dynamic entries.
- By default, they are considered. If set to V(true), they are not considered.
- It is generally recommended to set this to V(true) unless when you really need to modify dynamic entries.
type: bool
default: false
version_added: 3.7.0
ignore_builtin:
description:
- Whether to ignore builtin entries.
- By default, they are considered. If set to V(true), they are not considered.
- It is generally recommended to set this to V(true) unless when you really need to modify builtin entries.
type: bool
default: false
version_added: 3.7.0
seealso:
- module: community.routeros.api
- module: community.routeros.api_facts
@ -83,6 +99,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Rename bridge from 'bridge' to 'my-bridge'
community.routeros.api_find_and_modify:
hostname: "{{ hostname }}"
@ -93,6 +110,10 @@ EXAMPLES = r"""
name: bridge
values:
name: my-bridge
# Always ignore dynamic and builtin entries
# (not relevant for this path, but generally recommended)
ignore_dynamic: true
ignore_builtin: true
- name: Change IP address to 192.168.1.1 for interface bridge - assuming there is only one
community.routeros.api_find_and_modify:
@ -104,10 +125,14 @@ EXAMPLES = r"""
interface: bridge
values:
address: "192.168.1.1/24"
# If there are zero entries, or more than one: fail! We expected that
# exactly one is configured.
# If there are zero entries, or more than one: fail! We expected that
# exactly one is configured.
require_matches_min: 1
require_matches_max: 1
# Always ignore dynamic and builtin entries
# (not relevant for this path, but generally recommended)
ignore_dynamic: true
ignore_builtin: true
"""
RETURN = r"""
@ -184,6 +209,17 @@ def compose_api_path(api, path):
return api_path
def filter_entries(entries, ignore_dynamic=False, ignore_builtin=False):
result = []
for entry in entries:
if ignore_dynamic and entry.get('dynamic', False):
continue
if ignore_builtin and entry.get('builtin', False):
continue
result.append(entry)
return result
DISABLED_MEANS_EMPTY_STRING = ('comment', )
@ -195,6 +231,8 @@ def main():
require_matches_min=dict(type='int', default=0),
require_matches_max=dict(type='int'),
allow_no_matches=dict(type='bool'),
ignore_dynamic=dict(type='bool', default=False),
ignore_builtin=dict(type='bool', default=False),
)
module_args.update(api_argument_spec())
@ -222,6 +260,9 @@ def main():
if key in values:
module.fail_json(msg='`values` must not contain both "{key}" and "!{key}"!'.format(key=key))
ignore_dynamic = module.params['ignore_dynamic']
ignore_builtin = module.params['ignore_builtin']
check_has_library(module)
api = create_api(module)
@ -229,7 +270,7 @@ def main():
api_path = compose_api_path(api, path)
old_data = list(api_path)
old_data = filter_entries(list(api_path), ignore_dynamic=ignore_dynamic, ignore_builtin=ignore_builtin)
new_data = [entry.copy() for entry in old_data]
# Find matching entries
@ -298,7 +339,7 @@ def main():
error=to_native(e),
)
)
new_data = list(api_path)
new_data = filter_entries(list(api_path), ignore_dynamic=ignore_dynamic, ignore_builtin=ignore_builtin)
# Produce return value
more = {}

View file

@ -68,6 +68,7 @@ options:
- interface ethernet poe
- interface ethernet switch
- interface ethernet switch port
- interface ethernet switch port-isolation
- interface gre
- interface gre6
- interface l2tp-client
@ -148,6 +149,7 @@ options:
- ip firewall service-port
- ip hotspot service-port
- ip ipsec identity
- ip ipsec mode-config
- ip ipsec peer
- ip ipsec policy
- ip ipsec profile
@ -202,6 +204,7 @@ options:
- queue type
- radius
- radius incoming
- routing bfd configuration
- routing bgp aggregate
- routing bgp connection
- routing bgp instance
@ -324,6 +327,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Get IP addresses
community.routeros.api_info:
hostname: "{{ hostname }}"

View file

@ -79,6 +79,7 @@ options:
- interface ethernet poe
- interface ethernet switch
- interface ethernet switch port
- interface ethernet switch port-isolation
- interface gre
- interface gre6
- interface l2tp-client
@ -159,6 +160,7 @@ options:
- ip firewall service-port
- ip hotspot service-port
- ip ipsec identity
- ip ipsec mode-config
- ip ipsec peer
- ip ipsec policy
- ip ipsec profile
@ -213,6 +215,7 @@ options:
- queue type
- radius
- radius incoming
- routing bfd configuration
- routing bgp aggregate
- routing bgp connection
- routing bgp instance
@ -360,6 +363,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Setup DHCP server networks
# Ensures that we have exactly two DHCP server networks (in the specified order)
community.routeros.api_modify:

View file

@ -77,6 +77,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Run command on remote devices
community.routeros.command:
commands: /system routerboard print

View file

@ -42,6 +42,7 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Collect all facts from the device
community.routeros.facts:
gather_subset: all
@ -588,8 +589,6 @@ FACT_SUBSETS = dict(
VALID_SUBSETS = frozenset(FACT_SUBSETS.keys())
warnings = list()
def main():
"""main entry point for module execution
@ -652,7 +651,7 @@ def main():
key = 'ansible_net_%s' % key
ansible_facts[key] = value
module.exit_json(ansible_facts=ansible_facts, warnings=warnings)
module.exit_json(ansible_facts=ansible_facts)
if __name__ == '__main__':

View file

@ -31,7 +31,9 @@ class TerminalModule(TerminalBase):
terminal_stdout_re = [
re.compile(br"\x1b<"),
re.compile(br"\[[\w\-\.]+\@[\w\s\-\.\/]+\] ?(<SAFE)?> ?$"),
re.compile(
br"((\[[\w\-\.]+\@)|(\r\<(([\w\-\.]*\@)|)))"
br"[\w\s\-\.\/]+\] ?(<SAFE)?> ?$"),
re.compile(br"Please press \"Enter\" to continue!"),
re.compile(br"Do you want to see the software license\? \[Y\/n\]: ?"),
]

View file

@ -22,7 +22,7 @@
assert:
that:
- >-
result.msg == "Unexpected end of string during escaped parameter"
"Unexpected end of string during escaped parameter" in result.msg
- name: "Test quote_argument filter"
assert:

View file

@ -4,4 +4,4 @@
# SPDX-License-Identifier: GPL-3.0-or-later
collections:
- ansible.netcommon
- ansible.netcommon

View file

@ -0,0 +1 @@
tests/update-docs.py shebang

View file

@ -0,0 +1,3 @@
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-FileCopyrightText: Ansible Project

View file

@ -94,6 +94,52 @@ START_IP_FIREWALL_FILTER = [
START_IP_FIREWALL_FILTER_OLD_DATA = massage_expected_result_data(START_IP_FIREWALL_FILTER, ('ip', 'firewall', 'filter'), keep_all=True)
START_IP_SERVICE = [
# I removed all entryes not for 'api' and 'api-ssl'
{
"certificate": None,
"tls-version": None,
".id": "*7",
"address": "",
"disabled": True,
"dynamic": False,
"invalid": True,
"name": "api",
"port": 8728,
"proto": "tcp",
"vrf": "main"
},
{
".id": "*9",
"address": "192.168.1.0/24",
"certificate": "mycert",
"dynamic": False,
"invalid": False,
"name": "api-ssl",
"port": 8729,
"proto": "tcp",
"tls-version": "only-1.2",
"vrf": "main"
},
{
"address": None,
"certificate": None,
"max-sessions": None,
"tls-version": None,
".id": "*13",
"connection": True,
"dynamic": True,
"invalid": False,
"local": "192.168.1.1",
"name": "api-ssl",
"port": 8729,
"proto": "tcp",
"remote": "192.168.1.2:12346"
}
]
START_IP_SERVICE_OLD_DATA = massage_expected_result_data(START_IP_SERVICE, ('ip', 'service'), keep_all=True)
class TestRouterosApiFindAndModifyModule(ModuleTestCase):
@ -685,3 +731,29 @@ class TestRouterosApiFindAndModifyModule(ModuleTestCase):
])
self.assertEqual(result['match_count'], 3)
self.assertEqual(result['modify_count'], 2)
@patch('ansible_collections.community.routeros.plugins.modules.api_find_and_modify.compose_api_path',
new=create_fake_path(('ip', 'service'), START_IP_SERVICE))
def test_change_ignore_dynamic(self):
with self.assertRaises(AnsibleExitJson) as exc:
args = self.config_module_args.copy()
args.update({
'path': 'ip service',
'find': {
'name': 'api-ssl',
},
'values': {
'address': '192.168.1.0/24',
},
'ignore_dynamic': True,
'_ansible_diff': True,
})
with set_module_args(args):
self.module.main()
result = exc.exception.args[0]
self.assertEqual(result['changed'], False)
self.assertEqual(result['old_data'], [entry for entry in START_IP_SERVICE_OLD_DATA if entry["dynamic"] is False])
self.assertEqual(result['new_data'], [entry for entry in START_IP_SERVICE_OLD_DATA if entry["dynamic"] is False])
self.assertEqual(result['match_count'], 1)
self.assertEqual(result['modify_count'], 0)