diff --git a/README.md b/README.md index d24c4dd..87075f5 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 the host data 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/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/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 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 diff --git a/pyinfra_docker/docker.py b/pyinfra_docker/docker.py index 0d9abfe..059908c 100644 --- a/pyinfra_docker/docker.py +++ b/pyinfra_docker/docker.py @@ -11,7 +11,25 @@ from pyinfra.operations import apt, dnf, files, yum -def _apt_install(): +DEFAULTS = { + "docker_version": None, +} + + +def get_pkgs_to_install(operator): + docker_packages = [ + "docker-ce", + "docker-ce-cli", + "docker-ce-rootless-extras", + ] + if not host.data.docker_version: + return docker_packages + + return [f"{pkg}{operator}{host.data.docker_version}" for pkg in docker_packages] + + + +def _apt_install(packages): apt.packages( name="Install apt requirements to use HTTPS", packages=["apt-transport-https", "ca-certificates"], @@ -40,12 +58,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,12 +79,12 @@ 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") +@deploy("Deploy Docker", data_defaults=DEFAULTS) def deploy_docker(config=None): """ Install Docker on the target machine. @@ -75,10 +94,13 @@ def deploy_docker(config=None): """ if host.get_fact(DebPackages): - _apt_install() + 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, ) 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,