Я пишу книгу для обновления 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, будет строкой, поэтому моя проверка не удалась:
Передать целочисленную переменную в задачу без потери целочисленного типа
Решение, предложенное в ссылке, похоже, не работает для меня даже с доступной версией 2.7.
Затем я прибегнул к сохранению результатов «dir» в регистре и попытался использовать regex_search, но, похоже, не смог правильно понять синтаксис.
(похоже на это: Ansible regex_findall несколько строк)
"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 выражения с подстановочными знаками возвращает список. Задачи ниже
- 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:
.
Действительно ли имя атрибута "вспышка:"?