diff --git a/inventory/group_vars/ci_runners.yml b/inventory/group_vars/ci_runners.yml new file mode 100644 index 0000000..50c3f81 --- /dev/null +++ b/inventory/group_vars/ci_runners.yml @@ -0,0 +1,15 @@ +--- + +podman_containers: + woodpecker_agent: + image: docker.io/woodpeckerci/woodpecker-agent:v3.16 + state: started + volumes: + - '/var/run/docker.sock:/var/run/docker.sock' + env: + WOODPECKER_BACKEND=docker + WOODPECKER_SERVER=10.7.10.84:9000 + WOODPECKER_AGENT_SECRET=af2c22a8f27fe2c22249d3b1e42f92df + generate_systemd: + restart_policy: always + names: true diff --git a/playbooks/docker.yml b/playbooks/docker.yml index 42b9850..f5522b2 100644 --- a/playbooks/docker.yml +++ b/playbooks/docker.yml @@ -6,3 +6,13 @@ roles: - geerlingguy.docker + +- name: Ensure python3-docker is installed + hosts: ci_servers + become: true + tasks: + - name: Install python3-docker + ansible.builtin.package: + name: + - python3-docker + state: present diff --git a/playbooks/podman.yml b/playbooks/podman.yml index 50dffe0..5f381f3 100644 --- a/playbooks/podman.yml +++ b/playbooks/podman.yml @@ -53,3 +53,51 @@ ansible.builtin.command: podman --version register: podman_version_output changed_when: false + +- name: Run Podman containers + hosts: ci_runners + become: true + tasks: + - name: Determine mount host paths + ansible.builtin.set_fact: + _mount_paths: >- + {{ + _mount_paths | default([]) + + (item.value.volumes | map('regex_replace', ':.*$', '') | list) + }} + loop: "{{ podman_containers | default({}) | dict2items }}" + when: + - item.value.volumes is defined + - item.value.state | default('started') != 'absent' + + - name: Check status of mount paths on host + ansible.builtin.stat: + path: "{{ item }}" + loop: "{{ _mount_paths | default([]) | unique }}" + register: _mount_stats + + - name: Ensure container mount directories exist + ansible.builtin.file: + # If the target path exists and is a file/socket/link, create its parent dir. + # If it doesn't exist at all, create it as a directory. + path: "{{ (item.stat.exists and not item.stat.isdir) | ternary(item.item | dirname, item.item) }}" + state: directory + mode: "0755" + loop: "{{ _mount_stats.results }}" + # Skip creating anything if the file/socket already exists + when: not (item.stat.exists and not item.stat.isdir) + + - name: Manage Podman containers + containers.podman.podman_container: + name: "{{ item.key }}" + image: "{{ item.value.image | default(omit) }}" + state: "{{ item.value.state | default('started') }}" + command: "{{ item.value.command | default(omit) }}" + ports: "{{ item.value.ports | default(omit) }}" + volumes: "{{ item.value.volumes | default(omit) }}" + env: "{{ item.value.env | default(omit) }}" + network: "{{ item.value.network | default(omit) }}" + privileged: "{{ item.value.privileged | default(false) }}" + recreate: "{{ item.value.recreate | default(false) }}" + generate_systemd: "{{ item.value.generate_systemd | default(omit) }}" + loop: "{{ podman_containers | default({}) | dict2items }}" diff --git a/requirements.yml b/requirements.yml index 2dfee29..d2c7a7c 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,6 +1,12 @@ collections: - name: ansible.posix + version: 2.2.2 - name: community.general + version: 13.4.0 + - name: community.docker + version: 5.3.0 + - name: containers.podman + version: 1.20.2 roles: - name: gballan.sssd