--- - hosts: localhost gather_facts: false vars: # Получаем preset из переменной окружения или используем default preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}" preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml" # Fallback значения если preset файл не найден docker_network: labnet generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" images: debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy" systemd_defaults: privileged: true command: "/sbin/init" volumes: - "/sys/fs/cgroup:/sys/fs/cgroup:ro" tmpfs: ["/run", "/run/lock"] capabilities: ["SYS_ADMIN"] hosts: - name: u1 family: debian groups: [test] tasks: - name: Load preset configuration include_vars: "{{ preset_file }}" when: preset_file is file ignore_errors: true - name: Ensure network exists command: docker network create {{ docker_network }} delegate_to: localhost ignore_errors: true # SYSTEMD nodes - name: Pull systemd images command: docker pull {{ images[item.family] }} delegate_to: localhost loop: "{{ hosts | selectattr('type','undefined') | list }}" loop_control: { label: "{{ item.name }}" } - name: Start systemd nodes command: > docker run -d --name {{ item.name }} --network {{ docker_network }} --privileged={{ systemd_defaults.privileged | lower }} --tmpfs {{ (systemd_defaults.tmpfs | default([])) | join(' --tmpfs ') }} --cap-add {{ (systemd_defaults.capabilities | default([])) | join(' --cap-add ') }} {% for port in item.publish | default([]) %}--publish {{ port }} {% endfor %} {% for key, value in item.env | default({}) | dictsort %}--env {{ key }}={{ value }} {% endfor %} {% for volume in (systemd_defaults.volumes | default([])) + (item.volumes | default([])) %}--volume {{ volume }} {% endfor %} {{ images[item.family] }} {{ systemd_defaults.command }} delegate_to: localhost loop: "{{ hosts | selectattr('type','undefined') | list }}" loop_control: { label: "{{ item.name }}" } # DinD nodes - name: Start DinD nodes (docker:27-dind) command: > docker run -d --name {{ item.name }} --network {{ docker_network }} --privileged=true --env DOCKER_TLS_CERTDIR="" {% for port in item.publish | default([]) %}--publish {{ port }} {% endfor %} --volume {{ item.name }}-docker:/var/lib/docker docker:27-dind delegate_to: localhost loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}" loop_control: { label: "{{ item.name }}" } # DOoD nodes (mount docker.sock) - name: Start DOoD nodes (systemd + docker.sock mount) command: > docker run -d --name {{ item.name }} --network {{ docker_network }} --privileged={{ systemd_defaults.privileged | lower }} --tmpfs {{ (systemd_defaults.tmpfs | default([])) | join(' --tmpfs ') }} --cap-add {{ (systemd_defaults.capabilities | default([])) | join(' --cap-add ') }} {% for port in item.publish | default([]) %}--publish {{ port }} {% endfor %} {% for key, value in item.env | default({}) | dictsort %}--env {{ key }}={{ value }} {% endfor %} {% for volume in (systemd_defaults.volumes | default([])) + ['/var/run/docker.sock:/var/run/docker.sock'] + (item.volumes | default([])) %}--volume {{ volume }} {% endfor %} {{ images[item.family] }} {{ systemd_defaults.command }} delegate_to: localhost loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}" loop_control: { label: "{{ item.name }}" } # Build groups map - name: Build groups map set_fact: groups_map: "{{ groups_map | default({}) }}" - name: Append hosts to groups set_fact: groups_map: "{{ groups_map | combine({ item_group: (groups_map[item_group] | default([])) + [item_name] }) }}" loop: "{{ hosts | subelements('groups', skip_missing=True) }}" loop_control: label: "{{ item.0.name }}" vars: item_name: "{{ item.0.name }}" item_group: "{{ item.1 }}" # Render inventory - name: Render inventory ini set_fact: inv_content: | [all:vars] ansible_connection=community.docker.docker ansible_python_interpreter=/usr/bin/python3 {% for group, members in (groups_map | dictsort) %} [{{ group }}] {% for h in members %}{{ h }} {% endfor %} {% endfor %} [all] {% for h in hosts %}{{ h.name }} {% endfor %} - name: Write inventory file copy: dest: "{{ generated_inventory }}" content: "{{ inv_content }}" mode: "0644"