Media Center Series Part 3: Simpler Raspberry Pi 4

In a previous post I discussed using Ansible to install Docker and Docker Compose on Debian. Since then I’ve taken this and made some updates as I’ve gone and modified for use on a Raspberry Pi 4 instead of just testing on a Linode instance.

Changes

Docker Installation

As fun (complicated?) as it was manually doing all the steps to install Docker, there is a nice first party install script you can curl and run instead. It was not usable on the RPi 4 previously which is why I had not originally used it but it has since been updated and works perfectly on Raspbian.

Another upside of this change is it means you don’t have to manually check and set the architecture and release when you set up the repos. All that is handled by the script.

Docker Compose Installation

Docker Compose is now installed using Pip rather than curling the binary and dropping it on the box. The main downside is this take makes longer to run, especially since the pip install has native code that needs to be compiled and its happening on the RPi itself. The main upside is… well I guess I’d just rather use a package manager in this case? Perhaps the rationale for this change is not as strong as the other one.

Also note that Docker Compose seems to have problems with Python 2’s backported libraries on Debian. There are currently two that gave me problems on Raspbian:

  • python-backports.ssl-match-hostname
  • python-backports.shutil_get_terminal_size

You can either (1) uninstall them with pip and then reinstall them with apt or (2) install and use Python 3 instead.

Note that I also made the choice to install into the system Python rather than a virtual environment for simplicity.

Running the Playbook

Final change is the playbook now uses a ssh connection rather than running locally on the RPi so it must now be provided an inventory when run.

The updated playbook

Here is the updated playbook:

---

  - name: Docker
    connection: ssh
    gather_facts: yes
    hosts: rpi
    vars_prompt:
      - name: password
        prompt: "Password for docker user"
        private: yes
        encrypt: "sha512_crypt"
        confirm: yes
        salt_size: 7
    become_user: root
    become: yes
    tasks:
      - name: Download Docker Install Script
        get_url:
          url: https://get.docker.com
          dest: /tmp/docker_install.sh
      - name: Run the Docker Install Script
        shell: sh /tmp/docker_install.sh
      - name: Create docker user
        user:
            name: docker
            password: "{{password}}"
            update_password: on_create
            groups:
                - sudo
                - render
                - video
                - docker
            shell: /bin/bash
            state: present
      - name: Set Docker to Run on Startup
        systemd:
          state: started
          name: docker
          enabled: true
      - name: Docker Compose Dependencies Workaround
        # See https://stackoverflow.com/a/51071841
        pip:
          name:
            - backports.ssl-match-hostname
            - backports.shutil_get_terminal_size
          state: absent
      - name: Install Docker Compose Dependencies
        apt:
          pkg:
            - python-backports.ssl-match-hostname
            - python-backports.shutil_get_terminal_size
            - python-pip
            - python-dev
            - libffi-dev
            - libssl-dev
            - build-essential
          update_cache: yes
      - name: Install Docker Compose
        pip:
          name: docker-compose

Updated:

Comments