Bounded infrastructure automation for identity, DNS, MariaDB, proxy, and high availability.
Six independently usable Bash and Ansible components with explicit contracts, inspect-before-mutate workflows, and public-safe fixtures. Compose the pieces in a caller-owned playbook; this repository is not an end-to-end platform installer.
✨ Highlights · 🧩 Components · 🧭 Platforms · 🚀 Quick Start · 📦 Release assets · 🤝 Contributing
- Composable by design: FreeIPA, MariaDB, MariaDB replication, MaxScale, Keepalived, and DNS update remain independently usable, with responsibilities and non-responsibilities documented for each interface.
- Inspect before mutating: Check mode, dry-run paths, candidate configuration validation, deterministic contracts, and explicit opt-in switches keep changes reviewable before they reach a target host.
- Packaged independently: Release
v0.1.0publishes five Ansible role archives plus a separate FreeIPA archive, with a machine-readable manifest and SHA256 checksums for download verification. - Public-safe by default: Examples use documentation networks and
example.invalid; credentials, certificates, authoritative data, vendor packages, and runtime state stay outside the repository.
⚠️ Scope note: “Linux” describes the component-specific target families listed below. It is not a promise that every role runs on every Linux distribution. The CI runner is Ubuntu 24.04, while FreeIPA and the database/proxy roles have different documented target constraints.
The project is in 0.x development. The component contracts and static validation are published, while target-host
runtime validation remains the responsibility of the operator. In particular, the DNS update role has passed its
contract, syntax, yamllint, and ansible-lint checks, but a local Python 3.14 controller RPC incompatibility blocked
live execution before DNS was reached. No live DNS deployment outcome is claimed.
- Highlights
- Why this repository exists
- Goals and engineering principles
- Component catalogue
- Architecture and composition
- Supported platforms and prerequisites
- Safe Quick Start
- Repository layout
- Validation and CI
- Branch governance
- Release, versioning, and changelog
- Operational safety, secrets, and certificates
- Roadmap
- Contributing
- Licence and third-party boundaries
- Documentation index
Infrastructure automation is easier to review when each change has an owner, a preflight path, and a clear stopping point. This toolkit focuses on repeatable foundations and operational checks:
- identity and DNS bootstrapping with explicit authority boundaries;
- MariaDB host preparation and standard asynchronous replication;
- a bounded MaxScale configuration core;
- generic Keepalived/VRRP configuration; and
- explicit DNS
A/PTRinspection and reconciliation.
The boundaries are intentional. The MariaDB baseline does not configure a replication channel; replication does not copy data or promote a new primary; MaxScale does not create database accounts or claim a virtual IP; Keepalived does not infer application health; and DNS does not decide which service is healthy. A caller can therefore adopt one component without accepting the assumptions of the others.
- Make infrastructure changes inspectable before they are applied.
- Keep every component independently usable with a documented interface.
- Prefer idempotent, state-aware operations over broad host mutation.
- Make version, dependency, privilege, recovery, and limitation information visible.
- Provide fixtures that are safe to parse or render with RFC documentation addresses and
example.invalidnames. - Record validation evidence without implying a deployment result that was not observed.
- Validate before mutating. Use preflight, syntax checks, check mode, dry runs, and candidate configuration checks before enabling package, service, firewall, DNS, or topology changes.
- Keep ownership explicit. A role manages only the files, records, services, and state named in its contract. It does not discover authority or repair an ambiguous existing installation.
- Separate layers. Identity/DNS and the MariaDB/replication/MaxScale/VRRP path have independent inputs and failure boundaries.
- Use least privilege. Credentials, certificates, keys, health programs, and database state are supplied or owned by the workflow that is responsible for them.
- Prefer recoverable operations. Guard first-node initialisation, refuse unsafe PTR replacement by default, protect running Keepalived deployments, and preserve configuration recovery paths.
- Publish safe examples. Examples use RFC 5737 IPv4 ranges, RFC 3849 IPv6 ranges, and the reserved
example.invalidnamespace. Replace them only in an approved runtime inventory.
The table is a quick index. Each component guide remains authoritative for its complete variable contract, supported versions, and recovery notes.
| Component | Interface and status | Primary responsibility | Explicitly not responsible for | Guide | Example | Tests |
|---|---|---|---|---|---|---|
| FreeIPA bootstrap | Bash; available, with supported-target validation required | Primary/replica bootstrap, CA mode, integrated or external DNS provider orchestration, validation, and managed server-address updates | Users, groups, access policy, application principals, trust policy, backup/restore, or workstation testing | README | examples/freeipa | test suite |
| MariaDB baseline | Ansible; available, with Ubuntu target validation required | Official repository/package baseline, split configuration, hardening, deterministic identity, guarded first-node initialisation, and TLS consumer links | Replication topology, data copy, failover, application schemas/users, backup schedules, Galera, or MaxScale | role guide | examples/mariadb | contracts |
| MariaDB replication | Ansible; available, with existing data-copy evidence required | One writable primary and one or more asynchronous replicas, GTID or explicit file/position channels, consistency checks, and health summaries | Data copy/restore, server identity changes, binary-log enablement, PKI, Galera, failover, MaxScale, or Keepalived | role guide | examples/mariadb-replication | contracts |
| MaxScale core | Ansible; available, render-first, software not bundled | Generic server/monitor/service/listener model, configuration validation, optional service reload, logging, TLS-path checks, and optional REST health checks | MariaDB or MaxScale account creation, Binlog Router, Config Sync, binlog retention, external replicas, VIP/DNS, or MaxScale redistribution | role guide | examples/maxscale-ha | static checks |
| Keepalived | Ansible; available, generic VRRP only | Explicit VRRP instances, peer selection, protected existing deployments, least-privilege health-script references, and opt-in generic firewall rules | Health-program implementation, database/proxy semantics, DNS, certificates, or forced failover | role guide | examples/keepalived | syntax check |
| DNS update | Ansible; available interface, live target validation pending | Explicit A/PTR inspection and optional reconciliation through community.general.nsupdate, with per-record results and conservative PTR conflicts |
Zone/server discovery, DNS authority management, operating-system network changes, or identity/database/proxy/VRRP state | role guide | examples/dns-update | contract test |
The Bash component supports a FreeIPA/IdM primary or replica on allowlisted RHEL-family 8, 9, or 10 hosts and
x86_64 or aarch64 architectures. It uses the supported ipa-server-install or ipa-replica-install path,
validates foundational host and realm inputs, and keeps DNS provider behaviour behind a provider contract. The public
DNS choices are FreeIPA integrated DNS, managed BIND9/Webmin, Technitium, and a read-only existing-DNS path.
./install.sh --check is read-only and ./install.sh --dry-run prints the planned actions. The address-update utility
changes only its managed records and keeps host-network migration separate. The bootstrap does not create identity
policy, application configuration, or a backup/restore system.
The baseline defaults to MariaDB 11.8 on Ubuntu 24.04 (noble), with the release and target values explicit. It manages
official repository integration, packages, split option files, logging, performance defaults, deterministic server_id
and report_host, root hardening, a reserved SSL-protected replication account, and stable links for externally managed
TLS assets. First-node GTID/binlog reset is guarded by an explicit new-server declaration and clean-state assertions.
The role stops at a Ready-for-HA contract. It does not create application databases or users, initialise a topology,
schedule backups, or configure CHANGE MASTER TO, CHANGE REPLICATION SOURCE TO, or START REPLICA.
The replication role supports MariaDB 11.x and 12.x standard asynchronous replication: one initial writable primary and one or more replicas. GTID with the replica-position model is the default; file/position mode is available when the operator supplies coordinates tied to a consistent copy. The role validates server identity, binary logging, network reachability, account transport policy, table inventories, storage engines, and checksums before changing a channel.
It does not copy or restore data, discover a safe coordinate, change server_id, enable binary logging, enrol
certificates, implement failover, or configure MaxScale/Keepalived. A replica failure is reported in its own result so
other declared replicas can still be assessed; a primary safety failure remains a failed run.
The MaxScale role is a bounded, 24.02-oriented configuration core for Debian-family hosts, with Ubuntu jammy and
noble as the documented defaults. It renders server, monitor, service, router, and listener definitions; validates
caller-supplied TLS paths; and can optionally manage the official repository, package, service, firewall rules, logging,
and REST health checks. Rendering and management are separate switches so a caller can review a configuration first.
MaxScale software, packages, repository metadata, and vendor legal text are not redistributed or relicensed by this repository. The role does not create database or MaxScale accounts, manage Binlog Router or Config Sync, claim a VIP, or infer DNS and application health.
The Keepalived role describes one or more independent VRRP instances. The caller supplies interface, state, priority, peer addresses, virtual IP addresses, and optional paths to separately managed health programs. Existing running deployments are validation-only unless a planned reconciliation switch is enabled. The role validates the rendered configuration and does not claim a VIP or force failover during a check.
The dns_update role requires every record to declare name, type (A or PTR), value, zone, and state.
It queries current values with dig first and delegates updates to the official community.general.nsupdate module.
Both dns_update_enabled and dns_update_manage default to false. GSS-TSIG is the secure default; standard TSIG is
optional; unsigned mode is test-only, disabled by default, and requires an explicit opt-in. A matching record is a
no-op. A different PTR is reported and left untouched under the default report policy.
The pinned public example uses community.general 13.0.0. Check mode performs read-only inspection and never obtains a
Kerberos ticket or invokes nsupdate. Runtime dependency, authority, credential, and target-host checks remain the
caller's responsibility.
FreeIPA is an independent identity plane. Its primary/replica relationship, realm, CA choice, and DNS provider choice are established by the FreeIPA component and are not inferred from the database or availability roles. A FreeIPA replica is not automatically a BIND or Technitium secondary, and a DNS secondary is not automatically a FreeIPA replica.
The identity and DNS architecture guide describes integrated DNS, managed BIND9/Webmin, Technitium, existing-DNS read-only operation, provider boundaries, and the separate address-update paths.
The database and service path can be composed in this order when a caller needs all layers:
MariaDB baseline -> MariaDB replication -> MaxScale -> Keepalived/VRRP -> DNS name
Each arrow is a caller-controlled hand-off, not a hidden role dependency:
- MariaDB baseline prepares each database host, stable identity, server configuration, and external TLS links.
- MariaDB replication consumes existing data-copy evidence and explicit topology inputs to configure and validate the asynchronous channel.
- MaxScale consumes backend definitions and exposes an optional listener after candidate configuration validation.
- Keepalived/VRRP can own a virtual IP for a caller-supplied edge or listener policy; it does not know whether the address fronts MariaDB, MaxScale, or another service.
- DNS can name the chosen edge, but it does not decide health, promote a primary, or claim a virtual IP.
The data-plane architecture guide contains the responsibility matrix and safe
composition sequence. Use a stable service name such as db-writer.example.invalid only in documentation; replace it
with an approved zone and authority in a reviewed runtime configuration.
The component guides are authoritative when a variable or platform detail changes. The following table gives the public baseline:
| Area | Supported/default environment | Prerequisites and boundaries |
|---|---|---|
| FreeIPA bootstrap | RHEL, Rocky, AlmaLinux, CentOS Stream, or Oracle Linux 8/9/10; x86_64 or aarch64 |
Root or approved privilege, native dnf/yum, hostname/realm/time/DNS prerequisites, and a disposable supported target. Do not run the installer on a workstation. |
| MariaDB baseline | Ubuntu 24.04/noble by default; MariaDB 11.8 release series by default | ansible-core, ansible.mariadb, ansible.posix, target-side PyMySQL, python3-debian, and ACL support. Root/database secrets and certificates come from external workflows. |
| MariaDB replication | MariaDB 11.x or 12.x | Controller virtual environment, ansible.mariadb 6.x or newer, target-side PyMySQL, a reachable TCP primary, unique server IDs, binary logging, and a consistent preloaded copy with GTID or position metadata. |
| MaxScale | Debian family; Ubuntu jammy or noble defaults; 24.02-oriented configuration |
An installed or explicitly managed MaxScale package, external account/TLS material, and reviewed MariaDB terms. Repository/package/service management is opt-in. |
| Keepalived | A target with the distribution Keepalived package and validation binary | Explicit interface, peers, VRID, priorities, VIPs, and separately managed health programs. Existing deployments are protected by default. |
| DNS update | Any supported Ansible target with dig; community.general 13.0.0 |
Target-side dnspython; GSS-TSIG additionally needs kinit, Kerberos, and gssapi; TSIG keys or Kerberos credentials must be supplied at runtime. |
| CI and local validation | Ubuntu 24.04 runner, Python 3.13 | Pinned tools in requirements-ci.txt and collections in ansible/requirements.yml. Python 3.14 may trigger the documented local Ansible RPC issue. |
Use a supported Python 3.13 interpreter for local validation, matching CI. Keep the virtual environment and Ansible collections outside source control:
python3.13 -m venv .venv
source .venv/bin/activate
python -m pip install --requirement requirements-ci.txt
ansible-galaxy collection install \
--requirements-file ansible/requirements.yml \
--collections-path "$PWD/collections"The pinned collection set includes ansible.mariadb 6.0.2, ansible.posix 2.2.2, and community.general 13.0.0.
The DNS role may require target-side dnspython, and GSS-TSIG requires a working Kerberos client and gssapi in the
runtime environment. The roles do not vendor collections or install guessed package names by default.
The commands below are designed for inspection, parsing, and check mode. They do not provide credentials, publish DNS, configure a database topology, claim a VIP, or enable a package/service change.
git clone https://github.com/john8862/infrastructure-engineering-toolkit.git
cd infrastructure-engineering-toolkit
python3.13 -m venv .venv
source .venv/bin/activate
python -m pip install --requirement requirements-ci.txt
ansible-galaxy collection install \
--requirements-file ansible/requirements.yml \
--collections-path "$PWD/collections"Run these commands only on a disposable, supported RHEL-family target with a reviewed environment file. They are not workstation installation commands:
cd components/freeipa-bootstrap
./install.sh --version
./install.sh --check
./install.sh --dry-run
cd ../..--check performs read-only preflight and provider validation. --dry-run validates and prints planned packages,
files, services, DNS operations, firewall behaviour, and FreeIPA mode. A normal run remains outside this Quick Start.
Set paths to the checked-out role and collection directories:
export ANSIBLE_ROLES_PATH="$PWD/ansible/roles"
export ANSIBLE_COLLECTIONS_PATH="$PWD/collections"
export ANSIBLE_LOCAL_TEMP="/tmp/ietk-ansible-tmp"
mkdir -p "$ANSIBLE_LOCAL_TEMP"The DNS and MaxScale fixtures use local execution and safe documentation values:
ansible-playbook --syntax-check \
-i localhost, -c local examples/dns-update/site.yml
ansible-playbook --check --diff \
-i localhost, -c local examples/dns-update/site.yml
ansible-playbook --syntax-check \
-i examples/maxscale-ha/inventory/hosts.yml examples/maxscale-ha/site.yml
ansible-playbook --check --diff \
-i examples/maxscale-ha/inventory/hosts.yml examples/maxscale-ha/site.yml
ansible-playbook --syntax-check \
-i examples/keepalived/inventory.yml examples/keepalived/playbook.ymlThe MariaDB inventories contain RFC documentation addresses and are not reachable targets. Use syntax checks against
those files, and use --check --diff only with a separately reviewed local or disposable inventory:
ansible-playbook --syntax-check \
-i examples/mariadb/inventory.example.yml examples/mariadb/site.yml
ansible-playbook --syntax-check \
-i examples/mariadb-replication/inventory.yml \
examples/mariadb-replication/playbook.ymlpython tests/dns_update/test_contract.py
python tests/mariadb/test_contract.py
python tests/mariadb_replication/test_contract.py
bash tests/freeipa-bootstrap/test.sh
bash tests/maxscale/test_static.sh
sh tests/keepalived/test_syntax.sh
pymarkdown scan --recurse --respect-gitignore .
git diff --checkThese commands validate source contracts and fixtures. They do not prove that a target's package repository, DNS authority, Kerberos realm, database state, proxy health, or VRRP network will behave as expected.
components/freeipa-bootstrap/ FreeIPA Bash bootstrap and DNS helpers
ansible/roles/ Independent Ansible roles
dns_update/ Explicit A/PTR inspection and reconciliation
keepalived/ Generic VRRP configuration
mariadb/ Standalone MariaDB baseline
mariadb_replication/ Standard asynchronous replication
maxscale/ Bounded MaxScale configuration core
examples/ Public-safe inventories and localhost fixtures
tests/ Contract, syntax, and static checks
docs/ Architecture, operations, CI, release, and articles
.github/workflows/ci.yml Read-only quality gates on develop/main
.github/workflows/release-please.yml Main-branch release preparation/publication
ansible/requirements.yml Pinned Ansible collections
requirements-ci.txt Pinned Python validation tools
version.txt Root semantic-version bookkeeping
CHANGELOG.md Release Please managed changelog
CONTRIBUTING.md Contribution and Conventional Commit guidance
LICENSE MIT licence for original repository material
The directory layout reflects independent responsibilities. A caller can use a role README and example without adopting an unrelated role. Collections are installed into an ignored path rather than committed.
The quality-gates workflow runs on pull requests targeting develop or main, and on
pushes to both branches, with read-only permissions. Normal changes are integrated through develop; a reviewed
develop to main pull request is used for release promotion. It does not connect to live infrastructure or require
deployment credentials.
| Gate | What it covers | Local entry point |
|---|---|---|
| Shell | bash -n over shell files and FreeIPA contracts |
bash tests/freeipa-bootstrap/test.sh plus the component shell syntax command in docs/CI.md |
| Python contracts | DNS, MariaDB, and MariaDB replication dependency-free checks on Python 3.13 | python tests/dns_update/test_contract.py, python tests/mariadb/test_contract.py, and python tests/mariadb_replication/test_contract.py |
| Ansible | Pinned collections, ansible-lint --offline --profile basic, YAML lint, and fixture syntax |
ansible-lint --offline --profile basic ansible/roles; see docs/CI.md |
| Fixtures | DNS, MariaDB, replication, MaxScale, and Keepalived parse/render checks | Commands in Safe Quick Start |
| Markdown and Git hygiene | Recursive PyMarkdown scan and whitespace validation | pymarkdown scan --recurse --respect-gitignore . and git diff --check |
CI installs the exact versions from requirements-ci.txt and ansible/requirements.yml
into temporary runner paths. The require-final-union.sh guard confirms that all public component paths are present before
the quality gates report a complete repository. The exact check contexts and the develop/main freshness difference
are documented in docs/CI.md. The workflow intentionally does not use a dependency cache.
The repository uses a small promotion hierarchy that keeps day-to-day work open to contributors while giving the stable branch a stronger release gate:
fork or topic branch -> develop -> main
- Create ordinary
feature/,fix/,bugfix/,chore/,docs/,ci/,test/, orrefactor/branches from the latestdevelop. - Open normal pull requests from a topic branch or fork against
develop. - Require the four Quality Gates, resolved conversations, and pull-request
integration; force-push and branch deletion are blocked on
develop. - Keep
developdeliberately non-strict about branch freshness and non-linear in its history. This reduces unnecessary rebase churn while the integration branch changes quickly. Squash is still preferred for normal topic merges so each change remains easy to audit. - External contributors do not need push access: a fork can submit a pull
request to
develop, and the maintainer reviews and integrates it.
The owner can merge a validated pull request without a second GitHub account. Human review is encouraged for external contributions, but approvals, Code Owner review, approval of the most recent push, merge queues, signed commits, and deployment approvals are not mandatory controls in this solo-maintainer repository.
mainis the stable branch and the only branch watched by Release Please.- Changes normally arrive through a reviewed
developtomainpromotion pull request. The owner still merges the validated pull request; no second human approval is required. - The same four Quality Gates are required, but
mainadditionally requires the branch to be up to date before merge and keeps a linear history. Use squash or rebase for a clean promotion history. - Pull requests and resolved conversations are required; force-push and branch deletion are blocked. Direct pushes are not the normal workflow.
The repository owner/admin retains a break-glass bypass for recovery only. It must not be used as a substitute for a pull request, green checks, or normal review. Never reset or force-push protected branches.
Because a squash promotion can make the commit graphs of develop and main
diverge, a later promotion may report that develop is behind. In that case,
use GitHub's Update branch action to merge the current main into
develop, rerun the Quality Gates, or open a small main to develop sync
pull request. Preserve both branches and their audit trail; do not rewrite
either protected branch.
An urgent hotfix starts from main and is reviewed through a focused pull
request. After it is merged, apply the equivalent fix to develop so the next
promotion does not regress the stable branch.
The repository uses Release Please to maintain one root semantic version.
The release workflow runs only after pushes to main.
version.txtand.release-please-manifest.jsonstart at0.0.0as bookkeeping, not as a claim that a0.0.0release exists.release-please-config.jsondeclares one root package and thesimplerelease type.CHANGELOG.mdis maintained from merged Conventional Commits.- Published repository tags use
v<MAJOR>.<MINOR>.<PATCH>and GitHub Release notes are derived from the same merged history. - Release automation is limited to
main; a feature branch cannot publish a tag or GitHub Release.
Use commit subjects such as feat(mariadb): ..., fix(maxscale): ..., docs(freeipa): ..., or ci: .... See the
release guide and contribution guide for the release flow and compatibility
rules. The FreeIPA bootstrap also maintains its own component configuration baseline in its component guide; that does
not replace the root release version.
Each published v<version> GitHub Release contains independent, versioned
installation assets rather than one combined toolkit archive:
| Asset family | Published files | Archive root | Intended use |
|---|---|---|---|
| Ansible roles | ansible-role-dns-update-v<version>.tar.gz, ansible-role-keepalived-v<version>.tar.gz, ansible-role-mariadb-v<version>.tar.gz, ansible-role-mariadb-replication-v<version>.tar.gz, and ansible-role-maxscale-v<version>.tar.gz |
The role name, with its own README.md and LICENSE |
Install or vendor one role without importing unrelated roles |
| FreeIPA bootstrap | freeipa-bootstrap-v<version>.tar.gz |
freeipa-bootstrap/ |
Run the public bootstrap scripts with their operational documentation and safe example templates |
| Integrity metadata | SHA256SUMS-v<version>.txt and release-manifest-v<version>.json |
N/A | Verify downloaded assets and inspect the machine-readable package inventory |
The release workflow builds these assets from the exact published tag using
the explicit allowlists in scripts/release/build-assets.py.
It rejects untracked inputs, symlinks, unsafe archive paths, writable archive
entries, and secret or internal repository material. The CI packaging contract
builds the assets twice, checks byte-for-byte reproducibility, validates the
archive boundaries, and verifies every checksum before any upload step can run.
- Keep passwords, Kerberos credentials, TSIG secrets, private keys, certificates, access tokens, and environment-specific inventories outside this repository. Use Vault, an external secret manager, or an approved PKI workflow.
- The MariaDB roles consume certificate paths and create stable service links; they do not request, renew, copy, or publish certificate material.
- The replication role expects a consistent preloaded data copy and its GTID or file/position metadata. It is not a backup/restore system and does not silently repair divergence.
- The DNS update role requires an explicit server and zone for every record. Check mode is read-only, GSS-TSIG is the secure default, TSIG is optional, and unsigned mode is test-only and explicitly disabled by default.
- The FreeIPA bootstrap redacts known credential arguments in displayed commands and protects state/log directories on the target, but the underlying installer may briefly expose password arguments in a process list.
- Keepalived does not claim a VIP or force failover to test a run. MaxScale reloads only after candidate configuration validation when service management is enabled.
- Review backup, restore, rollback, authority, and change-window requirements before applying any component to a host with real data or authoritative services.
The public examples are intentionally non-production. 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24,
2001:db8::/32, and example.invalid are documentation values only.
The public roadmap tracks work by interface and validation evidence. The current next steps are:
- validate DNS A/PTR reconciliation against a disposable authoritative service with external GSS-TSIG or TSIG credentials;
- add composition fixtures that render hand-offs without installing packages, creating accounts, claiming a VIP, or contacting an external DNS service;
- expand disposable-host coverage for supported operating systems, certificate rotation, DNS transfer paths, MariaDB 11/12 behaviour, MaxScale reload checks, and Keepalived peers; and
- strengthen upgrade, backup/restore, SOA recovery, proxy recovery, and serial VRRP maintenance guidance.
The roadmap does not promise a single end-to-end installer, automatic database promotion, application account/schema management, PKI enrolment, backup/restore orchestration, hidden DNS writes, or redistribution of MaxScale software.
🤝 Contributions are welcome when they improve reliability, clarity, or reproducibility while preserving component
boundaries. Normal development starts from the latest develop branch:
git fetch origin develop
git switch develop
git pull --ff-only origin develop
git switch -c feature/focused-scope-short-descriptionUse feature/, fix/, bugfix/, docs/, ci/, test/, refactor/, or chore/ and the form
<prefix>/<focused-scope>-<short-description>. Existing branches with a simple scope remain understandable and
compatible. Open the pull request against develop by default. A reviewed develop to main pull request is for
integration and release promotion; an emergency hotfix targeting main must state why the normal path cannot be used
and should be followed by an equivalent update to develop.
A contribution that follows this branch model, uses Conventional Commits, keeps a focused public-safe diff, documents
validation, and passes all Quality Gates is prioritised for review and integration. Priority is not automatic
acceptance: technical, security, compatibility, and maintainer review still apply. See CONTRIBUTING.md
for the complete workflow.
Before opening a pull request:
- Keep the change focused and public-safe.
- Use RFC documentation values and
*.exampleplaceholders in examples. - Document prerequisites, assumptions, validation, failure modes, and recovery boundaries.
- Run the checks relevant to the component and describe exactly what was verified.
- Use a Conventional Commit subject and explain incompatible interface changes with
BREAKING CHANGE:.
Read CONTRIBUTING.md for the complete commit and pull-request guidance. Do not add credentials,
private keys, personal information, restricted configuration, live-service data, or environment-specific hostnames.
Original automation, examples, and documentation in this repository are provided under the MIT License. The MIT licence applies to this repository's original material; it does not relicense software installed or configured by a role. FreeIPA, BIND, Webmin, Technitium DNS Server, MariaDB Server, MaxScale, Keepalived, Ansible collections, and operating-system packages retain their own licences, repository terms, trademarks, and attribution requirements.
MaxScale has a specific boundary. This repository does not redistribute MaxScale software, packages, repository metadata, vendor legal text, or credentials, and it does not relicense MaxScale. The role only renders a caller-supplied configuration model and, when explicitly enabled, integrates with the official MariaDB repository. Review the current MariaDB MaxScale licensing information and official MaxScale documentation before enabling package or repository management.
MariaDB packages are obtained from the selected official repository at deployment time rather than bundled here. Collections are installed from pinned requirement files rather than vendored. Review each vendor's current terms before using a package, repository, or integration.
- Architecture: identity and DNS and data-plane composition
- Operations: safe usage and validation and troubleshooting
- Articles: bounded FreeIPA bootstrap, MariaDB foundation, and MariaDB/MaxScale/VRRP composition
- Project operations: CI, releasing, contribution guide, and CHANGELOG
- Component details: the role and component guides linked in the catalogue