mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-05-28 03:49:09 -07:00
Use apt-get as fallback for apt upgrade
In answer to #2540, `aptitude` was introduced as tool of choice for running upgrades in the apt module and installing new packages that arise as dependencies during upgrades. This recently lead to problems, as for example Ubuntu Xenial (16.04) ships without aptitude (installed). Studying the man pages of both apt-get and aptitude, it appears that we can achieve the effects of `aptitude safe-upgrade` using ``` apt-get upgrade --with-new-pkgs --autoremove ``` while `aptitude full-upgrade` seems to be identical to `apt-get dist-upgrade`. We use `apt-get` as described above as a fall-back in case that `aptitude` cannot be found, issuing a warning when it does so. Furthermore it introduces a flag `force_apt_get` which may be used to enforce usage of apt-get (which does not issue a warning). The integration tests are updated accordingly. Cf. also the discussion in #27370. Fixes #18987
This commit is contained in:
parent
13d2eb6568
commit
cfff72e9db
4 changed files with 98 additions and 27 deletions
|
@ -10,6 +10,9 @@ facthost[0:20] ansible_host=1270.0.0.1 ansible_connection=local
|
|||
[binary_modules]
|
||||
testhost_binary_modules ansible_host=127.0.0.1 ansible_connection=local
|
||||
|
||||
[local_group]
|
||||
kube-pippin.knf.local
|
||||
|
||||
# the following inline declarations are accompanied
|
||||
# by (preferred) group_vars/ and host_vars/ variables
|
||||
# and are used in testing of variable precedence
|
||||
|
|
|
@ -24,20 +24,49 @@
|
|||
- include: 'apt-builddep.yml'
|
||||
when: ansible_distribution in ('Ubuntu', 'Debian')
|
||||
|
||||
- name: Check if aptitude is installed
|
||||
command: dpkg-query -l aptitude
|
||||
register: deb_check
|
||||
when: ansible_distribution in ('Ubuntu', 'Debian')
|
||||
|
||||
- include: upgrade.yml upgrade_type=dist
|
||||
when: ansible_distribution in ('Ubuntu', 'Debian')
|
||||
|
||||
- include: upgrade.yml upgrade_type=safe
|
||||
when:
|
||||
- ansible_distribution in ('Ubuntu', 'Debian')
|
||||
- deb_check.stdout.find('no packages found') != -1
|
||||
- name: Check if aptitude is installed
|
||||
command: dpkg-query --show --showformat='${db:Status-Abbrev}' aptitude
|
||||
register: aptitude_status
|
||||
when: ansible_distribution in ('Ubuntu', 'Debian')
|
||||
|
||||
- include: upgrade.yml upgrade_type=full
|
||||
- debug: var=aptitude_status.stdout
|
||||
|
||||
- name: Remove aptitude, if installed, to test fall-back to apt-get
|
||||
apt:
|
||||
pkg: aptitude
|
||||
state: absent
|
||||
when:
|
||||
- aptitude_status.stdout.find('ii') != -1
|
||||
|
||||
- include: "upgrade.yml aptitude_present={{ False | bool }} upgrade_type={{ item.upgrade_type }} force_apt_get={{ item.force_apt_get }}"
|
||||
when:
|
||||
- ansible_distribution in ('Ubuntu', 'Debian')
|
||||
- deb_check.stdout.find('no packages found') != -1
|
||||
with_items:
|
||||
- { upgrade_type: safe, force_apt_get: False }
|
||||
- { upgrade_type: full, force_apt_get: False }
|
||||
- { upgrade_type: safe, force_apt_get: True }
|
||||
- { upgrade_type: full, force_apt_get: True }
|
||||
|
||||
- name: (Re-)Install aptitude, run same tests again
|
||||
apt:
|
||||
pkg: aptitude
|
||||
state: present
|
||||
|
||||
- include: upgrade.yml upgrade_type={{ item.upgrade_type }} force_apt_get={{ item.force_apt_get }}
|
||||
when:
|
||||
- ansible_distribution in ('Ubuntu', 'Debian')
|
||||
with_items:
|
||||
- { upgrade_type: safe, force_apt_get: False }
|
||||
- { upgrade_type: full, force_apt_get: False }
|
||||
- { upgrade_type: safe, force_apt_get: True }
|
||||
- { upgrade_type: full, force_apt_get: True }
|
||||
|
||||
- name: Remove aptitude if not originally present
|
||||
apt:
|
||||
pkg: aptitude
|
||||
state: absent
|
||||
when:
|
||||
- aptitude_status.stdout.find('ii') == -1
|
||||
|
|
|
@ -14,14 +14,35 @@
|
|||
that:
|
||||
- "{{ hello_version.stdout }}=={{ hello_old_version }}"
|
||||
|
||||
- name: "(upgrade type: {{upgrade_type}}) upgrade packages to latest version"
|
||||
- name: "(upgrade type: {{upgrade_type}}) upgrade packages to latest version, force_apt_get: {{force_apt_get|default(False)}}"
|
||||
apt:
|
||||
upgrade: "{{ upgrade_type }}"
|
||||
force_apt_get: "{{ force_apt_get | default(False) }}"
|
||||
register: upgrade_result
|
||||
|
||||
- name: check hello version
|
||||
shell: dpkg -s hello | grep Version | awk '{print $2}'
|
||||
register: hello_version
|
||||
|
||||
- debug: var=upgrade_result.warnings|default([])
|
||||
- debug: var=aptitude_present
|
||||
- debug: var=force_apt_get
|
||||
|
||||
- name: check that warning is not given when force_apt_get set
|
||||
assert:
|
||||
that:
|
||||
- "'Could not find aptitude. Using apt-get instead' not in upgrade_result.warnings | default([])"
|
||||
when:
|
||||
- force_apt_get | default(False)
|
||||
|
||||
- name: check that warning is given when aptitude not found and force_apt_get not set
|
||||
assert:
|
||||
that:
|
||||
- "'Could not find aptitude. Using apt-get instead' in upgrade_result.warnings"
|
||||
when:
|
||||
- not aptitude_present|default(True)
|
||||
- not force_apt_get|default(False)
|
||||
|
||||
- name: check that old version upgraded correctly
|
||||
assert:
|
||||
that:
|
||||
|
@ -31,12 +52,13 @@
|
|||
- name: "(upgrade type: {{upgrade_type}}) upgrade packages to latest version (Idempotant)"
|
||||
apt:
|
||||
upgrade: "{{ upgrade_type }}"
|
||||
register: result
|
||||
force_apt_get: "{{ force_apt_get | default(False) }}"
|
||||
register: second_upgrade_result
|
||||
|
||||
- name: check that nothing has changed (Idempotant)
|
||||
assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
- "second_upgrade_result.changed == false"
|
||||
|
||||
- name: remove hello
|
||||
apt:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue