From e1293f6172efca618bc878f1eef3fbd677eee792 Mon Sep 17 00:00:00 2001 From: fejao <mail@fejao.de> Date: Sat, 1 Feb 2025 04:24:53 +0100 Subject: [PATCH] Adding the molecule tests for 'clone_repositories' role --- roles/clone_repositories/README.md | 90 +++++++++--- roles/clone_repositories/molecule/README.md | 42 ++++++ .../molecule/default/converge.yml | 35 +++++ .../molecule/default/molecule.yml | 68 +++++++++ .../molecule/default/verify.yml | 134 ++++++++++++++++++ roles/dependencies/molecule/README.md | 4 - 6 files changed, 350 insertions(+), 23 deletions(-) create mode 100644 roles/clone_repositories/molecule/README.md create mode 100644 roles/clone_repositories/molecule/default/converge.yml create mode 100644 roles/clone_repositories/molecule/default/molecule.yml create mode 100644 roles/clone_repositories/molecule/default/verify.yml diff --git a/roles/clone_repositories/README.md b/roles/clone_repositories/README.md index c0fcdfa..023fdf5 100644 --- a/roles/clone_repositories/README.md +++ b/roles/clone_repositories/README.md @@ -4,8 +4,31 @@ This ansible-role for dealing with cloning the repositories necessary for deploy ## 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: @@ -36,33 +59,62 @@ The role dependencies are: ## Example Playbook - ### Using the provided example - For using the playbook **playbooks/examples/example_03_clone_repositories.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_03_clone_repositories.yml -``` + And run the command: + ```bash + ansible-playbook -i inventories/hosts playbooks/examples/example_03_clone_repositories.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: - - clone_repositories -``` + ```yaml + - hosts: + - test_servers + roles: + - clone_repositories + ``` 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/clone_repositories/molecule/README.md b/roles/clone_repositories/molecule/README.md new file mode 100644 index 0000000..d3a37f1 --- /dev/null +++ b/roles/clone_repositories/molecule/README.md @@ -0,0 +1,42 @@ +## ansible molecule tests for role: clone_repositories + + + +## 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/clone_repositories/molecule/default/converge.yml b/roles/clone_repositories/molecule/default/converge.yml new file mode 100644 index 0000000..1a55dbd --- /dev/null +++ b/roles/clone_repositories/molecule/default/converge.yml @@ -0,0 +1,35 @@ +--- + +- 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 | 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: + - name: MOLECULE | CONVERGE | Call the 'clone_repositories' role. + ansible.builtin.include_role: + name: clone_repositories diff --git a/roles/clone_repositories/molecule/default/molecule.yml b/roles/clone_repositories/molecule/default/molecule.yml new file mode 100644 index 0000000..3e6bd7e --- /dev/null +++ b/roles/clone_repositories/molecule/default/molecule.yml @@ -0,0 +1,68 @@ +--- + +dependency: + name: galaxy + +driver: + name: docker + +platforms: + - name: molecule_clone_repositories + ### 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/clone_repositories/molecule/default/verify.yml b/roles/clone_repositories/molecule/default/verify.yml new file mode 100644 index 0000000..709795f --- /dev/null +++ b/roles/clone_repositories/molecule/default/verify.yml @@ -0,0 +1,134 @@ +--- + +- 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 | VERIFY | 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 -> ../../../../inventories/group_vars + ansible.builtin.include_vars: + dir: ../../../../inventories/group_vars + extensions: + - 'yml' + + - name: MOLECULE | VERIFY | 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 diff --git a/roles/dependencies/molecule/README.md b/roles/dependencies/molecule/README.md index 62fcb93..81b4e59 100644 --- a/roles/dependencies/molecule/README.md +++ b/roles/dependencies/molecule/README.md @@ -40,7 +40,3 @@ For running the **molecule tests** you just need to run the command: ```bash molecule test ``` - - - -Here you can find how to run the -- GitLab