From 80b565e6b693492bc7529335f9f092b559bba6a3 Mon Sep 17 00:00:00 2001 From: Ryan McCorry Date: Mon, 6 Feb 2023 17:16:56 +0000 Subject: [PATCH 1/6] v2.1 Add ability to version installations of docker-ce and docker-ce-cli --- pyinfra_docker/docker.py | 31 +++++++++++++++++++++++++------ setup.py | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/pyinfra_docker/docker.py b/pyinfra_docker/docker.py index 0d9abfe..f952657 100644 --- a/pyinfra_docker/docker.py +++ b/pyinfra_docker/docker.py @@ -11,7 +11,23 @@ from pyinfra.operations import apt, dnf, files, yum -def _apt_install(): +def get_pkgs_to_install(version): + docker_packages = [ + "docker-ce", + "docker-ce-cli" + ] + if not version: + return docker_packages + + versioned_packages = [] + for pkg in docker_packages: + versioned_packages.append(f"{pkg}={version}") + + return versioned_packages + + + +def _apt_install(packages): apt.packages( name="Install apt requirements to use HTTPS", packages=["apt-transport-https", "ca-certificates"], @@ -40,12 +56,13 @@ def _apt_install(): apt.packages( name="Install Docker via apt", - packages="docker-ce", + packages=packages, update=add_apt_repo.changed, # update if we added the repo + allow_downgrades=True, ) -def _yum_or_dnf_install(yum_or_dnf): +def _yum_or_dnf_install(yum_or_dnf, packages): yum_or_dnf.repo( name="Add the Docker yum repo", src="https://download.docker.com/linux/centos/docker-ce.repo", @@ -60,13 +77,13 @@ def _yum_or_dnf_install(yum_or_dnf): yum_or_dnf.packages( name="Install Docker via yum", - packages=["docker-ce"], + packages=packages, extra_install_args=extra_install_args, ) @deploy("Deploy Docker") -def deploy_docker(config=None): +def deploy_docker(config=None, version=None): """ Install Docker on the target machine. @@ -74,11 +91,13 @@ def deploy_docker(config=None): config: filename or dict of JSON data """ + packages = get_pkgs_to_install(version) if host.get_fact(DebPackages): - _apt_install() + _apt_install(packages) elif host.get_fact(RpmPackages): _yum_or_dnf_install( dnf if host.get_fact(Which, command="dnf") else yum, + packages, ) else: raise DeployError( diff --git a/setup.py b/setup.py index 09cdddc..86c9e4a 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ if __name__ == "__main__": setup( - version="2.0", + version="2.1", name="pyinfra-docker", description="Install & configure Docker with `pyinfra`.", long_description=readme, From ca6493442debcb943e72d5101d85fb2b15f607e8 Mon Sep 17 00:00:00 2001 From: Ryan McCorry Date: Tue, 7 Feb 2023 15:22:40 +0000 Subject: [PATCH 2/6] Update README and move versioning to global inventory data --- README.md | 2 ++ pyinfra_docker/docker.py | 24 +++++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d24c4dd..e24663c 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ A basic [pyinfra](https://pyinfra.com) deploy that installs and optionally confi + Debian 8/9/10 + CentOS 7/8 +This deploy installs packages in the `docker-ce` ecosystem (`docker-ce`/`docker-ce-cli`/`docker-ce-rootless-extras`) You can specify `docker_version` in your inventory data file and it will install that version for all `docker-ce` packages. + ## Usage See [the example](https://github.com/Fizzadar/pyinfra-docker/tree/master/example) for a more complete example. diff --git a/pyinfra_docker/docker.py b/pyinfra_docker/docker.py index f952657..5368bd2 100644 --- a/pyinfra_docker/docker.py +++ b/pyinfra_docker/docker.py @@ -11,19 +11,21 @@ from pyinfra.operations import apt, dnf, files, yum -def get_pkgs_to_install(version): +DEFAULTS = { + "docker_version": None, +} + + +def get_pkgs_to_install(): docker_packages = [ "docker-ce", - "docker-ce-cli" + "docker-ce-cli", + "docker-ce-rootless-extras", ] - if not version: + if not host.data.docker_version: return docker_packages - versioned_packages = [] - for pkg in docker_packages: - versioned_packages.append(f"{pkg}={version}") - - return versioned_packages + return [f"{pkg}={host.data.docker_version}" for pkg in docker_packages] @@ -82,8 +84,8 @@ def _yum_or_dnf_install(yum_or_dnf, packages): ) -@deploy("Deploy Docker") -def deploy_docker(config=None, version=None): +@deploy("Deploy Docker", data_defaults=DEFAULTS) +def deploy_docker(config=None): """ Install Docker on the target machine. @@ -91,7 +93,7 @@ def deploy_docker(config=None, version=None): config: filename or dict of JSON data """ - packages = get_pkgs_to_install(version) + packages = get_pkgs_to_install() if host.get_fact(DebPackages): _apt_install(packages) elif host.get_fact(RpmPackages): From a355b193a639963977c7fad6dfe0491e3e1b1157 Mon Sep 17 00:00:00 2001 From: Ryan McCorry Date: Mon, 13 Mar 2023 12:21:11 +0000 Subject: [PATCH 3/6] Specify version operation for apt/yum --- pyinfra_docker/docker.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyinfra_docker/docker.py b/pyinfra_docker/docker.py index 5368bd2..059908c 100644 --- a/pyinfra_docker/docker.py +++ b/pyinfra_docker/docker.py @@ -16,7 +16,7 @@ } -def get_pkgs_to_install(): +def get_pkgs_to_install(operator): docker_packages = [ "docker-ce", "docker-ce-cli", @@ -25,7 +25,7 @@ def get_pkgs_to_install(): if not host.data.docker_version: return docker_packages - return [f"{pkg}={host.data.docker_version}" for pkg in docker_packages] + return [f"{pkg}{operator}{host.data.docker_version}" for pkg in docker_packages] @@ -93,10 +93,11 @@ def deploy_docker(config=None): config: filename or dict of JSON data """ - packages = get_pkgs_to_install() if host.get_fact(DebPackages): + packages = get_pkgs_to_install('=') _apt_install(packages) elif host.get_fact(RpmPackages): + packages = get_pkgs_to_install('-') _yum_or_dnf_install( dnf if host.get_fact(Which, command="dnf") else yum, packages, From 276073c6c0755bb253bcef968e84aa1aa469a7b9 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 13 Mar 2023 12:22:34 +0000 Subject: [PATCH 4/6] Update README.md Co-authored-by: Germain Chazot --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e24663c..87075f5 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A basic [pyinfra](https://pyinfra.com) deploy that installs and optionally confi + Debian 8/9/10 + CentOS 7/8 -This deploy installs packages in the `docker-ce` ecosystem (`docker-ce`/`docker-ce-cli`/`docker-ce-rootless-extras`) You can specify `docker_version` in your inventory data file and it will install that version for all `docker-ce` packages. +This deploy installs packages in the `docker-ce` ecosystem (`docker-ce`/`docker-ce-cli`/`docker-ce-rootless-extras`) You can specify `docker_version` in the host data and it will install that version for all `docker-ce` packages. ## Usage From 8dd473a40c72300fb3b534815a1760ee307ec3ec Mon Sep 17 00:00:00 2001 From: Germain Chazot Date: Mon, 13 Mar 2023 19:31:06 +0100 Subject: [PATCH 5/6] Modernise vagrant boxes used in the example --- example/Vagrantfile | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/example/Vagrantfile b/example/Vagrantfile index fc45585..25ff678 100644 --- a/example/Vagrantfile +++ b/example/Vagrantfile @@ -2,26 +2,22 @@ Vagrant.configure('2') do |config| # Disable /vagrant synced folder config.vm.synced_folder '.', '/vagrant', disabled: true - config.vm.define :ubuntu16 do |ubuntu| - ubuntu.vm.box = 'bento/ubuntu-16.04' - end - - config.vm.define :ubuntu18 do |ubuntu| - ubuntu.vm.box = 'bento/ubuntu-18.04' - end - config.vm.define :ubuntu20 do |ubuntu| ubuntu.vm.box = 'bento/ubuntu-20.04' end - config.vm.define :debian9 do |debian| - debian.vm.box = 'bento/debian-9.11' + config.vm.define :ubuntu22 do |ubuntu| + ubuntu.vm.box = 'bento/ubuntu-22.04' end config.vm.define :debian10 do |debian| debian.vm.box = 'bento/debian-10' end + config.vm.define :debian11 do |debian| + debian.vm.box = 'bento/debian-11' + end + config.vm.define :centos7 do |centos| centos.vm.box = 'bento/centos-7' end From 1ecf8c742535228498d50aa16ec47a914fe304e5 Mon Sep 17 00:00:00 2001 From: Germain Chazot Date: Mon, 13 Mar 2023 20:02:52 +0100 Subject: [PATCH 6/6] Add version setting to the example deploy --- example/@vagrant.json | 10 ++++++++++ example/group_data/@vagrant.py | 1 + 2 files changed, 11 insertions(+) create mode 100644 example/@vagrant.json create mode 100644 example/group_data/@vagrant.py diff --git a/example/@vagrant.json b/example/@vagrant.json new file mode 100644 index 0000000..f646a76 --- /dev/null +++ b/example/@vagrant.json @@ -0,0 +1,10 @@ +{ + "data": { + "centos7": { + "docker_version": "23.0.0*" + }, + "almalinux8": { + "docker_version": "23.0.0*" + } + } +} diff --git a/example/group_data/@vagrant.py b/example/group_data/@vagrant.py new file mode 100644 index 0000000..5b35ec6 --- /dev/null +++ b/example/group_data/@vagrant.py @@ -0,0 +1 @@ +docker_version = "5:23.0.0*" # Only valid for APT distros, see @vagrant.json fot YUM distros