In the first article of this series on using Ansible to configure a workstation, we set up a repository and configured a few basic things. In the second part, we automated Ansible to apply settings automatically when changes are made to our repository. In this third (and final) article, we'll use Ansible to configure GNOME desktop settings.
This configuration will work only on newer distributions (such as Ubuntu 18.04, which I'll use in my examples). Older versions of Ubuntu will not work, as they ship with a version of
python-psutils that is too old for Ansible's
dconf module to work properly. If you're using a newer version of your Linux distribution, you should have no issues.
Before you begin, make sure you've worked through parts one and two of this series, as part three builds upon that groundwork. If you haven't already, download the repository you've been using in those first two articles. We'll add a few more features to it.
Set a wallpaper and lock screen
First, we'll create a taskbook to hold our GNOME settings. In the root of the repository, you should have a file named
local.yml. Add the following line to it:
- include: tasks/gnome.yml
The entire file should now look like this:
- hosts: localhost become: true pre_tasks: - name: update repositories apt: update_cache=yes changed_when: False tasks: - include: tasks/users.yml - include: tasks/cron.yml - include: tasks/packages.yml - include: tasks/gnome.yml
Basically, this added a reference to a file named
gnome.yml that will be stored in the
tasks directory inside the repository. We haven't created this file yet, so let's do that now. Create
gnome.yml file in the
tasks directory, and place the following content inside:
- name: Install python-psutil package apt: name=python-psutil - name: Copy wallpaper file copy: src=files/wallpaper.jpg dest=/home/jay/.wallpaper.jpg owner=jay group=jay mode=600 - name: Set GNOME Wallpaper become_user: jay dconf: key="/org/gnome/desktop/background/picture-uri" value="'file:///home/jay/.wallpaper.jpg'"
Note that this code refers to my username (
jay) several times, so make sure to replace every occurrence of
jay with the username you use on your machine. Also, if you're not using Ubuntu 18.04 (as I am), you'll have to change the
apt line to match the package manager for your chosen distribution and to confirm the name of the
python-psutil package for your distribution, as it may be different.
In the example tasks, I referred to a file named
wallpaper.jpg inside the
files directory. This file must exist or the Ansible configuration will fail. Inside the
tasks directory, create a subdirectory named
files. Find a wallpaper image you like, name it
wallpaper.jpg, and place it inside the
files directory. If the file is a PNG image instead of a JPG, change the file extension in both the code and in the repository. If you're not feeling creative, I have an example wallpaper file in the repository for this article series that you can use.
Once you've made all these changes, commit everything to your repository, and push those changes. To recap, you should've completed the following:
- Modified the
local.ymlfile to refer to the
- Created the
tasks/gnome.ymlplaybook with the content mentioned above
- Created a
filesdirectory inside the
tasksdirectory, with an image file named
wallpaper.jpg(or whatever you chose to call it).
Once you've completed those steps and pushed your changes back to the repository, the configuration should be automatically applied during its next scheduled run. (You may recall that we automated this in the previous article.) If you're in a hurry, you can apply the configuration immediately with the following command:
sudo ansible-pull -U https://github.com/<github_user>/ansible.git
If everything ran correctly, you should see your new wallpaper.
Let's take a moment to go through what the new GNOME taskbook does. First, we added a play to install the
python-psutil package. If we don't add this, we can't use the
dconf module, since it requires this package to be installed before we can modify GNOME settings. Next, we used the
copy module to copy the wallpaper file to our
home directory, and we named the resulting file starting with a period to hide it. If you'd prefer not to have this file in the root of your
home directory, you can always instruct this section to copy it somewhere else—it will still work as long as you refer to it at the correct place. In the next play, we used the
dconf module to change GNOME settings. In this case, we adjusted the
/org/gnome/desktop/background/picture-uri key and set it equal to
file:///home/jay/.wallpaper.jpg. Note the quotes in this section of the playbook—you must always use two single-quotes in
dconf values, and you must also include double-quotes if the value is a string.
Now, let's take our configuration a step further and apply a background to the lock screen. Here's the GNOME taskbook again, but with two additional plays added:
- name: Install python-psutil package apt: name=python-psutil - name: Copy wallpaper file copy: src=files/wallpaper.jpg dest=/home/jay/.wallpaper.jpg owner=jay group=jay mode=600 - name: Set GNOME wallpaper dconf: key="/org/gnome/desktop/background/picture-uri" value="'file:///home/jay/.wallpaper.jpg'" - name: Copy lockscreenfile copy: src=files/lockscreen.jpg dest=/home/jay/.lockscreen.jpg owner=jay group=jay mode=600 - name: Set lock screen background become_user: jay dconf: key="/org/gnome/desktop/screensaver/picture-uri" value="'file:///home/jay/.lockscreen.jpg'"
As you can see, we're pretty much doing the same thing as we did with the wallpaper. We added two additional tasks, one to copy the lock screen image and place it in our
home directory, and another to apply the setting to GNOME so it will be used. Again, be sure to change your username from
jay and also name your desired lock screen picture
lockscreen.jpg and copy it to the
files directory. Once you've committed these changes to your repository, the new lock screen should be applied during the next scheduled Ansible run.
Apply a new desktop theme
Setting the wallpaper and lock screen background is cool and all, but let's go even further and apply a desktop theme. First, let's add an instruction to our taskbook to install the package for the
arc theme. Add the following code to the beginning of the GNOME taskbook:
- name: Install arc theme apt: name=arc-theme
Then, at the bottom, add the following play:
- name: Set GTK theme become_user: jay dconf: key="/org/gnome/desktop/interface/gtk-theme" value="'Arc'"
Did you see GNOME's GTK theme change right before your eyes? We added a play to install the
arc-theme package via the
apt module and another play to apply this theme to GNOME.
Make other customizations
Now that you've changed some GNOME settings, feel free to add additional customizations on your own. Any setting you can tweak in GNOME can be automated this way; setting the wallpapers and the theme were just a few examples. You may be wondering how to find the settings that you want to change. Here's a trick that works for me.
First, take a snapshot of ALL your current
dconf settings by running the following command on the machine you're managing:
dconf dump / > before.txt
This command exports all your current changes to a file named
before.txt. Next, manually change the setting you want to automate, and capture the
dconf settings again:
dconf dump / > after.txt
Now, you can use the
diff command to see what's different between the two files:
diff before.txt after.txt
This should give you a list of keys that changed. While it's true that changing settings manually defeats the purpose of automation, what you're essentially doing is capturing the keys that change when you update your preferred settings, which then allows you to create Ansible plays to modify those settings so you'll never need to touch those settings again. If you ever need to restore your machine, your Ansible repository will take care of each and every one of your customizations. If you have multiple machines, or even a fleet of workstations, you only have to manually make the change once, and all other workstations will have the new settings applied and be completely in sync.
If you've followed along with this series, you should know how to set up Ansible to automate your workstation. These examples offer a useful baseline, and you can use the syntax and examples to make additional customizations. As you go along, you can continue to add new modifications, which will make your Ansible configuration grow over time.
I've used Ansible in this way to automate everything, including my user account and password; configuration files for Vim, tmux, etc.; desktop packages; SSH settings; SSH keys; and basically everything I could ever want to customize. Using this series as a starting point will pave the way for you to completely automate your workstations.