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
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