Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Managing Dotfiles With Ansible

DZone's Guide to

Managing Dotfiles With Ansible

How to use Ansible's configuration management tools with zsh configuration.

· DevOps Zone
Free Resource

The Nexus Suite is uniquely architected for a DevOps native world and creates value early in the development pipeline, provides precise contextual controls at every phase, and accelerates DevOps innovation with automation you can trust. Read how in this ebook.

The other day 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


ZSH_THEME="{{ zsh_theme }}"

...

plugins=({{ oh_my_zsh_plugins|join(' ') }})

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"

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.

The DevOps Zone is brought to you in partnership with Sonatype Nexus.  See how the Nexus platform infuses precise open source component intelligence into the DevOps pipeline early, everywhere, and at scale. Read how in this ebook

Topics:
ansible

Published at DZone with permission of James Carr, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}