Предварительное примечание (расширение моего комментария)
openjdk-8-jre
- это имя пакета. На самом деле существует один отдельный пакет для каждой основной версии java. Их можно установить отдельно или все вместе и управлять через alternatives
. Но, например, 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