diff --git a/README.md b/README.md index 2634364..5876f77 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ - [borgmatic](roles/borgmatic/README.md) - [curl_scheduled](roles/curl_scheduled/README.md) - [dnsmasq](roles/dnsmasq/README.md) +- [docker_ubuntu](roles/docker_ubuntu/README.md) - [grafana](roles/grafana/README.md) - [ipmi_exporter](roles/ipmi_exporter/README.md) - [karma](roles/karma/README.md) diff --git a/galaxy.yml b/galaxy.yml index a18146b..dd3e469 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -1,7 +1,7 @@ --- namespace: genlab name: common -version: 0.24.0 +version: 0.25.0 readme: README.md authors: - Alexander Gorelyshev (corvus-migratorius@proton.me) diff --git a/roles/docker_ubuntu/README.md b/roles/docker_ubuntu/README.md new file mode 100644 index 0000000..8760978 --- /dev/null +++ b/roles/docker_ubuntu/README.md @@ -0,0 +1,41 @@ +docker_ubuntu +========= + +Install Docker ecosystem on Ubuntu. + +[![lint](https://github.com/corvus-migratorius/ansible-docker-ubuntu/actions/workflows/lint.yaml/badge.svg)](https://github.com/corvus-migratorius/ansible-docker-ubuntu/actions/workflows/lint.yaml) + +[![molecule](https://github.com/corvus-migratorius/ansible-docker-ubuntu/actions/workflows/molecule.yaml/badge.svg)](https://github.com/corvus-migratorius/ansible-docker-ubuntu/actions/workflows/molecule.yaml) + +Requirements +------------ + +None + +Role Variables +-------------- + +None + +Dependencies +------------ + +None + +Example Playbook +---------------- + +```yaml +roles: + - role: genlab.common.docker_ubuntu +``` + +License +------- + +BSD + +Author Information +------------------ + +corvus-migratorius@proton.me diff --git a/roles/docker_ubuntu/defaults/main.yml b/roles/docker_ubuntu/defaults/main.yml new file mode 100644 index 0000000..85de886 --- /dev/null +++ b/roles/docker_ubuntu/defaults/main.yml @@ -0,0 +1,5 @@ +--- +docker_ubuntu_version: "27.3.1" +docker_ubuntu_registry_mirrors: + - https://docker.io + - https://mirror.gcr.io diff --git a/roles/docker_ubuntu/handlers/main.yml b/roles/docker_ubuntu/handlers/main.yml new file mode 100644 index 0000000..73b8719 --- /dev/null +++ b/roles/docker_ubuntu/handlers/main.yml @@ -0,0 +1,11 @@ +--- +# handlers file for playbooks/roles/docker_ubuntu +- name: "Restart Docker daemon" + ansible.builtin.systemd_service: + name: docker + state: restarted + daemon_reload: true + +- name: "Sanity check" # noqa: no-changed-when + ansible.builtin.command: + cmd: "docker run --rm --pull=always hello-world" diff --git a/roles/docker_ubuntu/meta/main.yml b/roles/docker_ubuntu/meta/main.yml new file mode 100644 index 0000000..f6eca81 --- /dev/null +++ b/roles/docker_ubuntu/meta/main.yml @@ -0,0 +1,17 @@ +--- +galaxy_info: + role_name: docker_ubuntu + namespace: genlab + author: "Alexander Gorelyshev" + company: "Genlab, LLC" + description: "Install Docker ecosystem on Ubuntu" + license: "MIT" + min_ansible_version: "2.1" + + platforms: + - name: "Ubuntu" + versions: ["focal", "jammy", "noble"] + + galaxy_tags: ["docker"] + +dependencies: [] diff --git a/roles/docker_ubuntu/molecule/default/converge.yml b/roles/docker_ubuntu/molecule/default/converge.yml new file mode 100644 index 0000000..d3e24f2 --- /dev/null +++ b/roles/docker_ubuntu/molecule/default/converge.yml @@ -0,0 +1,9 @@ +--- +- name: Converge + hosts: all + roles: + - role: genlab.common.docker_ubuntu + docker_ubuntu_version: "27.3.1" + docker_ubuntu_registry_mirrors: + - https://docker.io + - https://mirror.gcr.io diff --git a/roles/docker_ubuntu/molecule/default/molecule.yml b/roles/docker_ubuntu/molecule/default/molecule.yml new file mode 100644 index 0000000..fd2f06d --- /dev/null +++ b/roles/docker_ubuntu/molecule/default/molecule.yml @@ -0,0 +1,27 @@ +--- +dependency: + name: galaxy + +driver: + name: docker + +platforms: + - name: ubuntu + image: geerlingguy/docker-${MOLECULE_DISTRO:-ubuntu2204}-ansible:latest + pre_build_image: true + command: ${MOLECULE_DOCKER_COMMAND:-""} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + +provisioner: + name: ansible + +verifier: + name: ansible + +lint: | + set -e + yamllint . + ansible-lint . diff --git a/roles/docker_ubuntu/molecule/default/verify.yml b/roles/docker_ubuntu/molecule/default/verify.yml new file mode 100644 index 0000000..a384184 --- /dev/null +++ b/roles/docker_ubuntu/molecule/default/verify.yml @@ -0,0 +1,31 @@ +--- +- name: Verify + hosts: all + gather_facts: true + any_errors_fatal: true + + tasks: + # https://github.com/ansible/molecule/issues/3587#issuecomment-1158650179 + - name: "Include default vars" + ansible.builtin.include_vars: + dir: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/defaults/" + extensions: ['yml'] + + - name: "Sanity check Docker by running a `hello-world` container" # noqa: no-changed-when + ansible.builtin.command: + cmd: "docker run --rm hello-world" + + - name: "Check if `Compose` is available from PATH" # noqa: no-changed-when + ansible.builtin.command: + cmd: "docker compose version" + + - name: "Get docker version" # noqa: no-changed-when + register: docker_ubuntu_current_version + ansible.builtin.command: + cmd: "docker version --format '{{ '{{' }} .Server.Version {{ '}}' }}'" + + - name: "Check if Docker has the expected version" # noqa: no-changed-when + ansible.builtin.assert: + that: "docker_ubuntu_version in docker_ubuntu_current_version.stdout" + success_msg: "Docker has the expected version ({{ docker_ubuntu_current_version.stdout }} )" + fail_msg: "Unexpected Docker version ({{ docker_ubuntu_current_version.stdout }})" diff --git a/roles/docker_ubuntu/tasks/main.yml b/roles/docker_ubuntu/tasks/main.yml new file mode 100644 index 0000000..ec14880 --- /dev/null +++ b/roles/docker_ubuntu/tasks/main.yml @@ -0,0 +1,71 @@ +--- +# REF: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-install-and-set-up-docker-on-ubuntu-20-04 + +- name: "Install aptitude" + ansible.builtin.apt: + name: aptitude + state: present + update_cache: true + +- name: "Install required system packages" + ansible.builtin.apt: + pkg: + - apt-transport-https + - ca-certificates + - curl + - gpg-agent + - python3-pip + - python3-setuptools + - software-properties-common + - virtualenv + state: present + update_cache: true + +- name: "Add Docker GPG apt Key" + ansible.builtin.apt_key: + url: https://download.docker.com/linux/ubuntu/gpg + state: present + +- name: "Add Docker Repository" + ansible.builtin.apt_repository: + repo: "deb https://download.docker.com/linux/ubuntu {{ ansible_lsb.codename }} stable" + state: present + +- name: "Install Docker ecosystem" + notify: "Sanity check" + ansible.builtin.apt: + pkg: + - docker-ce={{ docker_ubuntu_version_full }} + - docker-ce-cli={{ docker_ubuntu_version_full }} + state: present + update_cache: true + +- name: "Ensure the 'docker' group exists" + ansible.builtin.group: + name: docker + state: present + system: true + +- name: "Install Python tools for Docker" + ansible.builtin.pip: + name: [docker] + break_system_packages: true + +- name: "Configure Docker daemon" + notify: + - "Restart Docker daemon" + - "Sanity check" + ansible.builtin.template: + src: daemon.json.j2 + dest: /etc/docker/daemon.json + owner: root + group: root + mode: "0664" + validate: "dockerd --validate --config-file=%s" + +- name: "Spin up the Docker system service" + notify: "Sanity check" + ansible.builtin.systemd: + name: docker + state: started + enabled: true diff --git a/roles/docker_ubuntu/templates/daemon.json.j2 b/roles/docker_ubuntu/templates/daemon.json.j2 new file mode 100644 index 0000000..d128e9a --- /dev/null +++ b/roles/docker_ubuntu/templates/daemon.json.j2 @@ -0,0 +1,3 @@ +{ + "registry-mirrors": {{ docker_ubuntu_registry_mirrors | to_json }} +} diff --git a/roles/docker_ubuntu/vars/main.yml b/roles/docker_ubuntu/vars/main.yml new file mode 100644 index 0000000..3075048 --- /dev/null +++ b/roles/docker_ubuntu/vars/main.yml @@ -0,0 +1,2 @@ +--- +docker_ubuntu_version_full: "5:{{ docker_ubuntu_version }}-1~ubuntu.{{ ansible_lsb.release }}~{{ ansible_lsb.codename }}"