Почему Ansible не вызывает эту строку в условном выводе stdout? - PullRequest
0 голосов
/ 06 декабря 2018

Я использую Ansible версии 2.7 на Centos7, используя метод подключения network_cli.

У меня есть книга воспроизведения, которая:

  • Указывает сетевому устройству загружать новый образ прошивки черезTFTP
  • Указывает сетевому устройству рассчитать хеш-значение md5
  • Сохраняет выходные данные вычисления в .stdout
  • Имеет условное условие:: проверка, которая проверяет данный md5значение в .stdout перед продолжением работы с блоком задач.

Независимо от того, какое значение md5 я задаю, он всегда запускает блок задач.

Условный оператор:

when: '"new_ios_md5" | string in md5_result.stdout'

Вот полная книга воспроизведения:


- name: UPGRADE SUP8L-E SWITCH FIRMWARE
  hosts: switches
  connection: network_cli
  gather_facts: no

  vars_prompt:
   - name: "compliant_ios_version"
     prompt: "What is the compliant IOS version?"
     private: no

   - name: "new_ios_bin"
     prompt: "What is the name of the new IOS file?"
     private: no

   - name: "new_ios_md5"
     prompt: "What is the MD5 value of the new IOS file?"
     private: no

   - name: "should_reboot"
     prompt: "Do you want Ansible to reboot the hosts? (YES or NO)"
     private: no

  tasks:
    - name: GATHER SWITCH FACTS
      ios_facts:

    - name: UPGRADE IOS IMAGE IF NOT COMPLIANT
      block:
      - name: COPY OVER IOS IMAGE
        ios_command:
           commands:
              - command: "copy tftp://X.X.X.X/45-SUP8L-E/{{ new_ios_bin }} bootflash:"
                prompt: '[{{ new_ios_bin }}]'
              answer: "\r"
        vars:
          ansible_command_timeout: 1800

      - name: CHECK MD5 HASH
        ios_command:
           commands:
              - command: "verify /md5 bootflash:{{ new_ios_bin }}"
        register: md5_result
        vars:
          ansible_command_timeout: 300

      - name: CONTINUE UPGRADE IF MD5 HASH MATCHES
        block:
        - name: SETTING BOOT IMAGE
          ios_config:
            lines:
            - no boot system
            - boot system flash bootflash:{{ new_ios_bin }}
            match: none
            save_when: always

        - name: REBOOT SWITCH IF INSTRUCTED
          block:
          - name: REBOOT SWITCH
            ios_command:
               commands:
                  - command: "reload"
                    prompt: '[confirm]'
                    answer: "\r"
            vars:
              ansible_command_timeout: 30

          - name: WAIT FOR SWITCH TO RETURN
            wait_for:
              host: "{{inventory_hostname}}"
              port: 22
              delay: 60
              timeout: 600
            delegate_to: localhost

          - name: GATHER ROUTER FACTS FOR VERIFICATION
            ios_facts:

          - name: ASSERT THAT THE IOS VERSION IS CORRECT
            assert:
              that:
                - compliant_ios_version == ansible_net_version
              msg: "New IOS version matches compliant version. Upgrade successful."

          when: should_reboot == "YES"

        when: '"new_ios_md5" | string in md5_result.stdout'

      when: ansible_net_version != compliant_ios_version
...

Два других условия в книге воспроизведения работают, как и ожидалось.Я не могу понять, как получить ответ, чтобы потерпеть неудачу когда: '"new_ios_md5" |строка в условном выражении md5_result.stdout 'и остановите воспроизведение, если значение md5 неверно.

Когда вы запускаете воспроизведение с выходом отладки, значение stdout равно:

    "stdout": [
".............................................................................................................................................Done!", 
                "verify /md5 (bootflash:cat4500es8-universalk9.SPA.03.10.02.E.152-6.E2.bin) = c1af921dc94080b5e0172dbef42dc6ba"
            ]

Вы можете четкоПосмотрите рассчитанное значение md5 в строке, но мое условие, кажется, не заботится в любом случае.

У кого-нибудь есть совет?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Кредит переходит к zoredache на Reddit для окончательного решения:

Кстати, вы знаете, что для большинства различных сетевых команд ios_command результаты возвращаются в виде списка, верно?Так что вам нужно внести в список информацию, относящуюся к выполняемой вами команде.

Скажем, у вас есть это.task

ios_command:
    commands:
      - command: "verify /md5 bootflash:{{ new_ios_bin }}"
      - command: show version
      - command: show config
register: results

В списке вы должны были бы получить вывод, подобный этому.

# results.stdout[0] = verify
# results.stdout[1] = show version
# results.stdout[2] = show config

Таким образом, правильный условный оператор будет:

when: 'new_ios_md5 in md5_result.stdout[0]'
0 голосов
/ 06 декабря 2018

Когда вы пишете:

when: '"new_ios_md5" | string in md5_result.stdout'

Вы ищете буквенную строку"new_ios_md5" внутри переменной md5_result.stdout.Поскольку вы действительно хотите обратиться к новой переменной new_ios_md5, вы хотите удалить кавычки вокруг нее:

when: 'new_ios_md5 | string in md5_result.stdout'
...