windows - Ansible Chocolatey - 只是想更新软件包(如果有)

标签 windows automation ansible package chocolatey

我有一个使用 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/

相关文章:

windows - 通过 WIA 扫描通知

ios - 是否可以使用与 iOS 应用程序相同的初始状态来启动每个 Appium 测试?

Ansible:检查列表,如果找到,则删除一个或多个项目

windows - Windows 上 readlink 的 native 替代方案

php - 如何让 mod_rewrite 与 EasyPHP 一起工作?

jquery - 我如何使用 jQuery 在我的网站演示中自动填写表单,就像真人在实际输入一样?

python - 在 Mac 上使用 Python 控制浏览器

python - Ansible/分子 : service docker daemon/engine won’t start

deployment - Ansible 在主机上下文之间传递变量

python - 使用 Python 查找和识别多个显示设备(显示器)