Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ansible check max number list

I am having issues with script in Ansible. I want to check the last sequence number the route-map in Cisco NXOS and I did the next:

My idea was to show the output and then, with map('regex_replace") remove all except the numbers.

Inside the role:

vars file:

sequence: 10

tasks file:

---
- name: check route-map
  nxos_command:
    commands: sh route-map |inc TEST-MAP
  register: output
- name: Calculate max number
  set_fact:
    max_seq_number: |
      {{ output.stdout_lines[0]  | map ('regex_replace','route-map TEST-MAP, permit, sequence','') | list |max}}
- name: Calculate number to use
  set_fact:
    sum: "{{ (max_seq_number |int) + (sequence |int)}}"

That it works but if the number of prefixes is more than 90 it fails.

This is the result:

    "stdout_lines": [
        [
            "route-map TEST-MAP, permit, sequence 1 ",
            "route-map TEST-MAP, permit, sequence 10 ",
            "route-map TEST-MAP, permit, sequence 20 ",
            "route-map TEST-MAP, permit, sequence 30 ",
            "route-map TEST-MAP, permit, sequence 40 ",
            "route-map TEST-MAP, permit, sequence 50 ",
            "route-map TEST-MAP, permit, sequence 60 ",
            "route-map TEST-MAP, permit, sequence 70 ",
            "route-map TEST-MAP, permit, sequence 80 ",
            "route-map TEST-MAP, permit, sequence 90 ",
            "route-map TEST-MAP, permit, sequence 100 ",
            "route-map TEST-MAP, permit, sequence 110 ",
            "route-map TEST-MAP, permit, sequence 120 ",
            "route-map TEST-MAP, permit, sequence 130"
        ]
    ]
}

TASK [checks : Calculate max number] **********************************************************************************************************************************************************************
task path: /ansible/Config-Generator/roles/checks/tasks/Route-map-SequenceNumber.yml:6
ok: [localhost] => {
    "ansible_facts": {
        "**max_seq_number": " 90 \n"**
    },
    "changed": false
}

TASK [checks : Calculate number to use] *******************************************************************************************************************************************************************
task path: /ansible/Config-Generator/roles/checks/tasks/Route-map-SequenceNumber.yml:10
ok: [localhost] => {
    "ansible_facts": {
        "sum": "100"
    },
    "changed": false
}

Does anyone know why the Max number is 90 instead of 130?

If I use numbers until 90 it works perfectly, but more than 100 it does not work. Any idea?

Thanks

like image 349
straits Avatar asked Nov 01 '25 05:11

straits


1 Answers

You are comparing your values as string so the result is totally expected. "90" (starts with 9) is further in the alphabet than "130" (starts with 1).

You need to compare as int to get the greater int value.

The following shows the differences with the solution:

---
- hosts: localhost
  gather_facts: false

  vars:
    # simple one-liner with your original data for demo
    output: {"stdout_lines": [["route-map TEST-MAP, permit, sequence 1 ", "route-map TEST-MAP, permit, sequence 10 ", "route-map TEST-MAP, permit, sequence 20 ", "route-map TEST-MAP, permit, sequence 30 ", "route-map TEST-MAP, permit, sequence 40 ", "route-map TEST-MAP, permit, sequence 50 ", "route-map TEST-MAP, permit, sequence 60 ", "route-map TEST-MAP, permit, sequence 70 ", "route-map TEST-MAP, permit, sequence 80 ", "route-map TEST-MAP, permit, sequence 90 ", "route-map TEST-MAP, permit, sequence 100 ", "route-map TEST-MAP, permit, sequence 110 ", "route-map TEST-MAP, permit, sequence 120 ", "route-map TEST-MAP, permit, sequence 130"]]}

  tasks:
    - name: show max string value
      debug:
        msg: >-
          {{
            output.stdout_lines[0]
            | map ('regex_replace','route-map TEST-MAP, permit, sequence (\d+).*','\1')
            | max
          }}

    - name: show max int value
      debug:
        msg: >-
          {{
            output.stdout_lines[0]
            | map ('regex_replace','route-map TEST-MAP, permit, sequence (\d+).*','\1')
            | map('int')
            | max
          }}

which gives:

PLAY [localhost] ***********************************************************************************************************************************************************************************************************************

TASK [show max string value] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "90"
}

TASK [show max int value] **************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "130"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
like image 188
Zeitounator Avatar answered Nov 03 '25 05:11

Zeitounator