首页 > 解决方案 > ansible检查最大数量列表

问题描述

我在 Ansible 中遇到了脚本问题。我想检查 Cisco NXOS 中路由映射的最后一个序列号,然后我做了下一个:

我的想法是显示输出,然后使用 map('regex_replace") 删除除数字之外的所有内容。

角色内部:

变量文件:

sequence: 10

任务文件:

---
- 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)}}"

它可以工作,但如果前缀的数量超过 90,它就会失败。

这是结果:

    "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
}

有谁知道为什么最大数是 90 而不是 130?

如果我在 90 之前使用数字,它可以完美运行,但超过 100 则无法正常工作。任何想法?

谢谢

标签: filteransiblemax

解决方案


您正在将您的值作为字符串进行比较,因此结果完全符合预期。“90”(以 开头9)在字母表中比“130”(以 开头)更远1

您需要比较为 int 以获得更大的 int 值。

以下显示了与解决方案的差异:

---
- 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
          }}

这使:

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   

推荐阅读