Ansible with Podman: Manage Containers Using Inventory & Modules (Guide)
By Luca Berton · Published 2024-01-01 · Category: installation
How to use Ansible with Podman containers. Configure Podman connection plugin, dynamic inventory, and manage rootless containers with practical playbook.
Introduction
Ansible provides powerful automation capabilities for managing containerized workloads, including those running on Podman. One crucial step in automating Podman containers with Ansible is defining the inventory, which tells Ansible how to interact with managed hosts.
In this guide, we'll cover how to properly define a Podman container in Ansible inventory, using both static and dynamic inventory approaches.
See also: Ansible Execution Environments: Build Custom EEs for Enterprise Automation
Setting Up Ansible Inventory for Podman
By default, Ansible uses SSH to connect to remote machines. However, when dealing with Podman containers, a more efficient way is to use the podman connection plugin instead of SSH.
1. Define a Static Inventory (inventory.ini)
The easiest way to specify a Podman container in the inventory is by directly listing it inside the inventory.ini file:
[podman_containers]
my_container ansible_connection=podmanmy_containeris the name of the running Podman container.ansible_connection=podmantells Ansible to use the Podman connection plugin instead of SSH.
ansible -i inventory.ini podman_containers -m ping2. Using a Dynamic Inventory Script
If you have multiple Podman containers and want to dynamically fetch their names and IPs, you can use a custom dynamic inventory script.
Example: Dynamic Inventory with Python
Create a script podman_inventory.py:
#!/usr/bin/env python3
import json
import subprocess
def get_podman_containers():
result = subprocess.run(["podman", "ps", "--format", "json"], capture_output=True, text=True)
containers = json.loads(result.stdout)
inventory = {
"podman_containers": {
"hosts": [container["Names"][0] for container in containers],
"vars": {
"ansible_connection": "podman"
}
}
}
print(json.dumps(inventory, indent=4))
if __name__ == "__main__":
get_podman_containers()Make it executable:
chmod +x podman_inventory.pyRun it to check the output:
./podman_inventory.pyThen, use it as your inventory source:
ansible -i podman_inventory.py podman_containers -m pingWriting an Ansible Playbook for Podman Containers
Once your inventory is ready, you can automate tasks inside the Podman containers.
Example Playbook: Managing a Web Server in Podman
---
- name: Manage Web Server in Podman Container
hosts: podman_containers
tasks:
- name: Ensure Apache is installed
ansible.builtin.yum:
name: httpd
state: present
- name: Ensure Apache service is running
ansible.builtin.service:
name: httpd
state: started
enabled: yesRun the playbook:
ansible-playbook -i inventory.ini playbook.ymlSee also: Ansible Builder & Execution Environments: Complete Guide (2026)
Conclusion
Now you know how to configure Ansible inventory for Podman containers, both manually using inventory.ini and dynamically with a Python script. You can now automate tasks inside Podman containers efficiently!
Install Podman Collection
ansible-galaxy collection install containers.podmanSee also: Ansible for Docker and Podman: Container Automation Complete Guide
Podman Connection Plugin
# inventory.yml
all:
hosts:
my-container:
ansible_connection: containers.podman.podman
ansible_podman_executable: podmanManaging Containers
Create and run a container
- name: Run nginx container
containers.podman.podman_container:
name: webserver
image: docker.io/library/nginx:latest
state: started
ports:
- "8080:80"
volumes:
- /opt/html:/usr/share/nginx/html:roRootless container
- name: Run rootless container
containers.podman.podman_container:
name: myapp
image: docker.io/myorg/myapp:latest
state: started
ports:
- "3000:3000"
env:
DATABASE_URL: "postgresql://db:5432/app"
become: falseBuild image
- name: Build from Containerfile
containers.podman.podman_image:
name: myapp
tag: latest
path: /opt/myapp/
build:
file: ContainerfileGenerate systemd service
- name: Create container with systemd service
containers.podman.podman_container:
name: myapp
image: myapp:latest
state: started
generate_systemd:
path: /etc/systemd/system/
restart_policy: always
names: true
become: true
- name: Enable service
ansible.builtin.systemd:
name: container-myapp
enabled: true
daemon_reload: true
become: truePodman Pod Management
- name: Create a pod
containers.podman.podman_pod:
name: webapp-pod
state: started
ports:
- "8080:80"
- name: Add containers to pod
containers.podman.podman_container:
name: "{{ item.name }}"
image: "{{ item.image }}"
pod: webapp-pod
state: started
loop:
- { name: web, image: "nginx:latest" }
- { name: db, image: "postgres:16" }Podman vs Docker in Ansible
| Feature | Podman | Docker |
|---|---|---|
| Collection | containers.podman | community.docker |
| Daemon | Daemonless | Requires dockerd |
| Rootless | Native | Requires config |
| Pods | Kubernetes-style | Docker Compose |
FAQ
Can I use Docker modules with Podman?
Partially, but use the dedicated containers.podman collection for full support.
How do I pull from a private registry?
- name: Login to registry
containers.podman.podman_login:
registry: registry.example.com
username: "{{ registry_user }}"
password: "{{ registry_password }}"Related Articles
Category: installation