Managing Dotfiles With Ansible
Yesterday I posted about managing our local configuration with Ansible and today I’m going to continue this path by putting my zsh configuration under configuration management.
Installing ZSH and oh-my-zsh
First up let’s install our preferred shell and customizations. For me this is zsh and oh-my-zsh. Up front I know that this is going to probably be a multi-step process so I’m going to create a local role to bundle up the tasks and templates we’ll be using. I create a new directory named roles
and add it to the roles_path
in our ansible.cfg
. This new directory with our new role will look like the following.
$ tree roles roles └── jamescarr.dotfiles └── tasks └── main.yaml
For our initial set of tasks we’ll install zsh via homebrew, configure zsh as the current user’s shell and install oh-my-zsh.
--- - name: Install ZSH homebrew: name: zsh state: latest - name: Change current user shell user: name: "{{ ansible_ssh_user }}" shell: /bin/zsh become: yes - name: Fetch oh-my-zsh get_url: url: https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh dest: /tmp/install-oh-my-zsh.sh mode: 0755 - name: Install oh-my-zsh command: zsh /tmp/install-oh-my-zsh.sh
You can see this change in its entirety here. Next up we’ll add a template for our zshrc that we can customize to our liking. To start we’ll grab the zshrc template from the oh-my-zsh git repository and save it to jamescarr.dotfiles/templates/zshrc.j2
.
A good first piece of literal text to template out is the zsh theme and the plugins loaded up. We’ll define these with default variables under jamescarr.dotfiles/defaults/main.yaml
.
--- zsh_theme: robbyrussell oh_my_zsh_plugins: - git
- name: Backup existing zshrc if it exists copy: src: "/Users/{{ ansible_ssh_user }}/.zshrc" dest: "/Users/{{ ansible_ssh_user }}/.zshrc-backup.{{ ansible_date_time.epoch }}" - name: Render zshrc template: src: zshrc.j2 dest: "/Users/{{ ansible_ssh_user }}/.zshrc"
ZSH_THEME="{{ zsh_theme }}" ... plugins=({{ oh_my_zsh_plugins|join(' ') }})
You’ll notice here we’ll also be polite by backing up the existing zshrc file if it is present. A good benefit with this example is that we can now switch up the different pieces of our .zshrc configuration from our playbook by overriding the default variables.
roles: - role: geerlingguy.homebrew - role: jamescarr.dotfiles zsh_theme: bureau oh_my_zsh_plugins: - git - osx
You can find everything up to this point at this referenced commit in jamescarr/ansible-mac-demo.
Up Next
Obviously a topic like zsh customizations is a rather large undertaking deserving of its own post so tomorrow I’ll share some of my personal zsh functions and aliases that I find extremely useful to start off with.
Well did you find the useful? Did you run into any problems following along? Please let me know in the comments below!
Reference: | Managing Dotfiles With Ansibleetting from our SCG partner James Carr at the Rants and Musings of an Agile Developer blog. |