我有一个使用 Chocolatey 开发的 ansible 剧本来升级一组软件包。但是,我希望剧本仅在已安装的情况下升级软件包,如果该软件包不存在则跳过。然而,剧本正在做的是升级现有的软件包,但安装不存在的软件包。我从剧本中知道它正在做它应该做的事情,因为状态被设置为最新。我想知道的是如何修改剧本以仅升级现有的软件包(可能使用 when: 语句),但我似乎找不到任何可以帮助解决这个问题的东西。提前致谢。
下面是 ansible 剧本。是的,我知道我可以将这些包包含在一个循环中,而不是一次运行一个包,但我发现这并不像我想要的那么冗长。
---
- hosts: all
tasks:
- name: Update putty on Windows machines
win_chocolatey:
name: putty
state: latest
- name: Update WinSCP on Windows machines
win_chocolatey:
name: winscp
state: latest
- name: Update Notepad++ on Windows machines
win_chocolatey:
name: notepadplusplus
state: latest
- name: Update SQL Server Management Studio on Windows machines
win_chocolatey:
name: sql-server-management-studio
state: latest
- name: Update Firefox on Windows machines
win_chocolatey:
name: firefox
state: latest
- name: Update Google Chrome on Windows machines
win_chocolatey:
name: googlechrome
state: latest
- name: Update Brave Browser on Windows machines
win_chocolatey:
name: brave
state: latest
- name: Update 7zip on Windows machines
win_chocolatey:
name: 7zip
state: latest
- name: Update TreeSize Free on Windows machines
win_chocolatey:
name: treesizefree
state: latest
- name: Update Wireshark on Windows machines
win_chocolatey:
name: wireshark
state: latest
- name: Update PowerBI data gateway on Windows machines
win_chocolatey:
name: powerbigateway
state: latest
- name: Update RVTools on Windows machines
win_chocolatey:
name: rvtools
state: latest
最佳答案
您需要做的是首先检查安装了哪些软件包,您可以使用 win_chocolatey_facts
来执行此操作模块。
如果您只想更新所有已安装的软件包,那么您可以循环该模块返回的内容并进行更新:
---
- hosts: all
tasks:
- name: Gather facts from Chocolatey CLI
win_chocolatey_facts:
- name: Upgrade installed packages
win_chocolatey:
name: '{{ item.package }}'
state: latest
failed_when: false # Setting this means if one package fails, the loop will continue. You can remove it if you don't want that behaviour.
loop: '{{ ansible_chocolatey.packages }}' # This variable comes from the facts task above automatically.
...
如果您只想关心列表与计算机上的包之间的交集,那么我建议将该包列表存储在变量中并在循环中检查它。
---
- hosts: all
vars:
chocolatey_packages_to_upgrade:
- putty
- winscp
- notepadplusplus
- sql-server-management-studio
- firefox
- googlechrome
- brave
- 7zip
- treesizefree
- wireshark
- powerbigateway
tasks:
- name: Gather facts from Chocolatey CLI
win_chocolatey_facts:
- name: Upgrade installed packages
win_chocolatey:
name: '{{ item.package }}'
state: latest
when: item.package in chocolatey_packages_to_upgrade # Only process this package if the package is in the predefined list
failed_when: false # Setting this means if one package fails, the loop will continue. You can remove it if you don't want that behaviour.
loop: '{{ ansible_chocolatey.packages }}' # This variable comes from the facts task above automatically.
...
您始终可以反转此循环,即您可以在所需的包上循环,并且仅在事实模块的自动变量中找到它们时才进行升级。
此外,如果您根本不想使用循环,您仍然可以像这样执行单独的任务:
- name: Update putty on Windows machines
win_chocolatey:
name: putty
state: latest
when: '"putty" in ansible_chocolatey.packages'
关于windows - Ansible Chocolatey - 只是想更新软件包(如果有),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76691151/