RFC: Containerized Foreman & Provisioning Infrastructure
Feedback Due Date: 9th July 2026 (One month from publication)
Context and Problem Statement
Background
To enable provisioning workflows, the foreman-installer currently manages the configuration inside the Smart Proxy and (optionally, but enabled by default) the DHCP, DNS, and TFTP services. The Smart Proxy then communicates directly with these services on the host.
With containerization, our services run in containers. This prevents Smart Proxy containers from managing host-level infrastructure, preserving isolation and avoiding complex mapping requirements.
What is the problem being solved?
As part of our broader initiative to transition Foreman production installations from the traditional package-and-Puppet approach (foreman-installer) to a modern containerized model using Podman quadlets and foremanctl, we have reached an important architectural crossroads: how we handle provisioning infrastructure.
Historically, foreman-installer didnāt just install Foreman; it acted as an infrastructure orchestrator. With its CLI flags, it would install, configure, and fully manage host-level daemons such as ISC DHCP, BIND (DNS), and TFTP. We need to define a clean, sustainable model for how containerized Foreman interacts with provisioning infrastructure.
How does this affect the users?
For Users
Users are now responsible for providing, deploying, and managing their own provisioning infrastructure. This includes configuring DHCP, DNS, and TFTP services independently. Foreman and its Smart Proxies will focus solely on communicating with these user-managed external services via established APIs and protocols.
For Admins
Upgrading or patching Foreman will no longer pose a risk to the availability of core network infrastructure. Because DHCP, DNS, and TFTP are decoupled from the application lifecycle, administrators can perform Foreman maintenance windows without inadvertently disrupting active network assignment or service state. It was always limited in options, so as you scale youād run into blockers.
For Developers
This removes an immense maintenance burden from the core team. We no longer need to maintain complex Puppet installer modules to manage underlying operating system daemons, troubleshoot package conflicts, or handle edge-case configuration files for network services we donāt own. It allows us to focus entirely on making foremanctl an exceptional application lifecycle manager.
Technical objectives
- Decouple the deployment and lifecycle of network infrastructure services (DHCP, DNS, TFTP) from the deployment of Foreman and Smart Proxy application containers.
- Standardize Smart Proxy interactions with external infrastructure services via clean, well-defined network APIs or isolated shared-volume boundaries (e.g., a shared directory for TFTP).
- Support the current list of provisioning methods.
Non-goals
- We are not deprecating bare-metal or VM provisioning. Provisioning remains a core, first-class feature of the Foreman ecosystem.
- DHCP - Kea DHCP as main provider, communication via its API. Managed by the user.
- We are not building an infrastructure orchestrator or a custom DHCP/DNS server inside
foremanctl.
Proposal
foremanctl removes any responsibility for installing, configuring, or managing underlying daemons for TFTP, DNS, and DHCP. Users are solely responsible for their provisioning infrastructure.
foremanctlwill deploy only Foreman, Smart Proxy, database, and plugins using Podman Quadlets. Its role is limited to these services.- It is the userās responsibility to deploy and maintain the DHCP, DNS, and TFTP endpoints required for provisioning. The user must ensure that these services are available and correctly configured so that Foreman and Smart Proxy can communicate with them.
- The Smart Proxy communicates with external DHCP and DNS services over the network, using their native protocols (OMAPI for ISC DHCP, RFC 2136 nsupdate for BIND, HTTP APIs for infoblox/bluecat).
- For TFTP, the Smart Proxy container requires a volume mount to the TFTP root directory. Users must configure their TFTP daemon to use this shared directory.
- We are phasing out support for the legacy ISC DHCP daemon and standardizing on ISC Kea DHCP as our preferred open-source DHCP provider.
Technical and project-level impacts
- Code Simplification: Massive reduction in the complexity of
foremanctland the complete removal of legacy Puppet installer logic that dealt with host-level package management for network infrastructure. - Documentation Shift: Our installation documentation will transition from āRun this single massive command to get a complete PXE networkā to āHere is how to connect your containerized Foreman instance to your networking infrastructure, along with reference templates to spin them up if you need them.ā
- Testing Infrastructure: Our internal CI/CD pipelines will need to be updated to deploy independent network service containers alongside our
foremanctltest suites to validate provisioning workflows.ā
Alternative Designs
Provide an Ansible playbook to deploy the managed services with basic configuration. This playbook would be community-maintained and not part of the supported installation workflow.
Example PR: https://github.com/theforeman/foremanctl/pull/532
Call for feedback!
This is one of the biggest architectural evolutions weāve proposed in a long time, and we definitely want to make sure we arenāt pulling the rug out from under your existing setups. Since this fundamentally changes how the network plumbing of your provisioning environment works, your real-world insights are incredibly valuable to us.
- Are you already running Kea DHCP in production, or are you still holding onto legacy ISC DHCP?
- How can we make the migration from the traditional Puppet installer to
foremanctlas painless as possible for your team? - Is there anything you are worried about?
- Any suggestions, things we might have missed�
Please drop your thoughts, concerns, or edge cases in the replies below. Thank you!