Ansible: маршрутизатор обновления ios: проверьте «spacefree_kb» перед копированием образа

Я пишу книгу для обновления 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.

Заранее спасибо.

Действительно ли имя атрибута "вспышка:"?

Vladimir Botka 02.07.2019 23:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
843
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

большое спасибо! оба метода работали, и ваше объяснение каждому из них очень ценится. Это имеет смысл.

network_stack 03.07.2019 14:43

У json_query есть преимущество: см. этот пример на C9500:

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

да, они изменили flash: на bootflash:.

Другие вопросы по теме