Syncthing ansible role

2023-01-21 - The ansible role I wrote to manage my syncthing configurations
Tags: ansible syncthing

Introduction

I have been using syncthing for some time now. It is a tool to handle bidirectional synchronization of data. For example I use it on my personal infrastructure to synchronize:

It is very useful, but by default the configuration leave a few things to be desired like telemetry or information leaks. If you want maximum privacy you need to disable the auto discovery and the default nat traversal features.

Also provisioning is easy, but deleting or unsharing stuff would require to remember what is shared where and go manage each device individually from syncthing’s web interface. I automated all that with ansible (well except for my phone which I cannot manage with ansible, its syncthing configuration will remain manual… for now).

Why another ansible role

I wanted a role to install and configure syncthing for me and did not find an existing one that satisfied me. I had a few mandatory features in mind:

Dependencies

This role relies on doas being installed and configured so that your ansible user can run the syncthing cli as the syncthing user.

Here is an example of a doas.conf that works for the ansible user:

permit  nopass  ansible  as  syncthing

Role variables

There is a single variable to specify in the host_vars of your hosts: syncthing. This is a dict that can contain the following keys:

Configuring a host through its host_vars looks like this:

syncthing:
  address: tcp://lore.adyxax.org
  shared:
    - name: org-mode
      path: /var/syncthing/org-mode
      peers:
        - hero
        - light
        - lumapps
        - Pixel 3a

The optional syncthing_data.yaml file

To be found by the action_plugins, this file should be in the same folder as your playbook. It shares the same format as the host_vars but with additional keys for the hostname and its ID.

The data file for non ansible devices looks like this:

- name: Pixel 3a
  id: ABCDEFG-HIJKLMN-OPQRSTU-VWXYZ01-2345678-90ABCDE-FGHIJKL-MNOPQRS
  shared:
    - name: Music
      path: /storage/emulated/0/Music
      peers:
        - phoenix
    - name: Photos
      path: /storage/emulated/0/DCIM/Camera
      peers:
        - phoenix
    - name: org-mode
      path: /storage/emulated/0/Org
      peers:
        - lore.adyxax.org

Example playbook

- hosts: all
  roles:
    -  {  role:  syncthing, tags: [ 'syncthing' ], when: "syncthing is defined" }

Conclusion

You can find the role here. If I left something unclear or some piece seems to be missing, do not hesitate to contact me.