automationansiblecisconetconf

Ansible `netconf_config`: "Argument must be bytes or unicode, got 'int'" when using `confirm` parameter


I am using Ansible's ansible.netcommon.netconf_config module to configure a Cisco switch over NETCONF. However, when I include the confirm parameter, I get the following error:

Argument must be bytes or unicode, got 'int'

My playbook

- name: Test netconf confirm_commit feature
  hosts: lab4-ict1-e06-cam-sw01
  connection: netconf
  gather_facts: false

  tasks:
    - name: Modify hostname
      ansible.netcommon.netconf_config:
        target: candidate
        commit: true
        confirm: 60
        content: |
          <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
            <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
              <hostname>myHost</hostname>
            </native>
          </config>

Device Capabilities

My switch supports the following NETCONF capabilities:

<capability>urn:ietf:params:netconf:base:1.0</capability>
<capability>urn:ietf:params:netconf:base:1.1</capability>
<capability>urn:ietf:params:netconf:capability:confirmed-commit:1.1</capability>
<capability>urn:ietf:params:netconf:capability:confirmed-commit:1.0</capability>
<capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
<capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
<capability>urn:ietf:params:netconf:capability:validate:1.0</capability>
<capability>urn:ietf:params:netconf:capability:validate:1.1</capability>
<capability>urn:ietf:params:netconf:capability:xpath:1.0</capability>
<capability>urn:ietf:params:netconf:capability:notification:1.0</capability>
<capability>urn:ietf:params:netconf:capability:interleave:1.0</capability>
<capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&amp;also-supported=report-all-tagged,report-all</capability>
<capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2016-06-21&amp;module-set-id=cfda21b1f56eacca98467dd697c96695</capability>

Since :candidate and :confirmed-commit are supported, I assumed :confirm should work correctly.

What I Have Tried

1. Changing confirm to a string:

confirm: "60"

Still results in the same error.

2. Removing confirm:

When confirm is removed, the task runs successfully, but I need the confirm behavior.

3. Adding validate: true

validate: true

No change in the error message.

4. Checking Ansible and collection versions:

ansible --version
ansible-galaxy collection list | grep netcommon

Everything is up-to-date.

ansible [core 2.15.8]
ansible.netcommon 5.3.0

5. Trying different values for confirm:

None of these work.

Does anyone know if there is a bug or a specific format required for confirm?


Solution

  • I managed to fix the issue locally.

    The problem was related to the confirm_timeout parameter, which needed to be properly converted to text. The fix was to modify the following line in netconf_config.py (line 685):

    - confirmed=confirmed_commit, timeout=confirm_timeout
    + confirmed=confirmed_commit, timeout=to_text(confirm_timeout, errors='surrogate_or_strict')
    

    This ensures that confirm_timeout is correctly handled as a string, avoiding type mismatches.

    Hope this helps others facing the same issue! 🚀

    Here is my pull request on ansible.netcommon github : Pull request