How we automate installing extra packages during Ubuntu installs
We have a local system for installing Ubuntu machines, and one of the important things it does is install various additional Ubuntu packages that we want as part of our standard installs. These days we have two sorts of standard installs, a 'base' set of packages that everything gets and a broader set of packages that login servers and compute servers get (to make them more useful and usable by people). Specialized machines need additional packages, and while we can automate installation of those too, they're generally a small enough set of packages that we document them in our install instructions for each machine and install them by hand.
There are probably clever ways to do bulk installs of Ubuntu packages, but if so, we don't use them. Our approach is instead a brute force one. We have files that contain lists of packages, such as a 'base' file, and these files just contain a list of packages with optional comments:
# Partial example of Basic package set amanda-client curl jq [...] # decodes kernel MCE/machine check events rasdaemon # Be able to build Debian (Ubuntu) packages on anything build-essential fakeroot dpkg-dev devscripts automake
(Like all of the rest of our configuration information, these package set files live in our central administrative filesystem. You could distribute them in some other way, for example fetching them with rsync or even HTTP.)
To install these packages, we use grep to extract the actual packages into a big list and feed the big list to apt-get. This is more or less:
pkgs=$(cat $PKGDIR/$s | grep -v '^#' | grep -v '^[ \t]*$') apt-get -qq -y install $pkgs
(This will abort if any of the packages we list aren't available. We consider this a feature, because it means we have an error in the list of packages.)
A more organized and minimal approach might be to add the '--no-install-recommends' option, but we started without it and we don't particularly want to go back to find which recommended packages we'd have to explicitly add to our package lists.
At least some of the 'base' package installs could be done during the initial system install process from our customized Ubuntu server ISO image, since you can specify additional packages to install. However, doing package installs that way would create a series of issues in practice. We'd probably need to more carefully track which package came from which Ubuntu collection, since only some of them are enabled during the server install process, it would be harder to update the lists, and the tools for handling the whole process would be a lot more limited, as would our ability to troubleshoot any problems.
Doing this additional package install in our 'postinstall' process means that we're doing it in a full Unix environment where we have all of the standard Unix tools, and we can easily look around the system if and when there's a problem. Generally we've found that the more of our installs we can defer to once the system is running normally, the better.
(Also, the less the Ubuntu installer does, the faster it finishes and the sooner we can get back to our desks.)
(This entry was inspired by parts of a blog post I read recently and reflecting about how we've made setting up new versions of machines pretty easy, assuming our core infrastructure is there.)
|
|