Я использую 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 в строке, но мое условие, кажется, не заботится в любом случае.
У кого-нибудь есть совет?