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

标签 ansible ansible-2.x

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/

相关文章:

ansible - 如何访问 Action 插件中的 ansible 变量(不提供它们作为参数)

取消存档然后修改提取的文件的 Ansible 幂等性问题

ansible 注释多个 cron 作业

python - 在 Ansible 任务中运行 bash 命令

mongodb - 通过 Ansible 配置 AWS MongoDB 集群

ansible - 如何使用 ansible 设置 logrotation?

ansible - {{ ansible_hostname }} 在直接使用 Ansible 2.3 调用时不起作用

ansible - 扩展ansible角色?

kubernetes - 如何从 Ansible 将变量传递到 Kubernetes YAML 文件?

Ansible:确保变量是一个列表