From ba61a1e3ed92a745063ad1c706adf47c2aefeae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Krop=C3=A1=C4=8Dek?= Date: Sat, 8 Feb 2025 14:19:45 +0100 Subject: [PATCH] looks like everything is working --- inventory.py | 20 +++++++++++++++ provision.py | 25 +++++++----------- pyproject.toml | 1 - tasks/docker.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++ tasks/k3s.py | 4 +-- tasks/nfs.py | 6 ++--- tasks/ssh.py | 2 +- tasks/tailscale.py | 4 +-- uv.lock | 14 ----------- 9 files changed, 100 insertions(+), 39 deletions(-) create mode 100644 tasks/docker.py diff --git a/inventory.py b/inventory.py index 5e9755b..503684e 100644 --- a/inventory.py +++ b/inventory.py @@ -4,6 +4,7 @@ servers = [ "ssh_user": "root", "web_server": True, "tailscale": True, + "docker": True, }, ), @@ -12,6 +13,7 @@ servers = [ "ssh_user": "root", "web_server": True, "tailscale": True, + "docker": True, }, ), ] @@ -19,6 +21,8 @@ servers = [ kropcloud = [ ( "k3s-node0", { + "ssh_user": "root", + "ssh_hostname": "192.168.1.190", "tailscale": False, "k3s": { "role": "master", @@ -28,6 +32,20 @@ kropcloud = [ ), ( "k3s-node1", { + "ssh_user": "root", + "ssh_hostname": "192.168.1.191", + "tailscale": False, + "k3s": { + "role": "worker", + "master": "192.168.1.190", + "token": "1mN0tv3r1!s3cur3Bu1?T3s0Nl#", + }, + }, + ), + ( + "k3s-node2", { + "ssh_user": "root", + "ssh_hostname": "192.168.1.192", "tailscale": False, "k3s": { "role": "worker", @@ -38,6 +56,8 @@ kropcloud = [ ), ( "k3s-nfs", { + "ssh_user": "root", + "ssh_hostname": "192.168.1.195", "tailscale": False, "nfs": { "exports": [ diff --git a/provision.py b/provision.py index a840d7e..f9f9466 100644 --- a/provision.py +++ b/provision.py @@ -1,10 +1,11 @@ from pyinfra import host from pyinfra.operations import apt -from pyinfra_docker import deploy_docker -from tasks.k3s import setup_k3s +from tasks.docker import deploy_docker +from tasks.k3s import deploy_k3s +from tasks.nfs import deploy_nfs from tasks.ssh import setup_ssh -from tasks.tailscale import deploy_tailscale +from tasks.tailscale import setup_tailscale apt.packages( name="Update and upgrade server", @@ -20,21 +21,13 @@ apt.packages( setup_ssh() if host.data.get("docker"): - apt.packages( - name="Install packages required by Docker", - packages=[ - "apt-transport-https", - "ca-certificates", - "curl", - "gnupg-agent", - "software-properties-common", - ], - ) - deploy_docker() if host.data.get("tailscale"): - deploy_tailscale() + setup_tailscale() if host.data.get("k3s"): - setup_k3s() + deploy_k3s() + +if host.data.get("nfs"): + deploy_nfs() diff --git a/pyproject.toml b/pyproject.toml index 6b93e69..a14f9f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,6 @@ readme = "README.md" requires-python = ">=3.12" dependencies = [ "pyinfra>=3.2", - "pyinfra-docker>=1.0", "python-on-whales>=0.75.1", ] diff --git a/tasks/docker.py b/tasks/docker.py new file mode 100644 index 0000000..c7b13d1 --- /dev/null +++ b/tasks/docker.py @@ -0,0 +1,63 @@ +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, + ) diff --git a/tasks/k3s.py b/tasks/k3s.py index 6dfa9f0..5d8a426 100644 --- a/tasks/k3s.py +++ b/tasks/k3s.py @@ -5,8 +5,8 @@ from pyinfra.operations import files as files_op from pyinfra.operations import server IS_CREATED_FILE = "/pyinfra/.k3s-init-completed" -@deploy -def setup_k3s(): +@deploy("Deploy K3S") +def deploy_k3s(): k3s_config = host.data.get("k3s") if not k3s_config: diff --git a/tasks/nfs.py b/tasks/nfs.py index d0b8488..e415184 100644 --- a/tasks/nfs.py +++ b/tasks/nfs.py @@ -6,10 +6,10 @@ from pyinfra.operations import files as files_op from pyinfra.operations import server def generate_line(config: dict[str, str]) -> str: - return f"{config.get('directory')} {config.get('ip')}{','.join(config.get('flags'))}" + return f"{config.get('directory')} {config.get('ip')}({','.join(config.get('flags'))})" -@deploy -def setup_nfs(): +@deploy("Deploy NFS") +def deploy_nfs(): nfs_config = host.data.get("nfs") for export in nfs_config.get("exports"): diff --git a/tasks/ssh.py b/tasks/ssh.py index a9599bf..40c9190 100644 --- a/tasks/ssh.py +++ b/tasks/ssh.py @@ -38,7 +38,7 @@ def reconfigure_ssh(): ) -@deploy +@deploy("Setup SSH") def setup_ssh(): deploy_ssh_keys() reconfigure_ssh() diff --git a/tasks/tailscale.py b/tasks/tailscale.py index d2939a1..5fdbf8e 100644 --- a/tasks/tailscale.py +++ b/tasks/tailscale.py @@ -5,8 +5,8 @@ from pyinfra.operations import apt from pyinfra.operations import server -@deploy -def deploy_tailscale(): +@deploy("Setup Tailscale") +def setup_tailscale(): if not host.get_fact(File, "/usr/share/keyrings/tailscale-archive-keyring.gpg"): server.shell( name="Install tailscale signing key", diff --git a/uv.lock b/uv.lock index 9459786..5693ab3 100644 --- a/uv.lock +++ b/uv.lock @@ -304,7 +304,6 @@ version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "pyinfra" }, - { name = "pyinfra-docker" }, { name = "python-on-whales" }, ] @@ -316,7 +315,6 @@ dev = [ [package.metadata] requires-dist = [ { name = "pyinfra", specifier = ">=3.2" }, - { name = "pyinfra-docker", specifier = ">=1.0" }, { name = "python-on-whales", specifier = ">=0.75.1" }, ] @@ -501,18 +499,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/83/b0/a27ce89ec525e71180b0afa1069fb83886381c834c009d07802616af9b6e/pyinfra-3.2-py2.py3-none-any.whl", hash = "sha256:ca8e6f4b51031b3b56b4ab6e7ce4cb749530ec92d6ba22f1f2657e2d20231416", size = 269680 }, ] -[[package]] -name = "pyinfra-docker" -version = "1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyinfra" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/40/89/ccb7dc101941aec9e0f782a501a56383f575dec906467283960a77fed3de/pyinfra-docker-1.0.tar.gz", hash = "sha256:0debd945ee8a234b458253bc03a63ca54ad10b57271e6d65836a853ee637c72f", size = 2562 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/35/24d6699120454080afaf79cbb11afd7d50321e4d25f29a61fad2ea17f11d/pyinfra_docker-1.0-py2.py3-none-any.whl", hash = "sha256:1b9d97a63a1cf3875ca831914d0a70ff53d8dc9591f5278e06b2114276ab71df", size = 3825 }, -] - [[package]] name = "pynacl" version = "1.5.0"