|
|
|
@@ -0,0 +1,206 @@
|
|
|
|
|
---
|
|
|
|
|
- name: Set fact podman_binary (Debian family)
|
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
|
podman_binary: /usr/bin/podman
|
|
|
|
|
when: ansible_os_family == 'Debian'
|
|
|
|
|
|
|
|
|
|
- name: Set fact podman_binary (Red Hat family)
|
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
|
podman_binary: /usr/sbin/podman
|
|
|
|
|
when: ansible_os_family == 'RedHat'
|
|
|
|
|
|
|
|
|
|
- name: Create group
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.group:
|
|
|
|
|
name: "{{ podman_group }}"
|
|
|
|
|
system: true
|
|
|
|
|
|
|
|
|
|
- name: Create user
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.user:
|
|
|
|
|
name: "{{ podman_user }}"
|
|
|
|
|
groups: "{{ podman_extra_groups | default([]) }}"
|
|
|
|
|
shell: /bin/bash
|
|
|
|
|
home: "{{ podman_user_home }}"
|
|
|
|
|
group: "{{ podman_group }}"
|
|
|
|
|
|
|
|
|
|
- name: Disable password login for user
|
|
|
|
|
ansible.builtin.command: passwd -d "{{ podman_user }}"
|
|
|
|
|
become: true
|
|
|
|
|
changed_when: false
|
|
|
|
|
|
|
|
|
|
- name: Create user home
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
path: "{{ podman_user_home }}"
|
|
|
|
|
state: directory
|
|
|
|
|
owner: "{{ podman_user }}"
|
|
|
|
|
group: "{{ podman_group }}"
|
|
|
|
|
mode: "0750"
|
|
|
|
|
|
|
|
|
|
- name: Create build folders
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
path: "{{ podman_user_home }}/build"
|
|
|
|
|
state: directory
|
|
|
|
|
owner: "{{ podman_user }}"
|
|
|
|
|
group: "{{ podman_group }}"
|
|
|
|
|
mode: "0750"
|
|
|
|
|
|
|
|
|
|
- name: Create folders
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
path: "{{ podman_user_home }}/{{ item }}"
|
|
|
|
|
state: directory
|
|
|
|
|
owner: "{{ podman_user }}"
|
|
|
|
|
group: "{{ podman_group }}"
|
|
|
|
|
mode: "0750"
|
|
|
|
|
loop: "{{ podman_user_folders }}"
|
|
|
|
|
|
|
|
|
|
- name: "Add SSH Authorized key"
|
|
|
|
|
become: true
|
|
|
|
|
ansible.posix.authorized_key:
|
|
|
|
|
user: "{{ podman_user }}"
|
|
|
|
|
key: "{{ podman_user_pubkey }}"
|
|
|
|
|
state: "{{ 'present' if podman_user_pubkey is defined and podman_user_pubkey != '' else 'absent' }}"
|
|
|
|
|
when: podman_user_pubkey is defined and podman_user_pubkey != ""
|
|
|
|
|
|
|
|
|
|
- name: SELinux tasks (RedHat only)
|
|
|
|
|
when: ansible_os_family == 'RedHat'
|
|
|
|
|
become: true
|
|
|
|
|
block:
|
|
|
|
|
- name: Persistently set SELinux context
|
|
|
|
|
community.general.sefcontext:
|
|
|
|
|
target: "{{ podman_user_home }}(/.*)?"
|
|
|
|
|
setype: user_home_dir_t
|
|
|
|
|
state: present
|
|
|
|
|
|
|
|
|
|
- name: Persistently set SELinux context (ssh authorized keys)
|
|
|
|
|
community.general.sefcontext:
|
|
|
|
|
target: "{{ podman_user_home }}/.ssh/authorized_keys"
|
|
|
|
|
setype: ssh_home_t
|
|
|
|
|
state: present
|
|
|
|
|
when: podman_user_pubkey is defined and podman_user_pubkey != ""
|
|
|
|
|
|
|
|
|
|
- name: Apply SELinux context
|
|
|
|
|
ansible.builtin.command: restorecon -Rv {{ podman_user_home }}
|
|
|
|
|
changed_when: false
|
|
|
|
|
|
|
|
|
|
- name: Enable sudo access to podman user (temporary)
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.lineinfile:
|
|
|
|
|
path: "/etc/sudoers.d/ansible_{{ podman_user }}_tmp"
|
|
|
|
|
create: true
|
|
|
|
|
mode: "0440"
|
|
|
|
|
line: "{{ ansible_facts['user_id'] }} ALL=({{ podman_user }}) NOPASSWD: ALL"
|
|
|
|
|
validate: "visudo -cf %s"
|
|
|
|
|
|
|
|
|
|
- name: Enable lingering for podman user
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.command: loginctl enable-linger {{ podman_user }}
|
|
|
|
|
register: linger_status
|
|
|
|
|
changed_when: >-
|
|
|
|
|
'created' in linger_status.stdout or
|
|
|
|
|
(linger_status.rc == 0 and not
|
|
|
|
|
('linger file already exists' in linger_status.stderr or
|
|
|
|
|
'linger file does not exist' in linger_status.stderr))
|
|
|
|
|
failed_when:
|
|
|
|
|
- linger_status.rc != 0 and not
|
|
|
|
|
('linger file already exists' in linger_status.stderr)
|
|
|
|
|
|
|
|
|
|
- name: Get current user's UID
|
|
|
|
|
ansible.builtin.command: id -u {{ podman_user }}
|
|
|
|
|
changed_when: false
|
|
|
|
|
register: uid
|
|
|
|
|
|
|
|
|
|
- name: Get current user's GID
|
|
|
|
|
ansible.builtin.command: id -g {{ podman_user }}
|
|
|
|
|
changed_when: false
|
|
|
|
|
register: gid
|
|
|
|
|
|
|
|
|
|
- name: Run tasks as podman user
|
|
|
|
|
become: true
|
|
|
|
|
become_user: "{{ podman_user }}"
|
|
|
|
|
block:
|
|
|
|
|
- name: Create a custom Podman network
|
|
|
|
|
when: podman_network_name is defined and podman_network_name != 'none'
|
|
|
|
|
containers.podman.podman_network:
|
|
|
|
|
name: "{{ podman_network_name }}"
|
|
|
|
|
state: present
|
|
|
|
|
|
|
|
|
|
- name: Copy build files to user home
|
|
|
|
|
ansible.builtin.copy:
|
|
|
|
|
src: "{{ item }}"
|
|
|
|
|
dest: "{{ podman_user_home }}/build/"
|
|
|
|
|
owner: "{{ podman_user }}"
|
|
|
|
|
group: "{{ podman_group }}"
|
|
|
|
|
mode: "0644"
|
|
|
|
|
loop: "{{ podman_build_files | default([]) }}"
|
|
|
|
|
when: podman_build_files is defined and podman_build_files | length > 0
|
|
|
|
|
|
|
|
|
|
- name: Build containers images
|
|
|
|
|
containers.podman.podman_image:
|
|
|
|
|
name: "{{ podman_user }}/{{ item.name }}"
|
|
|
|
|
path: "{{ podman_user_home }}/build"
|
|
|
|
|
build:
|
|
|
|
|
cache: false
|
|
|
|
|
force_rm: true
|
|
|
|
|
container_file: "{{ item.build.dockerfile }}"
|
|
|
|
|
extra_args: "--build-arg UID={{ uid.stdout }} --build-arg GID={{ gid.stdout }} --security-opt=label=disable {{ item.build.args | default('') }}"
|
|
|
|
|
tag: "latest"
|
|
|
|
|
state: present
|
|
|
|
|
loop: "{{ podman_pods }}"
|
|
|
|
|
when: item.build is defined and item.build.dockerfile is defined
|
|
|
|
|
|
|
|
|
|
- name: Pull the requested images
|
|
|
|
|
containers.podman.podman_image:
|
|
|
|
|
name: "{{ item.repo.image }}"
|
|
|
|
|
tag: "{{ item.repo.tag | default('latest') }}"
|
|
|
|
|
state: present
|
|
|
|
|
loop: "{{ podman_pods }}"
|
|
|
|
|
when: item.repo is defined and item.repo.image is defined
|
|
|
|
|
|
|
|
|
|
- name: Create pods
|
|
|
|
|
containers.podman.podman_container:
|
|
|
|
|
name: "{{ item.name }}"
|
|
|
|
|
image: "{{ item.repo.image | default(podman_user + '/' + item.name) }}"
|
|
|
|
|
state: "{{ item.state | default('started') }}"
|
|
|
|
|
device: "{{ item.device | default(omit) }}"
|
|
|
|
|
env: "{{ item.env | default(omit) }}"
|
|
|
|
|
network: "{{ podman_network_name | default(omit) }}"
|
|
|
|
|
ports: "{{ item.ports | default(omit) }}"
|
|
|
|
|
volumes: "{{ item.volumes | default(omit) }}"
|
|
|
|
|
command: "{{ item.command | default(omit) }}"
|
|
|
|
|
cmd_args:
|
|
|
|
|
- "--userns=keep-id"
|
|
|
|
|
- "--security-opt=label=disable"
|
|
|
|
|
loop: "{{ podman_pods }}"
|
|
|
|
|
|
|
|
|
|
- name: Create systemd service file for pods
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.template:
|
|
|
|
|
src: podman.service.j2
|
|
|
|
|
dest: "/etc/systemd/system/podman-{{ item.name }}.service"
|
|
|
|
|
owner: root
|
|
|
|
|
group: root
|
|
|
|
|
mode: "0644"
|
|
|
|
|
loop: "{{ podman_pods }}"
|
|
|
|
|
|
|
|
|
|
- name: Reload systemd daemon
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.systemd:
|
|
|
|
|
daemon_reload: true
|
|
|
|
|
|
|
|
|
|
- name: Enable containers at boot
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.systemd:
|
|
|
|
|
name: "podman-{{ item.name }}"
|
|
|
|
|
enabled: "{{ item.systemd.enabled | default(true) }}"
|
|
|
|
|
state: "{{ item.systemd.state | default('started') }}"
|
|
|
|
|
loop: "{{ podman_pods }}"
|
|
|
|
|
|
|
|
|
|
- name: Remove temporary sudo access
|
|
|
|
|
become: true
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
path: "/etc/sudoers.d/ansible_{{ podman_user }}_tmp"
|
|
|
|
|
state: absent
|