%3F.png)
Обычно, когда Ansible запускает скрипт PowerShell с помощью win_command
/ win_shell
/ win_psexec
, то, если не возникают ошибки, он возвращает «изменено», поскольку, конечно, он не знает, что именно сделал скрипт.
Поскольку мы можем вернуть любой код выхода в скрипте PowerShell, есть ли способ, через коды выхода или иным образом, уведомить Ansible, что не требуется никаких изменений, чтобы Ansible вернул статус "ok"? Или он всегда будет возвращать "changed" несмотря ни на что (при условии отсутствия сбоев)?
решение1
Я думаю, я нашел это.win_powershellмодуль получает доступ к $Ansible
переменной PowerShell, с помощью которой я могу изменить информацию, возвращаемую контроллеру.
Изwin_powershellдокументация:
$Ansible.Result
— это значение, которое возвращается контроллеру как есть.$Ansible.Diff
был добавлен в выпуске ansible.windows 1.12.0 и представляет собой словарь, содержащий результат сравнения, который может быть интерпретирован Ansible.$Ansible.Changed
может быть установлено в true или false, чтобы отразить, внес ли модуль изменения или нет. По умолчанию это установлено в true.$Ansible.Failed
можно установить значение true, если скрипт хочет вернуть ошибку обратно контроллеру.$Ansible.Tmpdir
— это путь к временному каталогу, который будет использоваться в качестве резервного хранилища и будет очищен после завершения работы модуля.$Ansible.Verbosity
показывает уровень детализации Ansible для этой пьесы. Позволяет скрипту устанавливать VerbosePreference/DebugPreference на основе детализации. Добавлено в 1.9.0.
решение2
Вкратце, в качестве примера псевдокода, основанного на вашем сценарии rc-вариации, где мы могли бы представить, что вы выходите с , 0
когда ничего не изменилось, с , 4
когда что-то изменилось, и с любым другим кодом, когда что-то пошло не так...
- name: some shell task
ansible.windows.win_command: my_command
register: my_command
failed_when: my_command.rc | int not in [0,4]
changed_when: my_command.rc | int == 4
Для получения более подробной информации см.Обработка ошибок в плейбуках
Обратите внимание, что для команд, которые носят исключительно информационный характер и ничего не меняют, changed_when: false
это вполне приемлемо.