An end-to-end DevOps lab that simulates an air-gapped enterprise Linux environment.
Clients cannot install from the internet. Every package comes from a controlled internal YUM repository, then gets rolled out consistently using Ansible automation.
- Demonstrates real-world package governance patterns used in restricted enterprise networks.
- Shows the progression from manual administration to repeatable infrastructure automation.
- Combines Linux package management, container orchestration, and configuration management in one workflow.
- Rocky Linux 8 (container base)
- Docker Compose (multi-service environment)
- nginx + createrepo (internal YUM hosting)
- Bash scripting (repo maintenance and sync)
- Ansible (fleet-wide client configuration and installs)
- Makefile + .env (operational consistency)
| Phase | Focus | Status |
|---|---|---|
| Phase 1 | Internal YUM repository + multi-container foundation | Completed |
| Phase 2 | Bash + Ansible automation | Completed |
| Phase 3 | GPG signing + multi-server patch rollout | Planned |
| Phase 4 | CI/CD integration | Planned |
| Service | Responsibility |
|---|---|
repo-server |
Hosts RPMs, updates metadata, serves repo via nginx |
web-server |
Client host managed by Ansible |
db-server |
Client host managed by Ansible |
backup-server |
Client host managed by Ansible |
ansible-controller |
Executes playbooks across all clients over SSH |
Network: all services communicate on the pkgnet Docker bridge network.
Repository endpoints:
- Internal:
http://repo-server/repos/yum_local/ - Host machine:
http://localhost:8081/repos/yum_local/
docker-compose up --buildmake ansible-configuremake ansible-install PKG=wgetmake add-pkg PKG=./packages/downloaded_rpms/curl.rpmmake sync
make test
docker-compose ps- Health-gated startup: clients wait for
repo-serverto be healthy. - Centralized config: environment values managed via
.env. - Repeatable ops: standardized commands through
Makefiletargets. - Fleet management: Ansible playbooks configure repo settings and install packages across all clients.
- Scheduled maintenance model: cron-style sync script keeps metadata and packages fresh.
make up
make down
make rebuild
make ansible-configure
make ansible-install PKG=wget
make add-pkg PKG=./packages/downloaded_rpms/curl.rpm
make sync
make test- How internal package repositories are structured and maintained (
createrepo --update). - How to model production-like server groups with Docker networking.
- How to convert repetitive shell work into declarative Ansible playbooks.
- How to make operations safer through health checks, environment-driven config, and consistent command interfaces.
- How DevOps maturity grows from manual execution toward deterministic, auditable automation.
- GPG sign repository metadata and enforce signature checks on clients.
- Add staged rollout strategy for package updates.
- Integrate CI/CD to run automated validation on every infrastructure change.