From 018890d7e1bf881e457fc1a7b14752f31be7f88e Mon Sep 17 00:00:00 2001 From: Kazuhiro MUSASHI Date: Sun, 11 Oct 2020 01:58:15 +0900 Subject: [PATCH] Use `unattended-upgrade`, instead of `cron-apt`. --- cookbooks/base/cron-apt.rb | 44 ------ cookbooks/base/default.rb | 4 +- .../files/etc/apt/apt.conf.d/20auto-upgrades | 2 + .../etc/apt/apt.conf.d/50unattended-upgrades | 131 ++++++++++++++++++ cookbooks/base/unattended-upgrade.rb | 56 ++++++++ 5 files changed, 191 insertions(+), 46 deletions(-) delete mode 100644 cookbooks/base/cron-apt.rb create mode 100644 cookbooks/base/files/etc/apt/apt.conf.d/20auto-upgrades create mode 100644 cookbooks/base/files/etc/apt/apt.conf.d/50unattended-upgrades create mode 100644 cookbooks/base/unattended-upgrade.rb diff --git a/cookbooks/base/cron-apt.rb b/cookbooks/base/cron-apt.rb deleted file mode 100644 index 9083ce4..0000000 --- a/cookbooks/base/cron-apt.rb +++ /dev/null @@ -1,44 +0,0 @@ -# Install `cron-apt`: -package 'cron-apt' - -# From here, we are going to set up `cron-apt` to -# install the important security updates every day. -remote_file '/etc/cron-apt/config' do - user 'root' - - owner 'root' - group 'root' - mode '644' -end - -remote_file '/etc/cron-apt/action.d/3-download' do - user 'root' - - owner 'root' - group 'root' - mode '644' -end - -execute 'grep security /etc/apt/sources.list > /etc/apt/security.sources.list' do - user 'root' - - not_if 'test -e /etc/apt/security.sources.list' -end - -file '/var/log/cron-apt/log' do - user 'root' - - content 'foo\n' - - owner 'root' - group 'root' - mode '666' - - not_if 'test -e /var/log/cron-apt/log' -end - -execute '/usr/sbin/logrotate -f /etc/logrotate.d/cron-apt' do - user 'root' - - not_if 'test -e /var/log/cron-apt/log' -end diff --git a/cookbooks/base/default.rb b/cookbooks/base/default.rb index 1704b7a..caa17e2 100644 --- a/cookbooks/base/default.rb +++ b/cookbooks/base/default.rb @@ -39,8 +39,8 @@ include_recipe './packages.rb' # Lang Setting: include_recipe './lang.rb' -# `cron-apt` settings: -include_recipe './cron-apt.rb' +# `unattended-upgrade` settings: +include_recipe './unattended-upgrade.rb' # `ufw` configurations: include_recipe './ufw.rb' diff --git a/cookbooks/base/files/etc/apt/apt.conf.d/20auto-upgrades b/cookbooks/base/files/etc/apt/apt.conf.d/20auto-upgrades new file mode 100644 index 0000000..8d6d7c8 --- /dev/null +++ b/cookbooks/base/files/etc/apt/apt.conf.d/20auto-upgrades @@ -0,0 +1,2 @@ +APT::Periodic::Update-Package-Lists "1"; +APT::Periodic::Unattended-Upgrade "1"; diff --git a/cookbooks/base/files/etc/apt/apt.conf.d/50unattended-upgrades b/cookbooks/base/files/etc/apt/apt.conf.d/50unattended-upgrades new file mode 100644 index 0000000..d31a4d2 --- /dev/null +++ b/cookbooks/base/files/etc/apt/apt.conf.d/50unattended-upgrades @@ -0,0 +1,131 @@ +// Automatically upgrade packages from these (origin:archive) pairs +// +// Note that in Ubuntu security updates may pull in new dependencies +// from non-security sources (e.g. chromium). By allowing the release +// pocket these get automatically pulled in. +Unattended-Upgrade::Allowed-Origins { + "${distro_id}:${distro_codename}"; + "${distro_id}:${distro_codename}-security"; + // Extended Security Maintenance; doesn't necessarily exist for + // every release and this system may not have it installed, but if + // available, the policy for updates is such that unattended-upgrades + // should also install from here by default. + "${distro_id}ESMApps:${distro_codename}-apps-security"; + "${distro_id}ESM:${distro_codename}-infra-security"; +// "${distro_id}:${distro_codename}-updates"; +// "${distro_id}:${distro_codename}-proposed"; +// "${distro_id}:${distro_codename}-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 controls whether the development release of Ubuntu will be +// upgraded automatically. Valid values are "true", "false", and "auto". +Unattended-Upgrade::DevRelease "auto"; + +// 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"; + +// 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 ""; + +// 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"; + +// Do automatic removal of newly unused dependencies after the upgrade +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 "true"; + +// Automatically reboot *WITHOUT CONFIRMATION* if +// the file /var/run/reboot-required is found after the upgrade +Unattended-Upgrade::Automatic-Reboot "false"; + +// 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"; + +// 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"; + +// 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"; diff --git a/cookbooks/base/unattended-upgrade.rb b/cookbooks/base/unattended-upgrade.rb new file mode 100644 index 0000000..4ab6b59 --- /dev/null +++ b/cookbooks/base/unattended-upgrade.rb @@ -0,0 +1,56 @@ +case run_command('grep VERSION_ID /etc/os-release | awk -F\" \'{print $2}\'').stdout.chomp +when "18.04" + # Install `cron-apt`: + package 'cron-apt' + + # From here, we are going to set up `cron-apt` to + # install the important security updates every day. + remote_file '/etc/cron-apt/config' do + user 'root' + + owner 'root' + group 'root' + mode '644' + end + + remote_file '/etc/cron-apt/action.d/3-download' do + user 'root' + + owner 'root' + group 'root' + mode '644' + end + + execute 'grep security /etc/apt/sources.list > /etc/apt/security.sources.list' do + user 'root' + + not_if 'test -e /etc/apt/security.sources.list' + end + + file '/var/log/cron-apt/log' do + user 'root' + + content 'foo\n' + + owner 'root' + group 'root' + mode '666' + + not_if 'test -e /var/log/cron-apt/log' + end + + execute '/usr/sbin/logrotate -f /etc/logrotate.d/cron-apt' do + user 'root' + + not_if 'test -e /var/log/cron-apt/log' + end + +when '20.04' + %w(20auto-upgrades 50unattended-upgrades).each do |conf| + remote_file "/etc/apt/apt.conf.d/#{conf}" do + owner 'root' + group 'root' + mode '644' + end + end +end