---

# Directories are created recursively.
- name: Create a whole directory tree
  ansible.builtin.file:
    path: /tmp/path/to/final/dir
    state: directory

- name: Import tasks
  block:
    - name: By using absolute paths and special variables (preferred)
      ansible.builtin.import_tasks:
      file: "{{ role_path }}/tasks/install/{{ install_method }}.yml"
    - name: By using paths relative to the including file
      ansible.builtin.import_tasks:
      file: pre-flight.yml

- name: Conditionally include tasks
  block:
    - name: by leveraging the 'with_fileglob' loop filter (preferred)
      ansible.builtin.include_tasks:
        file: "{{ item }}"
      with_fileglob: "{{ install_method }}.yml"
    - name: by checking the files' existence
      vars:
        filename: "{{ install_method }}.yml"
      when: lookup('ansible.builtin.fileglob', filename) != []
      ansible.builtin.import_tasks:
        file: "{{ filename }}"

- name: Assertions
  ansible.builtin.assert:
    that:
      - install_method in supported_install_methods
      - external_url is ansible.builtin.url
    fail_msg: What to say if any of the above conditions fail
    success_msg: What to say if all of the above conditions succeed

- name: Pretty print information
  ansible.builtin.debug:
    msg: >-
      {{
        dict([
          [ 'install_method', install_method ],
          [ 'install_method in supported_install_methods', install_method in supported_install_methods ],
        ])
      }}

- name: Generate passwords
  block:
    - name: Randomly
      ansible.builtin.debug:
        msg: "{{ lookup('ansible.builtin.password', '/dev/null') }}"
    - name: Specifying requirements
      ansible.builtin.debug:
        msg: "{{ lookup('ansible.builtin.password', '/dev/null length=32 chars=ascii_letters,digits,punctuation') }}"
    - name: Random but idempotent, so it will not change at every execution
      ansible.builtin.debug:
        msg: "{{ lookup('ansible.builtin.password', '/dev/null', seed=inventory_hostname) }}"

- name: Run containers
  community.docker.docker_container:
    name: gitlab
    image: gitlab/gitlab-ce:16.11.2-ce.0
    hostname: gitlab.lan
    published_ports:
      - "8022:22"
      - "8080:80"
      - "8443:443"
    env:
      GITLAB_OMNIBUS_CONFIG: >-
        external_url 'http://gitlab.lan';
    shm_size: 256m
    volumes:
      - ./config:/etc/gitlab:Z
      - ./logs:/var/log/gitlab:Z
      - ./data:/var/opt/gitlab:Z
    auto_remove: true
