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:
Valentin Krasontovitsch
2017-08-08 15:53:44 +02:00
committed by Brian Coca
parent 13d2eb6568
commit cfff72e9db
4 changed files with 98 additions and 27 deletions

View File

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