Ansible: маршрутизатор обновления ios: проверьте «spacefree_kb» перед копированием образа - PullRequest
1 голос
/ 02 июля 2019

Я пишу сборник пьес для обновления 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, будет строкой, поэтому моя проверка не удалась:

Передача целочисленной переменной в задачу без потери целочисленного типа

Решение, предложенное в ссылке, мне кажется, не работает даже с ansible 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.

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

1 Ответ

0 голосов
/ 03 июля 2019

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
...