from pyinfra import host from pyinfra.api import deploy from pyinfra.facts.files import File from pyinfra.facts.server import Command from pyinfra.facts.server import LsbRelease from pyinfra.operations import apt from pyinfra.operations import server DOCKER_REPO_KEY_PATH = "/usr/share/keyrings/docker-official-repo.gpg" @deploy("Setup docker repository") def setup_repository(): lsb = host.get_fact(LsbRelease) dpkg_arch = host.get_fact(Command, command="dpkg --print-architecture") if not host.get_fact(File, path=DOCKER_REPO_KEY_PATH): server.shell( name="Download docker repository gpg key", commands=[ "curl -fsSL https://download.docker.com/linux/debian/gpg " f"| gpg --dearmor | tee {DOCKER_REPO_KEY_PATH} >/dev/null 2>&1", ], ) repo_changed = apt.repo( name="Add official docker repository", src=f"deb [arch={dpkg_arch} signed-by={ DOCKER_REPO_KEY_PATH }] https://download.docker.com/linux/debian {lsb["codename"]} stable", filename="docker", ).changed if repo_changed: apt.update( name="Update repositories after adding docker", ) @deploy("Deploy Docker") def deploy_docker(): apt.packages( name="Install packages required by Docker", packages=[ "apt-transport-https", "ca-certificates", "curl", "gnupg-agent", "software-properties-common", ], ) setup_repository() apt.packages( name="Install docker packages", packages=[ "docker-ce", "docker-ce-cli", "docker-ce-rootless-extras", ], update=True, )