diff --git a/roles/docker_images/README.md b/roles/docker_images/README.md index f83f5c6e8ee3e1310bb1ea4ae6b2e319c0570720..82f422b92c43830b08d374451d103506577f83f2 100644 --- a/roles/docker_images/README.md +++ b/roles/docker_images/README.md @@ -4,8 +4,31 @@ This ansible-role for dealing with creating the docker images necessary for depl ## Requirements - To have [ansible](https://docs.ansible.com/ansible/latest/installation_guide/installation_distros.html) installed at your system. -- Set your **remote_user** configuration at the **ansible.cfg** file. -- Set your **inventories/host_vars/<TARGET_NAME>** file. + + +## Configuration +You need to set some configuration for this to work +- ### ansible.cfg + You have to edit the **ansible.cfg** file to your needs for accessing your target. + - #### remote_user + You need to set the **remote_user** configuration for accessing the target host. + + Example: [remote_user](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/ansible.cfg#L227) + +- ### HOST_VARS + In order to access your target host, you need to create/edit your **inventories/host_vars/<YOUR_HOST_NAME>.yml** + - #### ansible_become_pass + You need to set the **sudo** password from the user setted on **remote_user** for installing packages and etc. at the target. + + Example: [ansible_become_pass](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/inventories/host_vars/example_server.yml#L5) + +- ### HOSTS + You need to provide a **group** in which your target belongs to with the same name setted for **inventories/host_vars/<YOUR_HOST_NAME>.yml**. + + There you can add/edit the target address/IP. + + Example: [hosts](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/inventories/hosts) + ## Role Variables Here are the variables setted: @@ -58,33 +81,63 @@ The role dependencies are: ## Example Playbook - ### Using the provided example - For using the playbook **playbook/examples/example_04_docker_images.yml** file you only need to: - - Change the user at the **ansible.cfg** file at the field **remote_user** for acessing your target. - - Update the file **inventories/host_vars/example_server.yml** and change the value for **ansible_become_pass** from the **remote_user** - - Update the **inventories/hosts** file and change the **example_server** with the IP address from your target. + For using the example playbook **[playbooks/examples/example_02_dependencies.yml](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/playbooks/examples/example_02_dependencies.yml)** file you only need to: + - Change the user at the **[ansible.cfg](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/ansible.cfg)** file at the field **[remote_user](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/ansible.cfg#L227)** for acessing your target. + - Update the file **[inventories/host_vars/example_server.yml](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/inventories/host_vars/example_server.yml)** and change the value for **[ansible_become_pass](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/inventories/host_vars/example_server.yml#L5)** from the **[remote_user](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/ansible.cfg#L227)** + - Update the **[inventories/hosts](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/inventories/hosts)** file and change the **[example_server](https://git.cccv.de/fejao/c3infodesk-deployment/-/blob/main/inventories/hosts#L2)** with the IP address from your target. - And run the command: -```bash -ansible-playbook -i inventories/hosts playbooks/examples/example_04_docker_images.yml -``` + + And run the command: + ```bash + ansible-playbook -i inventories/hosts playbooks/examples/example_04_docker_images.yml + ``` - ### Setting your own example After setting your variables at **inventories/host_vars/<HOST_NAME>**, you can add this role to your playbook as a regular role. Here is an example using the **<HOST_NAME>** as **test_servers** -```yaml -- hosts: - - test_servers - roles: - - docker_images -``` + ```yaml + - hosts: + - test_servers + roles: + - docker_images + ``` And call the playbook as: -```bash -ansible-playbook -i <INVENTORY> <PLAYBOOK_NAME>.yml -``` + ```bash + ansible-playbook -i <INVENTORY> <PLAYBOOK_NAME>.yml + ``` + + +## Testing +You can test this locally using **DIND (docker in docker)** at your own computer using [ansible molecule](https://ansible.readthedocs.io/projects/molecule/installation/) + +- ### Testing requirements + You need docker installed at your system and the [ansible molecule](https://ansible.readthedocs.io/projects/molecule/installation/). + + You might have to set DIND at your system, for linux, you can create the file **/etc/docker/daemon.json** + + And add the content and restart docker. + + ```json + { + "exec-opts": ["native.cgroupdriver=systemd"], + "features": { + "buildkit": true + }, + "experimental": true, + "cgroup-parent": "docker.slice" + } + ``` + +- ### Using molecule + Just go to the root of the role **roles/dependencies** and run the command: + + ```bash + molecule test + ``` ## License diff --git a/roles/docker_images/molecule/README.md b/roles/docker_images/molecule/README.md new file mode 100644 index 0000000000000000000000000000000000000000..91e1d076c1e83f902f4d2a8f8a35664f7c03bb3d --- /dev/null +++ b/roles/docker_images/molecule/README.md @@ -0,0 +1,42 @@ +## ansible molecule tests for role: docker_images + + + +## Why to use it +It's allways a good idea to test your things. + +With **ansible molecule** you can test your role locally without the need of using a **real server** but a local **docker container**. + +## Dependencies + +- ### molecule + You need to have [ansible molecule](https://ansible.readthedocs.io/projects/molecule/installation/) installed. + +- ### DIND (docker in docker) + For using the tests, you will to have **docker** installed locally and and set it for using **DIND (docker in docker)** + + + - ### DIND linux + You have to create/edit the file **/etc/docker/daemon.json** with the content: + + ```json + { + "exec-opts": ["native.cgroupdriver=systemd"], + "features": { + "buildkit": true + }, + "experimental": true, + "cgroup-parent": "docker.slice" + } + ``` + + +## Configuration +There's not much for configuring for using the tests + +## Running the tests +For running the **molecule tests** you just need to run the command: + +```bash +molecule test +``` diff --git a/roles/docker_images/molecule/default/converge.yml b/roles/docker_images/molecule/default/converge.yml new file mode 100644 index 0000000000000000000000000000000000000000..2e56f0779cad0fff6d77a3d11fd2a39e83ef8f8f --- /dev/null +++ b/roles/docker_images/molecule/default/converge.yml @@ -0,0 +1,46 @@ +--- + +- name: MOLECULE | Converge + hosts: all + pre_tasks: + - name: MOLECULE | COVERGE | PRE-TASKS | Adding variables from -> ../../defaults + ansible.builtin.include_vars: + dir: ../../defaults + depth: 1 + extensions: + - 'yml' + + - name: MOLECULE | VERIFY | PRE-TASKS | Adding variables from -> ../../../../roles/dependencies/defaults + ansible.builtin.include_vars: + dir: ../../../../roles/dependencies/defaults + depth: 1 + extensions: + - 'yml' + + - name: MOLECULE | VERIFY | PRE-TASKS | Adding variables from -> ../../../../roles/clone_repositories/defaults + ansible.builtin.include_vars: + dir: ../../../../roles/clone_repositories/defaults + depth: 1 + extensions: + - 'yml' + + - name: MOLECULE | COVERGE | PRE-TASKS | Adding variables from -> ../../../../inventories/group_vars + ansible.builtin.include_vars: + dir: ../../../../inventories/group_vars + extensions: + - 'yml' + + - name: MOLECULE | COVERGE | PRE-TASKS | Adding variables from -> ../../../../inventories/host_vars + ansible.builtin.include_vars: + dir: ../../../../inventories/host_vars + extensions: + - 'yml' + + - name: MOLECULE | COVERGE | PRE-TASKS | Install python 'requests' package + ansible.builtin.pip: + name: requests + + tasks: + - name: MOLECULE | CONVERGE | Call the 'clone_repositories' role. + ansible.builtin.include_role: + name: docker_images diff --git a/roles/docker_images/molecule/default/molecule.yml b/roles/docker_images/molecule/default/molecule.yml new file mode 100644 index 0000000000000000000000000000000000000000..6d58bb221eefb6a66de03fe761b295cf4e6db13a --- /dev/null +++ b/roles/docker_images/molecule/default/molecule.yml @@ -0,0 +1,68 @@ +--- + +dependency: + name: galaxy + +driver: + name: docker + +platforms: + - name: molecule_docker_images + ### At the moment I'm not running at the latest kernel, please use always with a older kernel than the host + # image: docker.io/geerlingguy/docker-ubuntu2204-ansible + image: geerlingguy/docker-ubuntu2204-ansible:latest + command: /usr/sbin/init + pre_build_image: true + cgroupns_mode: host + privileged: true + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/lib/containerd + +provisioner: + name: ansible + +lint: | + ansible-lint --exclude molecule/default/ + +scenario: + name: default + create_sequence: + - dependency + - create + - prepare + check_sequence: + - dependency + - cleanup + - destroy + - create + - prepare + - converge + - check + - destroy + converge_sequence: + - dependency + - create + - prepare + - converge + destroy_sequence: + - dependency + - cleanup + - destroy + test_sequence: + # - lint + # - dependency + # - cleanup + - destroy + - syntax + - create + # - prepare + - converge + - verify + - idempotence + # - side_effect + # - cleanup + - destroy + +verifier: + name: ansible diff --git a/roles/docker_images/molecule/default/verify.yml b/roles/docker_images/molecule/default/verify.yml new file mode 100644 index 0000000000000000000000000000000000000000..ef92a2e7efe30b1dcfd3381b67fe841a1202fc03 --- /dev/null +++ b/roles/docker_images/molecule/default/verify.yml @@ -0,0 +1,174 @@ +--- + +- name: VERIFY | Test role for debugging variables + hosts: all + vars: + package_name_docker: 'docker' + package_name_docker_ce: 'docker-ce' + package_name_docker_compose: 'docker-compose' + package_name_docker_compose_plugin: 'docker-compose-plugin' + + pre_tasks: + - name: MOLECULE | COVERGE | PRE-TASKS | Adding variables from -> ../../defaults + ansible.builtin.include_vars: + dir: ../../defaults + depth: 1 + extensions: + - 'yml' + + - name: MOLECULE | VERIFY | PRE-TASKS | Adding variables from -> ../../../../roles/dependencies/defaults + ansible.builtin.include_vars: + dir: ../../../../roles/dependencies/defaults + depth: 1 + extensions: + - 'yml' + + - name: MOLECULE | VERIFY | PRE-TASKS | Adding variables from -> ../../../../roles/clone_repositories/defaults + ansible.builtin.include_vars: + dir: ../../../../roles/clone_repositories/defaults + depth: 1 + extensions: + - 'yml' + + - name: MOLECULE | COVERGE | PRE-TASKS | Adding variables from -> ../../../../inventories/group_vars + ansible.builtin.include_vars: + dir: ../../../../inventories/group_vars + extensions: + - 'yml' + + - name: MOLECULE | COVERGE | PRE-TASKS | Adding variables from -> ../../../../inventories/host_vars + ansible.builtin.include_vars: + dir: ../../../../inventories/host_vars + extensions: + - 'yml' + + tasks: + ### + ### POPULATE + ### + - name: MOLECULE | VERIFY | POPULATE | Gather the package facts + ansible.builtin.package_facts: + manager: auto + + # - name: MOLECULE | VERIFY | POPULATE | Gather service facts + # ansible.builtin.service_facts: + + ### + ### TESTS - PACKAGES + ### + - name: MOLECULE | VERIFY | TEST | Check that the packages from 'os_dependencies_packages' are installed. + ansible.builtin.debug: + msg: "Package: '{{ package_name }}' is installed" + loop: "{{ os_dependencies_packages }}" + loop_control: + loop_var: package_name + failed_when: package_name not in ansible_facts.packages + + - name: MOLECULE | VERIFY | TEST | Check that docker is installed. + ansible.builtin.debug: + msg: "Package: 'docker' is installed" + failed_when: + - package_name_docker not in ansible_facts.packages + - package_name_docker_ce not in ansible_facts.packages + + - name: MOLECULE | VERIFY | TEST | Check that docker-compose is installed. + ansible.builtin.debug: + msg: "Package: 'docker-cokmpose' is installed" + failed_when: + - package_name_docker_compose not in ansible_facts.packages + - package_name_docker_compose_plugin not in ansible_facts.packages + + ### + ### TESTS - DOCKER + ### + - name: MOLECULE | VERIFY | TEST | Get docker service state. + ansible.builtin.systemd: + name: "docker" + register: docker_service + + - name: MOLECULE | VERIFY | TEST | Check that docker is running. + ansible.builtin.debug: + msg: "Docker IS running..." + failed_when: "'active' != docker_service.status.ActiveState" + + ### + ### TESTS - ADDED USERS + ### + - name: MOLECULE | VERIFY | TEST | Get added users infos. + ansible.builtin.user: + name: "{{ item }}" + loop: "{{ docker_users }}" + check_mode: true + register: test_users + + - name: MOLECULE | VERIFY | TEST | Check if users exists + ansible.builtin.debug: + msg: "User {{ item.item }} {{ 'exists' if item.state | d('') == 'present' else 'does not exist' }}" + loop: "{{ test_users.results }}" + loop_control: + label: "{{ item.item }}" + + - name: MOLECULE | VERIFY | TEST | Get the groups that the users belongs to. + ansible.builtin.command: + cmd: "id -Gn {{ item.item }}" + loop: "{{ test_users.results }}" + loop_control: + label: "{{ item.item }}" + register: user_groups + changed_when: false + + - name: MOLECULE | VERIFY | TEST | Check that the users are at the 'docker' group. + ansible.builtin.debug: + msg: "User '{{ item.item.item }}' belongs to the docker group" + with_items: "{{ user_groups.results }}" + failed_when: "'docker' not in item.stdout" + + ### + ### TESTS - CLONE REPOSITORY - PRINTER + ### + - name: MOLECULE | VERIFY | TEST | Get if the repository was cloned. + ansible.builtin.git: + repo: "{{ c3infodesk_printer_repo_url }}" + dest: "{{ c3infodesk_printer_folder }}" + version: main + clone: false + update: false + register: check_repository + + - name: MOLECULE | VERIFY | TEST | Checking if the repository was cloned. + ansible.builtin.debug: + msg: "Repository: '{{ c3infodesk_printer_repo_url }}' cloned..." + failed_when: check_repository.changed | bool + + ### + ### TESTS - DOCKER IMAGES + ### + - name: MOLECULE | VERIFY | TEST | Get if the image is created for 'cups'. + community.docker.docker_image_info: + name: "{{ c3infodesk_printer_docker_img_cups_name }}" + register: result_check_image_cups + + - name: MOLECULE | VERIFY | TEST | Check the image creation from 'cups'. + ansible.builtin.debug: + msg: "Image for 'cups' exists" + when: result_check_image_cups.images | length > 0 + + - name: MOLECULE | VERIFY | TEST | Get if the image is created for 'app'. + community.docker.docker_image_info: + name: "{{ c3infodesk_printer_docker_img_app_name }}" + register: result_check_image_app + + - name: MOLECULE | VERIFY | TEST | Check the image creation from 'app'. + ansible.builtin.debug: + msg: "Image for 'app' exists" + when: result_check_image_app.images | length > 0 + + - name: MOLECULE | VERIFY | TEST | Get if the image is created for 'proxy'. + community.docker.docker_image_info: + name: "{{ c3infodesk_printer_docker_img_proxy_name }}" + register: result_check_image_proxy + + - name: MOLECULE | VERIFY | TEST | Check the image creation from 'proxy'. + ansible.builtin.debug: + msg: "Image for 'proxy' exists" + when: result_check_image_proxy.images | length > 0