Skip to content
Apr 29 / Greg

Ansible Routeros Module Quirk With Commas

When you are using commas in a playbook with Ansible on the routeros module you will have a bad time unless you do this one special trick.

First here’s my example playbook:

1
2
3
4
5
6
7
8
9
10
11
---
- name: wlan2 radio tuning
  connection: network_cli
  gather_facts: false
  hosts: mtk3
 
  tasks:
 
    - name: Add vlan config back for user vlans
      routeros_command:
        commands: "/interface bridge vlan add bridge=bridge1 tagged=ether1 untagged=ether2,ether3,ether4,ether5,wlan2 vlan-ids={{ hostvars[inventory_hostname]['user_vlan'] }}"

When I run this it just fails.
When I run it with debugging -vvv I get:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fatal: [mtk3]: FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "invocation": {
        "module_args": {
            "commands": [
                "/interface bridge vlan add bridge=bridge1 tagged=ether1 untagged=ether2",
                "ether3",
                "ether4",
                "ether5",
                "wlan2 vlan-ids=201"
            ],
            "interval": 1,
            "match": "all",
            "retries": 10,
            "wait_for": null
        }
    },
    "msg": "command timeout triggered, timeout value is 30 secs.\nSee the timeout setting options in the Network Debug and Troubleshooting Guide."
}

You can see that it interprets the “untagged=ether2,ether3,ether4,ether5,wlan2” portion as a list and tries to put each one on a separate line, which totally breaks the command.

I tried a million different things including putting the interface list into an actual list, then joining it back together in the command with the join command:

1
2
3
   - name: Add vlan config back for user vlans
      routeros_command:
        commands: "/interface bridge vlan add bridge=bridge1 tagged=ether1 untagged={{ my_joined_list | join(',') }} vlan-ids={{ hostvars[inventory_hostname]['user_vlan'] }}"

But the output shows it does the same thing…:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fatal: [mtk3]: FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "invocation": {
        "module_args": {
            "commands": [
                "/interface bridge vlan add bridge=bridge1 tagged=ether1 untagged=ether2",
                "ether3",
                "ether4",
                "ether5",
                "wlan2 vlan-ids=201"
            ],

I eventually found this bug report, which explains that the routeros module expects to see a list of commands, so if you just slightly modify the command structure it will interpret things correctly *sigh*.

Here’s the working version of the task:

1
2
3
4
    - name: Add vlan config back for user vlans
      routeros_command:
        commands: 
          - "/interface bridge vlan add bridge=bridge1 tagged=ether1 untagged=ether2,ether3,ether4,ether5,wlan2 vlan-ids={{ hostvars[inventory_hostname]['user_vlan'] }}"

Notice that all I did was move the command itself to a new line and add the “-” before it. Now it interprets everything as a single line, ignoring the commas.

I hope you find this to be useful, and possibly save you a good chunk of time!

2 Comments

leave a comment
  1. Nasir Hafeez / Jul 21 2020

    Thanks Greg! It was indeed very helpful and did save me a lot of time and effort!

  2. Ventseslav Ilev / Sep 17 2020

    Maaaaan…I was about to break my keyboard!

Leave a Comment

 

*