Ansible:ios 升级路由器:在映像复制之前检查 "spacefree_kb"

Ansible: ios upgrade router: check "spacefree_kb" prior to image copy

我正在为 ios 多个开关的升级编写一个剧本,并且除了 flash 免费检查外,大多数部分都可以正常工作。基本上,我想在复制图像之前检查是否有足够的闪存 space。

我尝试使用收集事实模块,但它没有像我预期的那样工作:

通过收集事实,我看到了这个:

"ansible_net_filesystems_info": {
        "flash:": {
            "spacefree_kb": 37492,
            "spacetotal_kb": 56574

这是我要进行的检查:

fail:
    msg: 'This device does not have enough flash memory to proceed.'
 when: "ansible_net_filesystems_info | json_query('*.spacefree_kb')|int  <  new_ios_filesize|int"

通过一些研究,我了解到 jinja2 模板返回的任何值都是一个字符串,所以我的检查失败了:

即使使用 ansible 2.7,link 中建议的解决方案似乎也不适合我。

然后我求助于将 'dir' 的结果存储在寄存器中并尝试使用 regex_search 但似乎无法获得正确的语法。

(类似于: Ansible regex_findall multiple strings)

"stdout_lines": [
        [
            "Directory of flash:/",
            "",
            "    2  -rwx         785   Jul 2 2019 15:39:05 +00:00  dhcp-snooping.db",
            "    3  -rwx        1944  Jul 28 2018 20:05:20 +00:00  vlan.dat",
            "    4  -rwx        3096   Jul 2 2019 01:03:26 +00:00  multiple-fs",
            "    5  -rwx        1915   Jul 2 2019 01:03:26 +00:00  private-config.text",
            "    7  -rwx       35800   Jul 2 2019 01:03:25 +00:00  config.text",
            "    8  drwx         512  Apr 25 2015 00:03:16 +00:00  c2960s-universalk9-mz.150-2.SE7",
            "  622  drwx         512  Apr 25 2015 00:03:17 +00:00  dc_profile_dir",
            "",
            "57931776 bytes total (38391808 bytes free)"
        ]
    ]

任何人都可以对这个看似简单的任务提供一些见解吗?我只想将“38391808”作为上面示例(或任何其他建议)中的整数。我是 ansible 的新手。

提前致谢。

json_query wildcard expressions return 一个列表。下面的任务

- set_fact:
    free_space: "{{ ansible_net_filesystems_info|
                    json_query('*.spacefree_kb') }}"
- debug:
    var: free_space

给出列表

    "free_space": [
    37492
]

既不能转换为整数,也不能与整数进行比较。这就是问题的原因。

解决方法很简单。只需取列表的第一个元素,条件就会开始工作

- fail:
    msg: 'This device does not have enough flash memory to proceed.'
  when: ansible_net_filesystems_info|
        json_query('*.spacefree_kb')|
        first|
        int <  new_ios_filesize|int

此外,json_query也不是必须的。属性spacefree_kb可以直接引用

- fail:
    msg: 'This device does not have enough flash memory to proceed.'
  when: ansible_net_filesystems_info['flash:'].spacefree_kb|
        int <  new_ios_filesize|int

json_query 有一个优势:在 C9500 上看这个例子:

[{'bootflash:': {'spacetotal_kb': 10986424.0, 'spacefree_kb': 4391116.0}}]

是的,他们将 flash: 更改为 bootflash: