The default pkgsrc package manager for a bunch of platforms, including SmartOS, is pkgin. While working on a role for dsapid (see: Setting up a SmartOS image server) I noticed that several pieces of functionality of pkgin were not supported by the Ansible module.
As a result one couldn’t use the module in a newly provisioned zone. This was due to the fact that in a fresh zone the pkgin cache is not yet populated, so installing a package would fail. Secondly, it’s become a habit to upgrade all the packages in zone when I manually log in the first time. Ansible couldn’t do that either.
After the recent OpenSSL debacle one had to force a reinstall python in order to unbreak it. Again, Ansible couldn’t handle it. *sadface*
Now, one could use a task such as following:
- name: reinstall python command: /usr/local/bin/pkgin -Fy python
However that feels very, very wrong.
So, this felt like a good moment to learn a thing or two about writing Ansible modules. First off was adding support for updating the local cache, with that in place we can now have a task to first update the cache, and then install a package:
- name: install tmux pkgin: name=tmux update_cache=yes
Or you can update the cache as a standalone task.
Logically we’d need a
clean option too:
- name: clean pkgin caches pkgin: clean=yes
Next up were handling upgrades of individual/main packages (
- name: upgrade tmux pkgin: name=tmux upgrade=yes
and all packages (
- name: upgrade all packages pkgin: full_upgrade=yes
force option added, we could now force a python re-install in a more idiomatic manner:
- name: re-install python pkgin: name=python force=yes
To tie everything together, you can now update your caches and upgrade all packages in a install or zone with Ansible:
- name: upgrade packages pkgin: update_cache=yes full_upgrade=yes
Update: As pointed out by Jonathan Perkin via Sevan Janiyan,
update_cache is no longer needed with pkgin 0.9.4.