Ansible 2:Ansible Playbook 中是否可以通过仅使用包的名称而不是确切的版本来排除通常在 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 操作系统)。
最佳答案
初步说明(扩展我的评论)
openjdk-8-jre
是包名称。实际上,java 的每个主要版本都有一个不同的包。它们可以单独安装,也可以一起安装,并通过替代方案
进行管理。但例如openjdk-11-jre-headless
永远不会取代 openjdk-8-jre-headless
。
因此,持有此类软件包是很不寻常的,因为您正在切断自己与最新错误和安全修复程序的联系,而这些错误和安全修复程序不会影响使用它的应用程序(例如,java-8
应用程序应该在任何openjdk-8
的次要版本)。
话虽这么说,如果你还想这样做......
使用package_facts
解决方案。
这基本上完全符合您正在尝试的操作,只是它只会标记为hold
机器上的现有包(无论如何,这可能更好)。
Ansible 有一个 package_facts
module这将返回 packages
变量中现有已安装的软件包。
想法:获取这些包名称,仅选择以给定名称开头的包,并将该列表提供给 dpkg_selections
以将它们标记为 hold
。以下剧本已在我的 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
关于Ansible Playbook 是否需要指定要通过 dist-upgrade 设置的包的确切版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62833814/