Skip to content

Instantly share code, notes, and snippets.

@mtelvers
Created January 16, 2026 13:57
Show Gist options
  • Select an option

  • Save mtelvers/dbc3828eab622530a67d72535feb5908 to your computer and use it in GitHub Desktop.

Select an option

Save mtelvers/dbc3828eab622530a67d72535feb5908 to your computer and use it in GitHub Desktop.
Update Ubuntu machines to Noble
- hosts: all
serial: 1
gather_facts: true
vars:
target_release: noble
tasks:
- name: Skip hosts that are not ARM64 workers
meta: end_host
when: builder_pool != 'linux-arm64'
- name: Check current Ubuntu release
debug:
msg: "Current release: {{ ansible_distribution_release }}"
- name: Skip hosts already on Noble
meta: end_host
when: ansible_distribution_release == target_release
- name: Check for held packages
shell: apt-mark showhold
become: true
register: held_packages
- name: Show held packages
debug:
var: held_packages.stdout_lines
when: held_packages.stdout_lines | length > 0
- name: Unhold all held packages
shell: apt-mark unhold {{ held_packages.stdout_lines | join(' ') }}
become: true
when: held_packages.stdout_lines | length > 0
- name: Full system update
shell: |
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
apt-get -y autoremove --purge
apt-get -y install update-manager-core
become: true
- name: Check what updates remain
shell: apt list --upgradable 2>/dev/null | grep -v "Listing..."
become: true
register: remaining_updates
failed_when: false
- name: Show remaining updates
debug:
var: remaining_updates.stdout_lines
when: remaining_updates.stdout_lines | length > 0
- name: Check if reboot is required after updates
stat:
path: /var/run/reboot-required
register: reboot_required
- name: Reboot if required after package updates
reboot:
reboot_timeout: 600
become: true
when: reboot_required.stat.exists
- name: Wait for system to come back online after pre-upgrade reboot
wait_for_connection:
delay: 30
timeout: 300
when: reboot_required.stat.exists
- name: Re-gather facts after potential reboot
setup:
when: reboot_required.stat.exists
- name: Run do-release-upgrade
shell: do-release-upgrade -f DistUpgradeViewNonInteractive
become: true
register: upgrade_result
- name: Display upgrade output
debug:
var: upgrade_result.stdout_lines
- name: Reboot the machine after upgrade
reboot:
reboot_timeout: 600
become: true
- name: Wait for system to come back online
wait_for_connection:
delay: 30
timeout: 300
- name: Gather facts after reboot
setup:
- name: Verify upgrade was successful
assert:
that:
- ansible_distribution_release == target_release
fail_msg: "Upgrade failed - system is on {{ ansible_distribution_release }} instead of {{ target_release }}"
success_msg: "Successfully upgraded to Ubuntu {{ target_release }}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment