Deploying clortho with ansible and venv

I have started using Ansible to manage the few services that I still have running around here. I want to deploy clortho to a user on the system I use for serving up movies to my Roku players . I need to copy the source, setup a venv with the dependencies (aiohttp ), and setup a systemd unit to make sure it is started at boot time.

As of Python 3.3 the core library includes support for venv , and Python 3.4 added default installation of pip so that now the only support you need on a target system is the core Python 3.4 build. Everything else can be done inside a venv.

Here’s the Ansible playbook that I am using:

---
- hosts: clortho-host
  tasks:
    - name: Test connection
      ping:

    - name: Create clortho user
      user: name=clortho

    - name: Install clortho.service
      copy: src=./configs/clortho/clortho.service dest=/usr/lib/systemd/system/
      notify:
      - restart clortho
      - reload systemd

    - name: Install clortho
      synchronize: src=./git/clortho/ dest=/home/clortho/app/ rsync_opts=--exclude=.git
      notify:
      - restart clortho

    - name: Setup venv for clortho
      pip: requirements=/home/clortho/app/requirements.txt virtualenv=/home/clortho/.venv/ virtualenv_command=pyvenv-3.4
      notify:
      - restart clortho

    - name: Enable clortho.service at boot
      service: name=clortho enabled=yes

  handlers:
    - name: restart clortho
      service: name=clortho state=restarted

    - name: reload systemd
      command: systemctl daemon-reload

This creates a clortho user with a default home directory, installs the systemd service file, and copies over the checked-out version of clortho from the host. Currently I manage deploying my code from a git repo that is a clone of the working repo. I can then check out experimental branches for deployment without disturbing other work on the same project.

The venv (this is a Python 3.4 project) is setup using pip with Python 3.4 installed to /usr/local/ on the target system. Other than the core Python 3.4 modules all dependencies are in the application specific venv in the clortho home directory. The important bit is setting the virtualenv_command to pyvenv-3.4 so that Python 3.4 is used for the setup, without that it would use the system’s default version of Python.

In order to start the service at boot time it uses a systemd service file that looks like this:

[Unit]
Description=Clortho key server
After=network-online.target

[Service]
WorkingDirectory=/home/clortho/
User=clortho
ExecStart=/home/clortho/.venv/bin/python3.4 /home/clortho/app/src/clortho.py --port 9006

[Install]
WantedBy=multi-user.target

This runs the service as the clortho user and starts it using the Python 3.4 venv environment. Systemd has made the management of services much easier and cleaner than the old style init systems. I was skeptical at first, but it really is a huge improvement.

With all of the above I now have a key/value server running on localhost port 9006. The goal is to use this with the Home Media Server project for the Roku so that it will remember the last played episodes and positions for the videos. Currently the HMS application writes that data to the Roku’s tmp:/ filesystem which is deleted when you exit, meaning you start each session by scrolling through a pile of episodes trying to remember the last one you watched. I’ll talk about the changes to HMS in a future post.