From d320cc0a44943e2ff87590b56b623bb5918474e0 Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Mon, 3 Apr 2023 13:38:26 +0200 Subject: [PATCH] Configure unattended-upgrades Signed-off-by: Emmy D'Anello --- group_vars/debian.yml | 1 + roles/apt/tasks/apt-listchanges.yml | 32 ++++ roles/apt/tasks/apt-unattended.yml | 20 ++ roles/apt/tasks/main.yml | 6 + .../apt/apt.conf.d/20auto-upgrades.j2 | 4 + .../apt/apt.conf.d/50unattended-upgrades.j2 | 174 ++++++++++++++++++ roles/cli-utils/tasks/main.yml | 1 - 7 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 roles/apt/tasks/apt-listchanges.yml create mode 100644 roles/apt/tasks/apt-unattended.yml create mode 100644 roles/apt/templates/apt/apt.conf.d/20auto-upgrades.j2 create mode 100644 roles/apt/templates/apt/apt.conf.d/50unattended-upgrades.j2 diff --git a/group_vars/debian.yml b/group_vars/debian.yml index ad7aef2..f8c047e 100644 --- a/group_vars/debian.yml +++ b/group_vars/debian.yml @@ -2,6 +2,7 @@ glob_apt: mirror: "http://mirror.adm.ynerant.fr/" backports: false + monitoring_mail: "ynerant+apt@emy.lu" extra_repositories: [] pin: {} diff --git a/roles/apt/tasks/apt-listchanges.yml b/roles/apt/tasks/apt-listchanges.yml new file mode 100644 index 0000000..9b21e3e --- /dev/null +++ b/roles/apt/tasks/apt-listchanges.yml @@ -0,0 +1,32 @@ +--- +# Install apt-listchanges +- name: Install apt-listchanges + when: ansible_os_family == "Debian" + apt: + name: apt-listchanges + state: present + update_cache: true + register: apt_result + retries: 3 + until: apt_result is succeeded + +# Send email when there is something new +- name: Configure apt-listchanges + ini_file: + path: /etc/apt/listchanges.conf + no_extra_spaces: true + section: apt + option: "{{ item.option }}" + value: "{{ item.value }}" + state: present + mode: 0644 + loop: + - option: confirm + value: "true" + + - option: email_address + value: "{{ apt.monitoring_mail }}" + + - option: which + value: both +... diff --git a/roles/apt/tasks/apt-unattended.yml b/roles/apt/tasks/apt-unattended.yml new file mode 100644 index 0000000..b8ccd7a --- /dev/null +++ b/roles/apt/tasks/apt-unattended.yml @@ -0,0 +1,20 @@ +--- +- name: Install unattended-upgrades + when: ansible_os_family == "Debian" + apt: + name: unattended-upgrades + state: present + update_cache: true + register: apt_result + retries: 3 + until: apt_result is succeeded + +- name: Configure unattended-upgrades + template: + src: "apt/apt.conf.d/{{ item }}.j2" + dest: "/etc/apt/apt.conf.d/{{ item }}" + owner: root + mode: u=rw,g=r,o=r + loop: + - 50unattended-upgrades + - 20auto-upgrades diff --git a/roles/apt/tasks/main.yml b/roles/apt/tasks/main.yml index ae766d2..4b99189 100644 --- a/roles/apt/tasks/main.yml +++ b/roles/apt/tasks/main.yml @@ -59,3 +59,9 @@ - name: Update APT cache apt: update_cache: true + +# APT-List Changes : send email with changelog +- include_tasks: apt-listchanges.yml + +# APT Unattended upgrades +- include_tasks: apt-unattended.yml diff --git a/roles/apt/templates/apt/apt.conf.d/20auto-upgrades.j2 b/roles/apt/templates/apt/apt.conf.d/20auto-upgrades.j2 new file mode 100644 index 0000000..cda68ea --- /dev/null +++ b/roles/apt/templates/apt/apt.conf.d/20auto-upgrades.j2 @@ -0,0 +1,4 @@ +{{ ansible_header | comment }} + +APT::Periodic::Update-Package-Lists "1"; +APT::Periodic::Unattended-Upgrade "1"; diff --git a/roles/apt/templates/apt/apt.conf.d/50unattended-upgrades.j2 b/roles/apt/templates/apt/apt.conf.d/50unattended-upgrades.j2 new file mode 100644 index 0000000..eb3bd91 --- /dev/null +++ b/roles/apt/templates/apt/apt.conf.d/50unattended-upgrades.j2 @@ -0,0 +1,174 @@ +{{ ansible_header | comment }} + +// Unattended-Upgrade::Origins-Pattern controls which packages are +// upgraded. +// +// Lines below have the format "keyword=value,...". A +// package will be upgraded only if the values in its metadata match +// all the supplied keywords in a line. (In other words, omitted +// keywords are wild cards.) The keywords originate from the Release +// file, but several aliases are accepted. The accepted keywords are: +// a,archive,suite (eg, "stable") +// c,component (eg, "main", "contrib", "non-free") +// l,label (eg, "Debian", "Debian-Security") +// o,origin (eg, "Debian", "Unofficial Multimedia Packages") +// n,codename (eg, "jessie", "jessie-updates") +// site (eg, "http.debian.net") +// The available values on the system are printed by the command +// "apt-cache policy", and can be debugged by running +// "unattended-upgrades -d" and looking at the log file. +// +// Within lines unattended-upgrades allows 2 macros whose values are +// derived from /etc/debian_version: +// ${distro_id} Installed origin. +// ${distro_codename} Installed codename (eg, "buster") +Unattended-Upgrade::Origins-Pattern { + // Codename based matching: + // This will follow the migration of a release through different + // archives (e.g. from testing to stable and later oldstable). + // Software will be the latest available for the named release, + // but the Debian release itself will not be automatically upgraded. +// "origin=Debian,codename=${distro_codename}-updates"; +// "origin=Debian,codename=${distro_codename}-proposed-updates"; + "origin=Debian,codename=${distro_codename},label=Debian"; + "origin=Debian,codename=${distro_codename},label=Debian-Security"; + "origin=Debian,codename=${distro_codename}-security,label=Debian-Security"; + + // Archive or Suite based matching: + // Note that this will silently match a different release after + // migration to the specified archive (e.g. testing becomes the + // new stable). +// "o=Debian,a=stable"; +// "o=Debian,a=stable-updates"; +// "o=Debian,a=proposed-updates"; +// "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports"; +}; + +// Python regular expressions, matching packages to exclude from upgrading +Unattended-Upgrade::Package-Blacklist { + // The following matches all packages starting with linux- +// "linux-"; + + // Use $ to explicitely define the end of a package name. Without + // the $, "libc6" would match all of them. +// "libc6$"; +// "libc6-dev$"; +// "libc6-i686$"; + + // Special characters need escaping +// "libstdc\+\+6$"; + + // The following matches packages like xen-system-amd64, xen-utils-4.1, + // xenstore-utils and libxenstore3.0 +// "(lib)?xen(store)?"; + + // For more information about Python regular expressions, see + // https://docs.python.org/3/howto/regex.html +}; + +// This option allows you to control if on a unclean dpkg exit +// unattended-upgrades will automatically run +// dpkg --force-confold --configure -a +// The default is true, to ensure updates keep getting installed +//Unattended-Upgrade::AutoFixInterruptedDpkg "true"; + +// Split the upgrade into the smallest possible chunks so that +// they can be interrupted with SIGTERM. This makes the upgrade +// a bit slower but it has the benefit that shutdown while a upgrade +// is running is possible (with a small delay) +//Unattended-Upgrade::MinimalSteps "true"; +Unattended-Upgrade::MinimalSteps "true"; + +// Install all updates when the machine is shutting down +// instead of doing it in the background while the machine is running. +// This will (obviously) make shutdown slower. +// Unattended-upgrades increases logind's InhibitDelayMaxSec to 30s. +// This allows more time for unattended-upgrades to shut down gracefully +// or even install a few packages in InstallOnShutdown mode, but is still a +// big step back from the 30 minutes allowed for InstallOnShutdown previously. +// Users enabling InstallOnShutdown mode are advised to increase +// InhibitDelayMaxSec even further, possibly to 30 minutes. +//Unattended-Upgrade::InstallOnShutdown "false"; + +// Send email to this address for problems or packages upgrades +// If empty or unset then no email is sent, make sure that you +// have a working mail setup on your system. A package that provides +// 'mailx' must be installed. E.g. "user@example.com" +//Unattended-Upgrade::Mail ""; +Unattended-Upgrade::Mail "{{ apt.monitoring_mail }}"; + +// Set this value to one of: +// "always", "only-on-error" or "on-change" +// If this is not set, then any legacy MailOnlyOnError (boolean) value +// is used to chose between "only-on-error" and "on-change" +//Unattended-Upgrade::MailReport "on-change"; + +// Remove unused automatically installed kernel-related packages +// (kernel images, kernel headers and kernel version locked tools). +//Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; +Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; + +// Do automatic removal of newly unused dependencies after the upgrade +//Unattended-Upgrade::Remove-New-Unused-Dependencies "true"; +Unattended-Upgrade::Remove-New-Unused-Dependencies "true"; + +// Do automatic removal of unused packages after the upgrade +// (equivalent to apt-get autoremove) +//Unattended-Upgrade::Remove-Unused-Dependencies "false"; +Unattended-Upgrade::Remove-Unused-Dependencies "false"; + +// Automatically reboot *WITHOUT CONFIRMATION* if +// the file /var/run/reboot-required is found after the upgrade +//Unattended-Upgrade::Automatic-Reboot "false"; +Unattended-Upgrade::Automatic-Reboot "true"; + +// Automatically reboot even if there are users currently logged in +// when Unattended-Upgrade::Automatic-Reboot is set to true +//Unattended-Upgrade::Automatic-Reboot-WithUsers "true"; + +// If automatic reboot is enabled and needed, reboot at the specific +// time instead of immediately +// Default: "now" +//Unattended-Upgrade::Automatic-Reboot-Time "02:00"; +Unattended-Upgrade::Automatic-Reboot-Time "02:00"; + +// Use apt bandwidth limit feature, this example limits the download +// speed to 70kb/sec +//Acquire::http::Dl-Limit "70"; + +// Enable logging to syslog. Default is False +// Unattended-Upgrade::SyslogEnable "false"; +Unattended-Upgrade::SyslogEnable "true"; + +// Specify syslog facility. Default is daemon +// Unattended-Upgrade::SyslogFacility "daemon"; + +// Download and install upgrades only on AC power +// (i.e. skip or gracefully stop updates on battery) +// Unattended-Upgrade::OnlyOnACPower "true"; + +// Download and install upgrades only on non-metered connection +// (i.e. skip or gracefully stop updates on a metered connection) +// Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true"; + +// Verbose logging +// Unattended-Upgrade::Verbose "false"; + +// Print debugging information both in unattended-upgrades and +// in unattended-upgrade-shutdown +// Unattended-Upgrade::Debug "false"; + +// Allow package downgrade if Pin-Priority exceeds 1000 +// Unattended-Upgrade::Allow-downgrade "false"; + +// When APT fails to mark a package to be upgraded or installed try adjusting +// candidates of related packages to help APT's resolver in finding a solution +// where the package can be upgraded or installed. +// This is a workaround until APT's resolver is fixed to always find a +// solution if it exists. (See Debian bug #711128.) +// The fallback is enabled by default, except on Debian's sid release because +// uninstallable packages are frequent there. +// Disabling the fallback speeds up unattended-upgrades when there are +// uninstallable packages at the expense of rarely keeping back packages which +// could be upgraded or installed. +// Unattended-Upgrade::Allow-APT-Mark-Fallback "true"; diff --git a/roles/cli-utils/tasks/main.yml b/roles/cli-utils/tasks/main.yml index 9175434..26040b6 100644 --- a/roles/cli-utils/tasks/main.yml +++ b/roles/cli-utils/tasks/main.yml @@ -20,7 +20,6 @@ - tmux - traceroute - tree - - unattended-upgrades - vim register: pkg_result retries: 3