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

时间:2019-07-02 20:12:27

标签: regex ansible cisco-ios

我正在写一本用于多个交换机的ios升级的剧本,除了无闪存检查外,大多数作品都可以使用。基本上,我想在复制图像之前检查是否有足够的可用闪存空间。

我尝试使用“收集事实”模块,但无法按我期望的那样工作:

从收集的事实中我看到了:

"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模板返回的任何值都将是字符串,因此我的检查失败了:

Pass integer variable to task without losing the integer type

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

然后我求助于将'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相当陌生。

谢谢。

1 个答案:

答案 0 :(得分:0)

json_query wildcard expressions返回一个列表。以下任务

  <Button onClick={e => getHeight(e.target)}>Top</Button>

 getHeight = (button) => {
   console.log(button.offsetTop);
  }

提供列表

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

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

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

    "free_space": [
    37492
]

此外,不需要json_query。可以直接引用属性 spacefree_kb

- 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