Bashtard v2.0.0


  • The var subcommand is now referenced in usage().
  • A pkg subcommand has been added, to allow for direct interaction with the pkg_*() utilities provided by Bashtard.
  • config_subkeys() and config_subkeys_for have been added, to look up subkeys defined in config files. These can help when you want to use a list somewhere in your configuration.
  • A backup subcommand has been added. This backup system uses borg, which must be installed, but should be generic enough to be usable by most people out of the box.
  • The Makefile has been extended with targets for creating packages for GNU+Linux distributions.
  • The $BASHTARD_PLATFORM variable now contains an additional entry, init, to allow for handling different init systems on GNU+Linux in a cleaner fashion.
  • A file_hash utility function has been added. It currently uses md5, but is written in such a fashion that this can easily be updated for the future. Its intent is to encapsulate differences between naming and usage of hashing utilities found on different systems.
  • A dir_hash utility function has been added, which will give you a hash based on the file contents of a directory. This function will find files recursively, calculate a hash for each of them, and then calculate a hash based on the total result. The intended goal is to allow running before and after templating some files, to deduce whether something actually changed.
  • A diff subcommand has been added to show all non-committed changes. It is a convenience wrapper to avoid having to change directory and run git diff to get an overview of all pending changes.
  • A pull subcommand has been added to only pull the latest changes into the $BASHTARD_ETCDIR, without running sync on all the playbooks.
  • A new global variable, $BASHTARD_PLAYBOOK_VARS has been added. Currently, its only purpose is to check for “required” variables to be used in the playbook. Before an add or sync, any variables declared to be required in the $BASHTARD_PLAYBOOK_VARS array will be checked to be non-empty. If any are empty, an error will be thrown and the playbook will not be ran.
  • A new directory has been added, data.d, for data that should be shared between playbook runs. This new directory is intended to create a clearer seperation between a playbook and a user’s specific data used by the playbook, which in turn should make re-using playbooks easier.
  • A convenience function has been introduced, playbook_path(), which can give you the absolute path to the playbook’s base or data directory.
  • A top subcommand has been added to give some generic information of all nodes known to Bashtard. It uses information from the sysinfo subcommand, which it will pull in through an ssh invocation.


  • The ssh subcommand’s configuration has been nested under bashtard, e.g. is now It should also be correctly using this value for establishing the SSH connection.
  • svc_enable() now checks for the rc.d file to exist before running grep on it.
  • pkg_*() functions no longer require a pkg.* value to be defined. If one is not set explicitly, a warning will be generated, but the original name passed to the pkg_*() function will be used by the host’s package manager.
  • datetime() now always passes -u on to date.
  • All manpages now include a NAME section.
  • The sync subcomman will now stash any changes before it attempts to pull. Afterwards, stash pop will be ran to apply the last stashed changes again.