My Dotfiles and Config, Managed by Ansible
Tools are great, but they have to be portable to the system you're working on to
be used. I install and configure tools across environments using this
jtmoulia/dotfiles uses the IT automation tool Ansible
to define and configure the target environment.
The current Ansible driven configuration is the latest in a series of attempts.
Initally I copied some dotfiles from computer to computer, using USB sticks,
emails, and scp to set up bespoke environments based on what I needed. To share
and version the dotfiles across system
jtmoulia/dotfiles was committed back
in 2012. I symlinked everything into my home directory using
This worked great until I wanted to do anything more complicated than just
symlinking files right into the home directory, like, say the basic tasks of
copying in a file (symlinks don't work for all dotfiles) or symlinking a file
~/.config. As these issues were addressed the bash script grew into a
monster Makefile that could copy, symlink, and backup multiple layers of files.
With the Makefile I could unpack some files and symlinks into my target system,
but that was the extent of it. That finally brings us to why Ansible. Ansible
allows installing files anywhere into the system as well as all sorts of other
configuration tasks. It's like
make, but the target state isn't isn't limited
to the existence of a file: the "targets" range from running a service to
inserting a line into a file. The task definitions are a bit verbose, but super
clear as to their intent. Beween roles and playbooks Ansible lets you layer
tasks any way necessary.
If you already have Pipenv installed you can quickly pull down the repo and install the required Python dependencies (Ansible):
git checkout https://github.com/jtmoulia/dotfiles ~/.dotfiles cd ~/.dotfiles pipenv install
With the dependencies installed into a virtual environment you can now execute your configuration:
This will install the basic configuration, including a helper script,
dotsible, to quickly run
If you're familiar with Ansible it's simple to add new functionality (via roles)
and target environments (via playbooks). Read more in the