Red Hat Training
A Red Hat training course is available for RHEL 8
Chapter 15. Managing containers using the Ansible playbook
Beginning with Podman 4.2, you can use the Podman RHEL System Role to manage Podman configuration, containers, and systemd services which run Podman containers.
RHEL System Roles provide a configuration interface to remotely manage multiple RHEL systems. The interface enables managing system configurations across multiple versions of RHEL, as well as adopting new major releases. For more information, see the Automating system administration by using RHEL System Roles.
15.1. Creating a rootless container with bind mount
You can use the Podman System Role to create rootless containers with bind mount by running an Ansible playbook.
Prerequisites
- Access and permissions to a control node, which is a system from which Red Hat Ansible Engine configures other systems.
On the control node:
-
The
rhel-system-rolespackage is installed. - An Ansible inventory file listing the hosts to be managed and any other parameters you want to apply.
-
The
The ansible-playbook command is provided by the ansible-core package which should be automatically installed as a dependency of the rhel-system-roles package.
Procedure
Create a new playbook.yml file with the following content:
- hosts: all vars: podman_create_host_directories: true podman_firewall: - port: 8080-8081/tcp state: enabled - port: 12340/tcp state: enabled podman_selinux_ports: - ports: 8080-8081 setype: http_port_t podman_kube_specs: - state: started run_as_user: dbuser run_as_group: dbgroup kube_file_content: apiVersion: v1 kind: Pod metadata: name: db spec: containers: - name: db image: quay.io/db/db:stable ports: - containerPort: 1234 hostPort: 12340 volumeMounts: - mountPath: /var/lib/db:Z name: db volumes: - name: db hostPath: path: /var/lib/db - state: started run_as_user: webapp run_as_group: webapp kube_file_src: /path/to/webapp.yml roles: - linux-system-roles.podmanThis procedure creates a pod with two containers. The
podman_kube_specsrole variable describes a pod.-
The
run_as_userandrun_as_groupfields specify that containers are rootless. The
kube_file_contentfield containing a Kubernetes YAML file defines the first container nameddb. You can generate the Kubernetes YAML file using thepodman generate systemdcommand.-
The
dbcontainer is based on thequay.io/db/db:stablecontainer image. -
The
dbbind mount maps the/var/lib/dbdirectory on the host to the/var/lib/dbdirectory in the container. TheZflag labels the content with a private unshared label, therefore, only thedbcontainer can access the content.
-
The
-
The
kube_file_srcfield defines the second container. The content of the/path/to/webapp.ymlfile on the controller node will be copied to thekube_filefield on the managed node. -
Set the
podman_create_host_directories: trueto create the directory on the host.
-
The
Optional: Verify playbook syntax.
# ansible-playbook --syntax-check playbook.yml -i inventory_file
Run the playbook on your inventory file:
# ansible-playbook -i inventory_file playbook.yml
Additional resources
-
The
/usr/share/ansible/roles/rhel-system-roles.podman/README.mdfile - The Podman System Role documentation
15.2. Creating a rootful container with Podman volume
You can use the Podman System Role to create a rootful container with a Podman volume by running an Ansible playbook.
Prerequisites
- Access and permissions to a control node, which is a system from which Red Hat Ansible Engine configures other systems.
On the control node:
-
The
rhel-system-rolespackage is installed. - An Ansible inventory file listing the hosts to be managed and any other parameters you want to apply.
-
The
-
The
ubi8-html-volumevolume has been created.
The ansible-playbook command is provided by the ansible-core package which should be automatically installed as a dependency of the rhel-system-roles package.
Procedure
Create a new playbook.yml file with the following content:
- hosts: all vars: podman_firewall: - port: 8080/tcp state: enabled podman_kube_specs: - state: started kube_file_content: apiVersion: v1 kind: Pod metadata: name: ubi8-httpd spec: containers: - name: ubi8-httpd image: registry.access.redhat.com/ubi8/httpd-24 ports: - containerPort: 8080 hostPort: 8080 volumeMounts: - mountPath: /var/www/html:Z name: ubi8-html volumes: - name: ubi8-html persistentVolumeClaim: claimName: ubi8-html-volume roles: - linux-system-roles.podmanThe procedure creates a pod with one container. The
podman_kube_specsrole variable describes a pod.- By default, the Podman role creates rootful containers.
The
kube_file_contentfield containing a Kubernetes YAML file defines the container namedubi8-httpd.The
ubi8-httpdcontainer is based on theregistry.access.redhat.com/ubi8/httpd-24container image.-
The
ubi8-html-volumemaps the/var/www/htmldirectory on the host to the container. TheZflag labels the content with a private unshared label, therefore, only theubi8-httpdcontainer can access the content. -
The pod mounts the existing persistent volume named
ubi8-html-volumewith the mount path/var/www/html.
-
The
Optional. Verify playbook syntax.
# ansible-playbook --syntax-check playbook.yml -i inventory_file
Run the playbook on your inventory file:
# ansible-playbook -i inventory_file playbook.yml
Additional resources
-
The
/usr/share/ansible/roles/rhel-system-roles.podman/README.mdfile - The Podman System Role documentation