diff --git a/.gitea/workflows/demo.yml b/.gitea/workflows/demo.yml index b72beb7..37c4f19 100644 --- a/.gitea/workflows/demo.yml +++ b/.gitea/workflows/demo.yml @@ -6,6 +6,7 @@ jobs: Explore-molecule-Gitea-Action: env: ANSIBLE_ROLES_PATH: '/workspace/seasharp/ansible-role_podman-host' +# ANSIBLE_REMOTE_TMP: '/root/.ansible/tmp/' runs-on: ubuntu-latest steps: - name: Project Checkout @@ -16,7 +17,5 @@ jobs: uses: actions/setup-python@v2 - name: Molecule test run: | - pip install molecule-docker - ansible-galaxy collection install community.general cd podman-host/extensions molecule test diff --git a/extensions/molecule/default/converge.yml b/extensions/molecule/default/converge.yml index d0613b5..4102b6b 100644 --- a/extensions/molecule/default/converge.yml +++ b/extensions/molecule/default/converge.yml @@ -1,10 +1,26 @@ --- -- name: Converge - hosts: all - become: true - become_user: root - gather_facts: false +- name: Fail if molecule group is missing + hosts: localhost tasks: - - name: podman-host Role + - name: Print some info + ansible.builtin.debug: + msg: "{{ groups }}" + + - name: Assert group existence + ansible.builtin.assert: + that: "'molecule' in groups" + fail_msg: | + molecule group was not found inside inventory groups: {{ groups }} + +- name: Converge + hosts: molecule + # We disable gather facts because it would fail due to our container not + # having python installed. This will not prevent use from running 'raw' + # commands. Most molecule users are expected to use containers that already + # have python installed in order to avoid notable delays installing it. + tasks: + - name: Apply test-molecule Role include_role: - name: podman-host + name: test-molecule +# ansible.builtin.assert: +# that: result.stdout | regex_search("^Linux") diff --git a/extensions/molecule/default/create.yml b/extensions/molecule/default/create.yml index fcd6b92..b76e498 100644 --- a/extensions/molecule/default/create.yml +++ b/extensions/molecule/default/create.yml @@ -3,33 +3,80 @@ hosts: localhost connection: local gather_facts: false - # no_log: "{{ molecule_no_log }}" + vars: + molecule_inventory: + all: + hosts: {} + molecule: {} + tasks: - # TODO: Developer must implement and populate 'server' variable + - name: Create a container + community.docker.docker_container: + name: "{{ item.name }}" + image: "{{ item.image }}" + state: started + command: sleep 1d + log_driver: json-file + register: result + loop: "{{ molecule_yml.platforms }}" - - name: Create instance config - when: server.changed | default(false) | bool # noqa no-handler - block: - - name: Populate instance config dict # noqa jinja - ansible.builtin.set_fact: - instance_conf_dict: {} - # instance': "{{ }}", - # address': "{{ }}", - # user': "{{ }}", - # port': "{{ }}", - # 'identity_file': "{{ }}", } - with_items: "{{ server.results }}" - register: instance_config_dict + - name: Print some info + ansible.builtin.debug: + msg: "{{ result.results }}" - - name: Convert instance config dict to a list - ansible.builtin.set_fact: - instance_conf: "{{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}" + - name: Fail if container is not running + when: > + item.container.State.ExitCode != 0 or + not item.container.State.Running + ansible.builtin.include_tasks: + file: tasks/create-fail.yml + loop: "{{ result.results }}" + loop_control: + label: "{{ item.container.Name }}" - - name: Dump instance config - ansible.builtin.copy: - content: | - # Molecule managed + - name: Add container to molecule_inventory + vars: + inventory_partial_yaml: | + all: + children: + molecule: + hosts: + "{{ item.name }}": + ansible_connection: community.docker.docker + ansible.builtin.set_fact: + molecule_inventory: > + {{ molecule_inventory | combine(inventory_partial_yaml | from_yaml, recursive=true) }} + loop: "{{ molecule_yml.platforms }}" + loop_control: + label: "{{ item.name }}" - {{ instance_conf | to_json | from_json | to_yaml }} - dest: "{{ molecule_instance_config }}" - mode: "0600" + - name: Dump molecule_inventory + ansible.builtin.copy: + content: | + {{ molecule_inventory | to_yaml }} + dest: "{{ molecule_ephemeral_directory }}/inventory/molecule_inventory.yml" + mode: "0600" + + - name: Force inventory refresh + ansible.builtin.meta: refresh_inventory + + - name: Fail if molecule group is missing + ansible.builtin.assert: + that: "'molecule' in groups" + fail_msg: | + molecule group was not found inside inventory groups: {{ groups }} + run_once: true # noqa: run-once[task] + +# we want to avoid errors like "Failed to create temporary directory" +- name: Validate that inventory was refreshed + hosts: molecule + gather_facts: false + tasks: + - name: Check uname + ansible.builtin.raw: uname -a + register: result + changed_when: false + + - name: Display uname info + ansible.builtin.debug: + msg: "{{ result.stdout }}" diff --git a/extensions/molecule/default/destroy.yml b/extensions/molecule/default/destroy.yml index 59d6a8e..2214991 100644 --- a/extensions/molecule/default/destroy.yml +++ b/extensions/molecule/default/destroy.yml @@ -1,24 +1,20 @@ --- -- name: Destroy - hosts: localhost - connection: local +- name: Destroy molecule containers + hosts: molecule gather_facts: false - # no_log: "{{ molecule_no_log }}" tasks: - # Developer must implement. + - name: Stop and remove container + delegate_to: localhost + community.docker.docker_container: + name: "{{ inventory_hostname }}" + state: absent + auto_remove: true - # Mandatory configuration for Molecule to function. - - - name: Populate instance config - ansible.builtin.set_fact: - instance_conf: {} - - - name: Dump instance config - ansible.builtin.copy: - content: | - # Molecule managed - - {{ instance_conf | to_json | from_json | to_yaml }} - dest: "{{ molecule_instance_config }}" - mode: "0600" - when: server.changed | default(false) | bool # noqa no-handler +- name: Remove dynamic molecule inventory + hosts: localhost + gather_facts: false + tasks: + - name: Remove dynamic inventory file + ansible.builtin.file: + path: "{{ molecule_ephemeral_directory }}/inventory/molecule_inventory.yml" + state: absent diff --git a/extensions/molecule/default/molecule.yml b/extensions/molecule/default/molecule.yml index af80270..3735fee 100644 --- a/extensions/molecule/default/molecule.yml +++ b/extensions/molecule/default/molecule.yml @@ -2,7 +2,11 @@ dependency: name: galaxy driver: - name: docker + options: + managed: false + login_cmd_template: "docker exec -it {instance} bash" + ansible_connection_options: + ansible_connection: docker platforms: - name: instance image: geerlingguy/docker-rockylinux9-ansible:latest @@ -11,10 +15,6 @@ platforms: - /sys/fs/cgroup:/sys/fs/cgroup:ro privileged: true pre_build_image: true -provisioner: - name: ansible -verifier: - name: ansible # you might want to add your own variables here based on what provisioning # you are doing like: # image: quay.io/centos/centos:stream8 diff --git a/extensions/molecule/default/tasks/create-fail.yml b/extensions/molecule/default/tasks/create-fail.yml new file mode 100644 index 0000000..34915c6 --- /dev/null +++ b/extensions/molecule/default/tasks/create-fail.yml @@ -0,0 +1,13 @@ +- name: Retrieve container log + ansible.builtin.command: + cmd: >- + {% raw %} + docker logs + {% endraw %} + {{ item.stdout_lines[0] }} + changed_when: false + register: logfile_cmd + +- name: Display container log + ansible.builtin.fail: + msg: "{{ logfile_cmd.stderr }}"