Yesterday I wrote about my plans to make deploying new Ubuntu servers both easier and more repeatable by relying on apt metapackages.
I’ve been working on the implementation, and it’s going pretty well so far. This documents the basic steps:
First, I installed the equivs package
aptitude install equivs
At this point, I’m not including any config files or post installation tasks, so I only have to worry about the control file.
This generates a control file template in the current directory that you edit. I want to make sure my system has ufw, munin-node, logrotate, rsync, mlocate and wget installed, and I cleaned out the options I didn’t need, so my control file looks like this:
### Commented entries have reasonable defaults. ### Uncomment to edit them. Section: misc Priority: optional Standards-Version: 3.6.2 Package: my-metapackage Version: 0.01 Maintainer: Your Humble Scribe <firstname.lastname@example.org> Depends: ufw, munin-node, logrotate, rsync, mlocate, wget Description: Depends on Useful Bits and Pieces This is a dependency package that we use to make sure that basics, like a firewall, rsync, munin-node, etc, are installed.
Next step is to turn that into a debian package:
#equivs-build my-metapackage dh_testdir dh_testroot dh_clean -k dh_testdir dh_testroot dh_install dh_installdocs dh_installchangelogs dh_compress dh_fixperms dh_installdeb dh_gencontrol dh_md5sums dh_builddeb dpkg-deb: building package `my-metapackage' in `../my-metapackage_0.01_all.deb'.
The package has been created. Attention, the package has been created in the current directory, not in ".." as indicated by the message above!
Now to test it out:
sudo dpkg -i my-metapackage_0.01_all.deb
This will install my-metapackage, but that’s not enough. Dpkg can’t satisfy remote dependancies, so it will throw errors for each of the dependencies you created and leave your newly installed package in a broken state. You can then use aptitude to resolve these missing dependencies to complete the process:
sudo aptitude -fy --safe-resolver install
This tells aptitude to install to fix any missing dependencies.
That should be it. I’ll note though, that for some reason, aptitude was insisting on removing my packages, rather than fixing the broken dependencies. I’m not sure why, and I’m not sure why its working now
It’s usually a bad idea to install software using dpkg, for just the reason you allude to: dependencies don’t get handled correctly.
The optimal way to install the software would be simply to use aptitude, but if the package isn’t in a repository, you would have problems.
Fortunately, gdebi solves the problem in one fell swoop. Simply install the package with:
sudo gdebi my-metapackage_0.01_all.deb