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:
。
我正在为 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:
。