Compare commits

..

No commits in common. "main" and "3.6.0" have entirely different histories.
main ... 3.6.0

43 changed files with 411 additions and 884 deletions

View file

@ -1,6 +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
# 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

159
.github/workflows/ee.yml vendored Normal file
View file

@ -0,0 +1,159 @@
---
# 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,7 +4,6 @@
/tests/output/
/changelogs/.plugin-cache.yaml
/tests/integration/inventory
# Byte-compiled / optimized / DLL files
__pycache__/

View file

@ -1,53 +0,0 @@
---
# 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

View file

@ -1,54 +0,0 @@
---
# 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

View file

@ -1,54 +0,0 @@
---
# 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

View file

@ -1,53 +0,0 @@
---
# 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,211 +2,159 @@
**Topics**
- <a href="#v3-8-1">v3\.8\.1</a>
- <a href="#release-summary">Release Summary</a>
- <a href="#bugfixes">Bugfixes</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-2">Minor Changes</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-4">Release Summary</a>
- <a href="#minor-changes-3">Minor Changes</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-5">Release Summary</a>
- <a href="#minor-changes-4">Minor Changes</a>
- <a href="#bugfixes-1">Bugfixes</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="#release-summary-6">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</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="#release-summary-7">Release Summary</a>
- <a href="#minor-changes-6">Minor Changes</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="#release-summary-8">Release Summary</a>
- <a href="#minor-changes-7">Minor Changes</a>
- <a href="#bugfixes-2">Bugfixes</a>
- <a href="#release-summary-5">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</a>
- <a href="#bugfixes-1">Bugfixes</a>
- <a href="#v3-0-0">v3\.0\.0</a>
- <a href="#release-summary-9">Release Summary</a>
- <a href="#release-summary-6">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-10">Release Summary</a>
- <a href="#minor-changes-8">Minor Changes</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-11">Release Summary</a>
- <a href="#minor-changes-9">Minor Changes</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-12">Release Summary</a>
- <a href="#minor-changes-10">Minor Changes</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-3">Bugfixes</a>
- <a href="#bugfixes-2">Bugfixes</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="#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="#release-summary-14">Release Summary</a>
- <a href="#minor-changes-12">Minor Changes</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="#release-summary-15">Release Summary</a>
- <a href="#minor-changes-13">Minor Changes</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-16">Release Summary</a>
- <a href="#minor-changes-14">Minor Changes</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-17">Release Summary</a>
- <a href="#minor-changes-15">Minor Changes</a>
- <a href="#bugfixes-4">Bugfixes</a>
- <a href="#release-summary-14">Release Summary</a>
- <a href="#minor-changes-13">Minor Changes</a>
- <a href="#bugfixes-3">Bugfixes</a>
- <a href="#v2-12-0">v2\.12\.0</a>
- <a href="#release-summary-18">Release Summary</a>
- <a href="#minor-changes-16">Minor Changes</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="#release-summary-19">Release Summary</a>
- <a href="#minor-changes-17">Minor Changes</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="#release-summary-20">Release Summary</a>
- <a href="#minor-changes-18">Minor Changes</a>
- <a href="#bugfixes-5">Bugfixes</a>
- <a href="#release-summary-17">Release Summary</a>
- <a href="#minor-changes-16">Minor Changes</a>
- <a href="#bugfixes-4">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="#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="#release-summary-22">Release Summary</a>
- <a href="#release-summary-19">Release Summary</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#v2-8-2">v2\.8\.2</a>
- <a href="#release-summary-23">Release Summary</a>
- <a href="#bugfixes-7">Bugfixes</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-24">Release Summary</a>
- <a href="#bugfixes-8">Bugfixes</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-25">Release Summary</a>
- <a href="#minor-changes-20">Minor Changes</a>
- <a href="#bugfixes-9">Bugfixes</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-26">Release Summary</a>
- <a href="#minor-changes-21">Minor Changes</a>
- <a href="#bugfixes-10">Bugfixes</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="#release-summary-27">Release Summary</a>
- <a href="#minor-changes-22">Minor Changes</a>
- <a href="#bugfixes-11">Bugfixes</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="#release-summary-28">Release Summary</a>
- <a href="#minor-changes-23">Minor Changes</a>
- <a href="#bugfixes-12">Bugfixes</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="#release-summary-29">Release Summary</a>
- <a href="#minor-changes-24">Minor Changes</a>
- <a href="#bugfixes-13">Bugfixes</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="#release-summary-30">Release Summary</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="#release-summary-31">Release Summary</a>
- <a href="#minor-changes-25">Minor Changes</a>
- <a href="#bugfixes-14">Bugfixes</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="#release-summary-32">Release Summary</a>
- <a href="#bugfixes-15">Bugfixes</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-33">Release Summary</a>
- <a href="#minor-changes-26">Minor Changes</a>
- <a href="#bugfixes-16">Bugfixes</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="#release-summary-34">Release Summary</a>
- <a href="#minor-changes-27">Minor Changes</a>
- <a href="#bugfixes-17">Bugfixes</a>
- <a href="#release-summary-31">Release Summary</a>
- <a href="#minor-changes-25">Minor Changes</a>
- <a href="#bugfixes-16">Bugfixes</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#v2-0-0">v2\.0\.0</a>
- <a href="#release-summary-35">Release Summary</a>
- <a href="#minor-changes-28">Minor Changes</a>
- <a href="#release-summary-32">Release Summary</a>
- <a href="#minor-changes-26">Minor Changes</a>
- <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a>
- <a href="#bugfixes-18">Bugfixes</a>
- <a href="#bugfixes-17">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-36">Release Summary</a>
- <a href="#minor-changes-29">Minor Changes</a>
- <a href="#bugfixes-19">Bugfixes</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-37">Release Summary</a>
- <a href="#minor-changes-30">Minor Changes</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-38">Release Summary</a>
- <a href="#bugfixes-20">Bugfixes</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-39">Release Summary</a>
- <a href="#bugfixes-21">Bugfixes</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-40">Release Summary</a>
- <a href="#bugfixes-22">Bugfixes</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-41">Release Summary</a>
- <a href="#minor-changes-31">Minor Changes</a>
- <a href="#release-summary-38">Release Summary</a>
- <a href="#minor-changes-29">Minor Changes</a>
<a id="v3-8-1"></a>
## v3\.8\.1
<a id="v3-6-0"></a>
## v3\.6\.0
<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)\)\.
@ -214,12 +162,12 @@ Feature release\.
<a id="v3-5-0"></a>
## v3\.5\.0
<a id="release-summary-4"></a>
<a id="release-summary-1"></a>
### Release Summary
Feature release\.
<a id="minor-changes-3"></a>
<a id="minor-changes-1"></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)\)\.
@ -227,17 +175,17 @@ Feature release\.
<a id="v3-4-0"></a>
## v3\.4\.0
<a id="release-summary-5"></a>
<a id="release-summary-2"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-4"></a>
<a id="minor-changes-2"></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-1"></a>
<a id="bugfixes"></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)\)\.
@ -245,12 +193,12 @@ Feature and bugfix release\.
<a id="v3-3-0"></a>
## v3\.3\.0
<a id="release-summary-6"></a>
<a id="release-summary-3"></a>
### Release Summary
Feature release\.
<a id="minor-changes-5"></a>
<a id="minor-changes-3"></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)\)\.
@ -261,12 +209,12 @@ Feature release\.
<a id="v3-2-0"></a>
## v3\.2\.0
<a id="release-summary-7"></a>
<a id="release-summary-4"></a>
### Release Summary
Feature release\.
<a id="minor-changes-6"></a>
<a id="minor-changes-4"></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)\)\.
@ -274,17 +222,17 @@ Feature release\.
<a id="v3-1-0"></a>
## v3\.1\.0
<a id="release-summary-8"></a>
<a id="release-summary-5"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-7"></a>
<a id="minor-changes-5"></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-2"></a>
<a id="bugfixes-1"></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)\)\.
@ -292,7 +240,7 @@ Bugfix and feature release\.
<a id="v3-0-0"></a>
## v3\.0\.0
<a id="release-summary-9"></a>
<a id="release-summary-6"></a>
### Release Summary
Major release that drops support for End of Life Python versions and fixes check mode for community\.routeros\.command\.
@ -310,12 +258,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-10"></a>
<a id="release-summary-7"></a>
### Release Summary
Feature release\.
<a id="minor-changes-8"></a>
<a id="minor-changes-6"></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)\)\.
@ -326,12 +274,12 @@ Feature release\.
<a id="v2-19-0"></a>
## v2\.19\.0
<a id="release-summary-11"></a>
<a id="release-summary-8"></a>
### Release Summary
Feature release\.
<a id="minor-changes-9"></a>
<a id="minor-changes-7"></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)\)\.
@ -343,12 +291,12 @@ Feature release\.
<a id="v2-18-0"></a>
## v2\.18\.0
<a id="release-summary-12"></a>
<a id="release-summary-9"></a>
### Release Summary
Feature release\.
<a id="minor-changes-10"></a>
<a id="minor-changes-8"></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)\)\.
@ -364,7 +312,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-3"></a>
<a id="bugfixes-2"></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)\)\.
@ -372,12 +320,12 @@ Feature release\.
<a id="v2-17-0"></a>
## v2\.17\.0
<a id="release-summary-13"></a>
<a id="release-summary-10"></a>
### Release Summary
Feature release\.
<a id="minor-changes-11"></a>
<a id="minor-changes-9"></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)\)\.
@ -387,12 +335,12 @@ Feature release\.
<a id="v2-16-0"></a>
## v2\.16\.0
<a id="release-summary-14"></a>
<a id="release-summary-11"></a>
### Release Summary
Feature release\.
<a id="minor-changes-12"></a>
<a id="minor-changes-10"></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)\)\.
@ -401,12 +349,12 @@ Feature release\.
<a id="v2-15-0"></a>
## v2\.15\.0
<a id="release-summary-15"></a>
<a id="release-summary-12"></a>
### Release Summary
Feature release\.
<a id="minor-changes-13"></a>
<a id="minor-changes-11"></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)\)\.
@ -423,12 +371,12 @@ Feature release\.
<a id="v2-14-0"></a>
## v2\.14\.0
<a id="release-summary-16"></a>
<a id="release-summary-13"></a>
### Release Summary
Feature release\.
<a id="minor-changes-14"></a>
<a id="minor-changes-12"></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)\)\.
@ -438,18 +386,18 @@ Feature release\.
<a id="v2-13-0"></a>
## v2\.13\.0
<a id="release-summary-17"></a>
<a id="release-summary-14"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-15"></a>
<a id="minor-changes-13"></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-4"></a>
<a id="bugfixes-3"></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)\)\.
@ -457,12 +405,12 @@ Bugfix and feature release\.
<a id="v2-12-0"></a>
## v2\.12\.0
<a id="release-summary-18"></a>
<a id="release-summary-15"></a>
### Release Summary
Feature release\.
<a id="minor-changes-16"></a>
<a id="minor-changes-14"></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)\)\.
@ -476,12 +424,12 @@ Feature release\.
<a id="v2-11-0"></a>
## v2\.11\.0
<a id="release-summary-19"></a>
<a id="release-summary-16"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-17"></a>
<a id="minor-changes-15"></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)\)
@ -496,12 +444,12 @@ Feature and bugfix release\.
<a id="v2-10-0"></a>
## v2\.10\.0
<a id="release-summary-20"></a>
<a id="release-summary-17"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-18"></a>
<a id="minor-changes-16"></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)\)\.
@ -525,7 +473,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-5"></a>
<a id="bugfixes-4"></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)\)\.
@ -533,18 +481,18 @@ Bugfix and feature release\.
<a id="v2-9-0"></a>
## v2\.9\.0
<a id="release-summary-21"></a>
<a id="release-summary-18"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-19"></a>
<a id="minor-changes-17"></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-6"></a>
<a id="bugfixes-5"></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)\)\.
@ -552,7 +500,7 @@ Bugfix and feature release\.
<a id="v2-8-3"></a>
## v2\.8\.3
<a id="release-summary-22"></a>
<a id="release-summary-19"></a>
### Release Summary
Maintenance release with updated documentation\.
@ -573,12 +521,12 @@ 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-23"></a>
<a id="release-summary-20"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes-7"></a>
<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)\)\.
@ -586,12 +534,12 @@ Bugfix release\.
<a id="v2-8-1"></a>
## v2\.8\.1
<a id="release-summary-24"></a>
<a id="release-summary-21"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes-8"></a>
<a id="bugfixes-7"></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)\)\.
@ -599,12 +547,12 @@ Bugfix release\.
<a id="v2-8-0"></a>
## v2\.8\.0
<a id="release-summary-25"></a>
<a id="release-summary-22"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-20"></a>
<a id="minor-changes-18"></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)\)\.
@ -614,7 +562,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-9"></a>
<a id="bugfixes-8"></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)\)\.
@ -624,17 +572,17 @@ Bugfix and feature release\.
<a id="v2-7-0"></a>
## v2\.7\.0
<a id="release-summary-26"></a>
<a id="release-summary-23"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-21"></a>
<a id="minor-changes-19"></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-10"></a>
<a id="bugfixes-9"></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)\)\.
@ -642,18 +590,18 @@ Bugfix and feature release\.
<a id="v2-6-0"></a>
## v2\.6\.0
<a id="release-summary-27"></a>
<a id="release-summary-24"></a>
### Release Summary
Regular bugfix and feature release\.
<a id="minor-changes-22"></a>
<a id="minor-changes-20"></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-11"></a>
<a id="bugfixes-10"></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)\)\.
@ -662,17 +610,17 @@ Regular bugfix and feature release\.
<a id="v2-5-0"></a>
## v2\.5\.0
<a id="release-summary-28"></a>
<a id="release-summary-25"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-23"></a>
<a id="minor-changes-21"></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-12"></a>
<a id="bugfixes-11"></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)\)\.
@ -680,12 +628,12 @@ Feature and bugfix release\.
<a id="v2-4-0"></a>
## v2\.4\.0
<a id="release-summary-29"></a>
<a id="release-summary-26"></a>
### Release Summary
Feature release improving the <code>api\*</code> modules\.
<a id="minor-changes-24"></a>
<a id="minor-changes-22"></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)\)\.
@ -706,7 +654,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-13"></a>
<a id="bugfixes-12"></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)\)\.
@ -724,7 +672,7 @@ Feature release improving the <code>api\*</code> modules\.
<a id="v2-3-1"></a>
## v2\.3\.1
<a id="release-summary-30"></a>
<a id="release-summary-27"></a>
### Release Summary
Maintenance release with improved documentation\.
@ -737,19 +685,19 @@ Maintenance release with improved documentation\.
<a id="v2-3-0"></a>
## v2\.3\.0
<a id="release-summary-31"></a>
<a id="release-summary-28"></a>
### Release Summary
Feature and bugfix release\.
<a id="minor-changes-25"></a>
<a id="minor-changes-23"></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-14"></a>
<a id="bugfixes-13"></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)\)\.
@ -757,12 +705,12 @@ Feature and bugfix release\.
<a id="v2-2-1"></a>
## v2\.2\.1
<a id="release-summary-32"></a>
<a id="release-summary-29"></a>
### Release Summary
Bugfix release\.
<a id="bugfixes-15"></a>
<a id="bugfixes-14"></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)\)\.
@ -771,17 +719,17 @@ Bugfix release\.
<a id="v2-2-0"></a>
## v2\.2\.0
<a id="release-summary-33"></a>
<a id="release-summary-30"></a>
### Release Summary
New feature release\.
<a id="minor-changes-26"></a>
<a id="minor-changes-24"></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-16"></a>
<a id="bugfixes-15"></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)\)\.
@ -795,12 +743,12 @@ New feature release\.
<a id="v2-1-0"></a>
## v2\.1\.0
<a id="release-summary-34"></a>
<a id="release-summary-31"></a>
### Release Summary
Feature and bugfix release with new modules\.
<a id="minor-changes-27"></a>
<a id="minor-changes-25"></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)\)\.
@ -809,7 +757,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-17"></a>
<a id="bugfixes-16"></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)\)\.
@ -824,12 +772,12 @@ Feature and bugfix release with new modules\.
<a id="v2-0-0"></a>
## v2\.0\.0
<a id="release-summary-35"></a>
<a id="release-summary-32"></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-28"></a>
<a id="minor-changes-26"></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)\)\.
@ -843,7 +791,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-18"></a>
<a id="bugfixes-17"></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)\)\.
@ -865,12 +813,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-36"></a>
<a id="release-summary-33"></a>
### Release Summary
Bugfix and feature release\.
<a id="minor-changes-29"></a>
<a id="minor-changes-27"></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)\)\.
@ -878,7 +826,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-19"></a>
<a id="bugfixes-18"></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)\)\.
@ -886,12 +834,12 @@ Bugfix and feature release\.
<a id="v1-1-0"></a>
## v1\.1\.0
<a id="release-summary-37"></a>
<a id="release-summary-34"></a>
### Release Summary
This release allow dashes in usernames for SSH\-based modules\.
<a id="minor-changes-30"></a>
<a id="minor-changes-28"></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)\)\.
@ -900,12 +848,12 @@ This release allow dashes in usernames for SSH\-based modules\.
<a id="v1-0-1"></a>
## v1\.0\.1
<a id="release-summary-38"></a>
<a id="release-summary-35"></a>
### Release Summary
Maintenance release with a bugfix for <code>api</code>\.
<a id="bugfixes-20"></a>
<a id="bugfixes-19"></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)\)\.
@ -913,12 +861,12 @@ Maintenance release with a bugfix for <code>api</code>\.
<a id="v1-0-0"></a>
## v1\.0\.0
<a id="release-summary-39"></a>
<a id="release-summary-36"></a>
### Release Summary
This is the first production \(non\-prerelease\) release of <code>community\.routeros</code>\.
<a id="bugfixes-21"></a>
<a id="bugfixes-20"></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)\)\.
@ -926,12 +874,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-40"></a>
<a id="release-summary-37"></a>
### Release Summary
Small improvements and bugfixes over the initial release\.
<a id="bugfixes-22"></a>
<a id="bugfixes-21"></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)\)\.
@ -939,12 +887,12 @@ Small improvements and bugfixes over the initial release\.
<a id="v0-1-0"></a>
## v0\.1\.0
<a id="release-summary-41"></a>
<a id="release-summary-38"></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-31"></a>
<a id="minor-changes-29"></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,49 +4,6 @@ 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, 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.
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.
## 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.toml`. 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/dep5`. This conforms to the [REUSE specification](https://reuse.software/spec/).

View file

@ -10,28 +10,20 @@
[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 = true
yamllint_config = ".yamllint"
yamllint_config_plugins = ".yamllint-docs"
yamllint_config_plugins_examples = ".yamllint-examples"
yamllint_config_extra_docs = ".yamllint-extra-docs"
run_yamllint = false
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]
@ -40,11 +32,6 @@ 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"
@ -52,10 +39,6 @@ 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
@ -74,24 +57,3 @@ 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,46 +901,3 @@ 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,4 +40,3 @@ use_fqcn: true
add_plugin_period: true
changelog_nice_yaml: true
changelog_sort: version
vcs: auto

View file

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

View file

@ -1,3 +0,0 @@
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

@ -1,2 +0,0 @@
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

@ -1,2 +0,0 @@
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

@ -1,7 +0,0 @@
---
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

@ -1,3 +0,0 @@
---
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.9.0
version: 3.6.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,7 +20,6 @@ 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,7 +30,6 @@ 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,11 +19,9 @@ 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,11 +19,9 @@ 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,11 +19,9 @@ 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,7 +281,6 @@ 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')),
],
@ -652,22 +651,13 @@ PATHS = {
),
('ip', 'ipsec', 'mode-config'): APIData(
unversioned=VersionedAPIData(
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')),
],
unknown_mechanism=True,
# primary_keys=('default', ),
fields={
'address-pool': KeyInfo(can_disable=True, remove_value='none'),
'address-prefix-length': KeyInfo(),
'comment': KeyInfo(can_disable=True, remove_value=''),
'default': KeyInfo(),
'name': 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),
'responder': KeyInfo(),
'use-responder-dns': KeyInfo(),
},
),
),
@ -1553,19 +1543,13 @@ 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),
},
),
),
@ -1664,46 +1648,23 @@ PATHS = {
),
),
('interface', 'ovpn-server', 'server'): APIData(
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),
},
))
]
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),
},
),
),
('interface', 'pppoe-server', 'server'): APIData(
unversioned=VersionedAPIData(
@ -3174,10 +3135,6 @@ 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),
@ -3229,6 +3186,7 @@ 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),
@ -4219,28 +4177,6 @@ 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,
@ -4957,18 +4893,6 @@ 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,
@ -5244,11 +5168,6 @@ 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,7 +164,6 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Get example - ip address print
community.routeros.api:
hostname: "{{ hostname }}"

View file

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

View file

@ -75,22 +75,6 @@ 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
@ -99,7 +83,6 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Rename bridge from 'bridge' to 'my-bridge'
community.routeros.api_find_and_modify:
hostname: "{{ hostname }}"
@ -110,10 +93,6 @@ 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:
@ -125,14 +104,10 @@ 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"""
@ -209,17 +184,6 @@ 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', )
@ -231,8 +195,6 @@ 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())
@ -260,9 +222,6 @@ 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)
@ -270,7 +229,7 @@ def main():
api_path = compose_api_path(api, path)
old_data = filter_entries(list(api_path), ignore_dynamic=ignore_dynamic, ignore_builtin=ignore_builtin)
old_data = list(api_path)
new_data = [entry.copy() for entry in old_data]
# Find matching entries
@ -339,7 +298,7 @@ def main():
error=to_native(e),
)
)
new_data = filter_entries(list(api_path), ignore_dynamic=ignore_dynamic, ignore_builtin=ignore_builtin)
new_data = list(api_path)
# Produce return value
more = {}

View file

@ -68,7 +68,6 @@ options:
- interface ethernet poe
- interface ethernet switch
- interface ethernet switch port
- interface ethernet switch port-isolation
- interface gre
- interface gre6
- interface l2tp-client
@ -149,7 +148,6 @@ 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
@ -204,7 +202,6 @@ options:
- queue type
- radius
- radius incoming
- routing bfd configuration
- routing bgp aggregate
- routing bgp connection
- routing bgp instance
@ -327,7 +324,6 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Get IP addresses
community.routeros.api_info:
hostname: "{{ hostname }}"

View file

@ -79,7 +79,6 @@ options:
- interface ethernet poe
- interface ethernet switch
- interface ethernet switch port
- interface ethernet switch port-isolation
- interface gre
- interface gre6
- interface l2tp-client
@ -160,7 +159,6 @@ 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
@ -215,7 +213,6 @@ options:
- queue type
- radius
- radius incoming
- routing bfd configuration
- routing bgp aggregate
- routing bgp connection
- routing bgp instance
@ -363,7 +360,6 @@ 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,7 +77,6 @@ seealso:
"""
EXAMPLES = r"""
---
- name: Run command on remote devices
community.routeros.command:
commands: /system routerboard print

View file

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

View file

@ -31,9 +31,7 @@ class TerminalModule(TerminalBase):
terminal_stdout_re = [
re.compile(br"\x1b<"),
re.compile(
br"((\[[\w\-\.]+\@)|(\r\<(([\w\-\.]*\@)|)))"
br"[\w\s\-\.\/]+\] ?(<SAFE)?> ?$"),
re.compile(br"\[[\w\-\.]+\@[\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:
- >-
"Unexpected end of string during escaped parameter" in result.msg
result.msg == "Unexpected end of string during escaped parameter"
- 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

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

View file

@ -1,3 +0,0 @@
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,52 +94,6 @@ 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):
@ -731,29 +685,3 @@ 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)