Ansible Playbook 是否需要指定要通过 dist-upgrade 暂停的包的确切版本?

Ansible Playbook is it necessary to specify the exact version of the package to set on hold by dist-upgrade?

Ansible 2:Ansible Playbook 中的 possible 是否通过仅使用包的名称而不是确切的版本来排除通常会在 dist-upgrade 期间升级的包?

---
- hosts: localhost
  become: yes
  tasks: 

  - name: disable upgrade of Java
    dpkg_selections:
      name: openjdk-8-jre
      selection: hold

我只想指定 openjdk 而不是 openjkd-8-jre 因为无论可以升级到哪个版本的 openjdk 都不应安装 openjdk(不同的服务器具有不同的 ubuntu os).

初步说明(扩展我的评论)

openjdk-8-jre 包名。 java 的每个主要版本实际上都有一个不同的包。它们可以单独安装或一起安装,并通过 alternatives 进行管理。但是例如openjdk-11-jre-headless 永远不会取代 openjdk-8-jre-headless.

因此,持有此类软件包是很不寻常的,因为您正在切断不应影响使用它的应用程序的最新错误和安全修复程序(例如,java-8 应用程序应该 运行 openjdk-8).

的任何次要版本

话虽这么说,如果你还想做...

package_facts 的解决方案。

这基本上完全符合您的尝试,除了它只会标记为 hold 机器上现有的包(无论如何这可能更好)。

Ansible 有一个 package_facts module,它将 return packages 变量中的现有安装包。

想法:获取那些包名,select 只有那些以给定名称开头的包名,并将该列表提供给 dpkg_selections 以将它们标记为 hold。下面的 playbook 在我的 unbuntu 18.04 家用机器上测试成功。

- name: Disable package upgrade based on partial name
  hosts: localhost
  gather_facts: false
  become: true

  vars:
    partial_hold_name: openjdk
    partial_hold_regexp: "^{{ partial_hold_name }}.*"
    hold_package_list: "{{ packages | dict2items | map(attribute='key') | select('match', partial_hold_regexp) | list }}"

  tasks:
    - name: Gather package facts
      package_facts:

    - name: dselect all openjdk packages if they exists
      dpkg_selections:
        name: "{{ item }}"
        selection: hold
      loop: "{{ hold_package_list }}"

这给出了(第一个 运行 并行安装了 openjdk-11 和 openjdk-8 并标记为“安装”)

$ ansible-playbook test.yml 

PLAY [Disable package upgrade based on partial name] ***********************************************************************************************************************************************************************************

TASK [Gather package facts] ************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [dselect all openjdk packages if they exists] *************************************************************************************************************************************************************************************
changed: [localhost] => (item=openjdk-11-jre-headless)
changed: [localhost] => (item=openjdk-8-jdk-headless)
changed: [localhost] => (item=openjdk-8-jre-headless)

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0