Emerald Reverie

Gwmngilfen's blog - Tech, cooking, walking and other randomness from the heart of Scotland

Caching Packages With TheForeman

If (like me) you find yourself re-installing your machines a lot (and let’s face it, that’s what Foreman is for), then a package cache can save you a huge amount of data traffic. There are many ways to achieve this, but I’ll describe how I’m using apt-cacher-ng to help me save data.

Apt-cacher-ng is particularly helpful since it can support almost any OS - the documentation has instructions for Debian, Ubuntu, Fedora, CentOS, OpenSUSE, and even Archlinux. Today I’ll focus on Debian & Ubuntu, but I have plans for an upcoming article on Foreman & Archlinux, so stay tuned if that’s of interest to you.


Since I run my Foreman installation on Debian, I can just get it from the repository:

apt-get install apt-cacher-ng

on your Foreman box, and then go to http://foreman:3142 to check it’s running. You can tail /var/log/apt-cacher-ng/apt-cacher.log to watch it work.


There are a number of ways to configure Apt to use a package cache. I’ll describe two. Firstly, you can edit your source list (/etc/apt/sources.list or files in sources.list.d) and replace all the servers with your proxy. So a line like:

deb http://ftp.uk.debian.org/debian/ squeeze main non-free contrib


deb http://foreman:3142/debian/ squeeze main non-free contrib

That’s messy though - the easier way is to add the proxy to the Apt preferences:

echo 'Acquire::http::Proxy "http://foreman:3142/";' >> /etc/apt/apt.conf


All that is easy enough, and well documented elsewhere on the web. Let’s get to our favourite topic: Foreman!

Tweaking Foreman is easy enough. Firstly go to More -> Provisioning Templates and edit the provisioning template for your machines. That would be Preseed Default if your using the out-of-the box Foreman installation. Find the mirror/http/proxy line and add your proxy, so my complete line looks like

d-i mirror/http/proxy string http://foreman:3142/

It’s quite possible to use different proxies for different hosts, for example, using a parameter:

d-i mirror/http/proxy string <%= @host.params['proxy_string'] %>

Obviously this will differ with Kickstart, but I’ve no experience there.

You’ll also need to modify your finish script (Preseed Default finish by default) - there is a wget call to Foreman at the end which fails due to the presence of proxy data. Add –no-proxy to fix this. For example:

/usr/bin/wget --no-proxy --quiet --output-document=/dev/null --no-check-certificate <%= foreman_url %>

That’s all you need - if you tail your cache log as above and kick off a new Debian build, you should see it hitting the proxy.

Ubuntu tweak on Debian apt-cacher-ng

I discovered that using apt-cacher-ng on Debian didn’t quite set up Ubuntu quite right - I had to do this:

echo "http://gb.archive.ubuntu.com/ubuntu/" > /etc/apt-cacher-ng/backends_ubuntu

I then restarted apt-cacher-ng and all was well.