Speeding Up Automation Using Apt Mirror URIs

If you use some dev or build automation that spins up new Ubuntu images you will one day see them slow to a crawl when they are accessing the default installation mirror. It is annoying waiting for Docker or Vagrant at the best of times but if a mirror gets slow enough it can be infuriating or even break your builds.

Many people know about the various tools that let you select a fast mirror for Ubuntu. This post is about a nice feature that most people do not know about.

By default, you will be using http://archive.ubuntu.com/ubuntu

Apt supports a mirror URI which will automatically select a close mirror for you. This is the feature most people don't know about:

deb mirror://mirrors.ubuntu.com/mirrors.txt

To use this you need to edit the apt sources list. Of course, you need this done in an automated fashion which is why the mirror syntax is so handy, you don't need to run a program, just do some substitutions in the sources file.

Here is how I do it with Vagrant. I included my boilerplate Ansible playbook too. You don't have to copy and paste, the files are also on Github: https://github.com/mjeg/apt-mirror-vagrant


Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/bionic64"
  config.vm.provision :shell, :inline => "sed -i 's|deb http://archive.ubuntu.com.ubuntu|deb mirror://mirrors.ubuntu.com/mirrors.txt|g' /etc/apt/sources.list"
  config.vm.provision "shell", inline: "sed -i '/deb-src/d' /etc/apt/sources.list"
  config.vm.provision "shell", inline: "apt-get update -y"
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end

playbook.yml

---
- hosts: all
  gather_facts: no
  pre_tasks:
    - name: 'install python2'
      raw: sudo apt-get -y install python
  tasks:
    - name: Install all the debs
      become: yes
      apt:
        name:
          - python-setuptools
          - python3-pip
          - build-essential
        state: present
        update_cache: yes

After the VM has booted but before Ansible is run we swap out the apt mirrors using the shell provisioning feature of Vagrant.

You will notice that I also remove deb-src from the repo list. This speeds things up a little bit. However, the main point of doing this is not to slightly speed things up. It will save you from the day when archive.ubuntu.com is running dog slow and you want to hulk smash everything.

Matthew Grove