Ansible Playbook необходимо ли указывать точную версию пакета, которую нужно отложить с помощью dist-upgrade? - PullRequest
2 голосов
/ 10 июля 2020

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

1 Ответ

2 голосов
/ 10 июля 2020

Предварительное примечание (расширение моего комментария)

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