this post was submitted on 21 Jul 2024
41 points (95.6% liked)

Linux

47337 readers
1244 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

I am using unattended-upgrades across multiple servers. I would like package updates to be rolled out gradually, either randomly or to a subset of test/staging machines first. Is there a way to do that for APT on Ubuntu?

An obvious option is to set some machines to update on Monday and the others to update on Wednesday, but that only gives me only weekly updates...

The goal of course is to avoid a Crowdstrike-like situation on my Ubuntu machines.

edit: For example. An updated openssh-server comes out. One fifth of the machines updates that day, another fifth updates the next day, and the rest updates 3 days later.

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 4 points 1 month ago* (last edited 1 month ago) (12 children)

To effectively manage and stagger automated upgrades across multiple groups of Ubuntu servers, scheduling upgrades on specific days for different server groups offers a structured and reliable method. This approach ensures that upgrades are rolled out in a controlled manner, reducing the risk of potential disruptions.

Here's an example Ansible playbook that illustrates how to set this up. It installs unattended-upgrades and configures systemd timers to manage upgrades on specific weekdays for three distinct groups of servers.

Playbook

 
***
  - hosts: all
    become: yes
    vars:
      unattended_upgrade_groups:
        - name: staging_batch1
          schedule: "Mon *-*-* 02:00:00"  # Updates on Monday
        - name: staging_batch2
          schedule: "Wed *-*-* 02:00:00"  # Updates on Wednesday
        - name: staging_batch3
          schedule: "Fri *-*-* 02:00:00"  # Updates on Friday

    tasks:
      - name: Install unattended-upgrades
        apt:
          name: unattended-upgrades
          state: present

      - name: Disable automatic updates to control manually
        copy:
          dest: /etc/apt/apt.conf.d/20auto-upgrades
          content: |
            APT::Periodic::Update-Package-Lists "1";
            APT::Periodic::Download-Upgradeable-Packages "0";
            APT::Periodic::AutocleanInterval "7";
            APT::Periodic::Unattended-Upgrade "0";
          mode: '0644'

      - name: Setup systemd service and timer for each group
        loop: "{{ unattended_upgrade_groups }}"
        block:
          - name: Create systemd service for unattended-upgrades for {{ item.name }}
            copy:
              dest: "/etc/systemd/system/unattended-upgrades-{{ item.name }}.service"
              content: |
                [Unit]
                Description=Run unattended upgrades for {{ item.name }}

                [Service]
                Type=oneshot
                ExecStart=/usr/bin/unattended-upgrade
              mode: '0644'

          - name: Create systemd timer for {{ item.name }}
            copy:
              dest: "/etc/systemd/system/unattended-upgrades-{{ item.name }}.timer"
              content: |
                [Unit]
                Description=Timer for unattended upgrades on {{ item.schedule }} for {{ item.name }}

                [Timer]
                OnCalendar={{ item.schedule }}
                Persistent=true

                [Install]
                WantedBy=timers.target
              mode: '0644'

          - name: Enable the timer for {{ item.name }}
            systemd:
              name: "unattended-upgrades-{{ item.name }}.timer"
              enabled: yes

          - name: Start the timer for {{ item.name }}
            systemd:
              name: "unattended-upgrades-{{ item.name }}.timer"
              state: started

[–] [email protected] 6 points 1 month ago (2 children)

Using scheduling is not a good option IMO, it's both too slow (some machines will wait a week to upgrade) and too fast (significant part of machines will upgrade right away).

It seems that making APT mirrors at the cadence I want is the best solution, but thanks for the answer.

[–] [email protected] 4 points 1 month ago

That's a great idea! Learned something new, thanks.

load more comments (1 replies)
load more comments (10 replies)