How I Use Ansible Tower to Automate Server Provisioning

Most of my infrastructure work eventually becomes the same repetitive question: how do we build another server without copying yesterday’s steps and hoping the result matches? I use Ansible Tower to turn those steps into repeatable, auditable playbooks that run from a shared interface.

When a new Linux host is needed, a job template collects the requested role, environment, site and network details. The Ansible code configures packages, users, SSH settings, monitoring and application dependencies. Because the plays are idempotent, rerunning a safe change is harmless rather than a fresh source of drift.

Tower adds the pieces I do not want living in a shell history: a current inventory, encrypted credential inputs, job templates, schedules, webhooks, notifications and an audit trail. These features matter on client systems where several engineers need visibility without sharing personal access details.

I still treat automation as an operating system, not a clever script. The playbook must encode a known desired state, the source of truth has to be trustworthy, and every deployment needs a recovery path. That discipline makes the tool useful long after the original deployment is forgotten.

Why I standardised on Tower

I began with plain SSH scripts, but they became hard to review as the client base grew. I now keep the logic in Ansible playbooks written in YAML. Ansible Tower’s community successor is AWX, and the commercial product is Red Hat Ansible Automation Platform; either provides the control plane I use around those roles. I can reuse them in a lab, customer datacentre and public cloud account.

Using the web interface removes ad-hoc command construction. I select a template, confirm its inputs and watch events rather than scroll through terminal windows. Inventory groups, labels and variables stay attached to the job, making the result easier to explain to a network administrator or client auditor.

Source control remains the source of truth. Tower synchronises tagged playbook revisions, records which revision ran and lets me promote a tested fork after approval. Scheduled maintenance, API calls and chat notifications can trigger the same workflow, so automation continues when I am away from the keyboard.

The provisioning flow I run

Tower turns a provisioning request into an execution plan. I connect it to the client’s ticket system through a webhook, or start the job manually during a change window. A survey asks for hostname, environment, datacentre and server role, while dynamic inventory confirms that the address and capacity are not already in use.

The main workflow provisions the VM through the approved hypervisor or cloud API, waits for SSH, applies the operating-system role and adds service configuration. Separate jobs configure monitoring, backup agents, DNS and access groups. Each stage passes explicit data onward, so a failure can resume from that step instead of repeating the whole build.

Logs are especially valuable during a handover. I export the job summary, affected hostnames and verification results into the change record, then link the relevant runbook. My templates live in SharePoint, and SharePoint site views make it easier to confirm that the current procedure is visible to the people who need it.

Inventories, credentials and safe access

I use static inventory for small, stable estates and dynamic inventory for VMware, AWS and Azure. Groups such as production, Sydney-lab and Melbourne-office carry common variables, while host records hold exceptions. Tags drive conditional roles, so a build server receives CI configuration that a database server does not.

Credentials never appear in a playbook or survey response. I store machine and vault credentials in Tower, scope them to minimum privilege and prefer short-lived cloud roles where supported. A dedicated deployment account with controlled sudo access is easier to audit than distributing an administrator’s personal SSH key.

Controller access passes through a bastion or VPN, and playbooks use become rather than assume. I run checks in check mode during reviews, enable fact caching for stable infrastructure facts and keep sensitive values in encrypted variables. Schedules use UTC, with Australian Eastern Standard or Daylight Time shown in the change ticket to avoid daylight-saving confusion.

Job templates, workflows and guardrails

Job templates are the reusable unit of my work. Each names a playbook, inventory, credential, execution environment and logging destination, while survey fields supply only the values that vary. I avoid hiding environment decisions in defaults; those belong in reviewed inventory or version-controlled group variables where another engineer can find them.

Workflows add ordering and approvals. A network check can precede hardening, an application owner can approve a production promotion, and a verification job can block the completion notification. I also use callbacks to resume a workflow after out-of-band remediation, preventing a failed host from remaining stuck in a queue.

When a client wants this capability rather than a one-off build, I cover inventory design, ownership and support boundaries as part of independent IT consulting. The handover is not merely a successful job; it is a documented way to create, change and retire jobs safely after the engagement ends.

Cloud regions and Australian operating conditions

Australian placement affects speed and governance. For workloads requiring local residency, I can target AWS’s Sydney region, ap-southeast-2, or Melbourne’s ap-southeast-4, with Azure Australia East as an alternative. Cross-region dependencies are documented, and backup copies are checked against contractual and regulatory requirements instead of assumed adequate because they sit in Australia.

Local privacy and security expectations shape the workflow. Australian Privacy Act obligations and the Notifiable Data Breaches scheme influence access controls, evidence retention and escalation, while many organisations align with the ASD Essential Eight. Tower’s audit log helps, but it complements rather than replaces application logging, encryption and sound retention policies.

Most Australian IT teams I work with are small internal groups or managed-service providers juggling client sites, so the system must be maintainable without a platform specialist on every shift. The local shorthand is familiar: run it before arvo, then chuck out the old box once the checks pass. For branches, a pfSense firewall pairing keeps the edge predictable while the central controller applies the standard baseline after WAN connectivity returns.

A practical operating checklist

Before execution, I check that the change has:

  • A unique hostname, an unused IP address, the correct subnet and verified DNS entries
  • An approved image or template, the intended operating system and the correct hardware size
  • A backup or snapshot, a tested recovery method and a named technical owner
  • An approved maintenance window, required change approval and expected verification results

After execution, I confirm that the result is operationally complete:

  • All playbooks finish successfully, with required facts, health checks and service tests recorded
  • Monitoring, backup and security agents are active, and their first data points look normal
  • Temporary credentials are revoked, vault access is removed and rotation tasks are scheduled
  • Inventory and the configuration record match reality, with any exceptions documented for the owner

Neither checklist replaces the playbooks. They catch missing context and missing evidence, which are common causes of failed handoffs and lengthy recovery.

Make automation part of daily work

The platform stays useful when the runbooks change with the estate. Every template has an owner, every credential has a review date, and every production workflow produces evidence someone can inspect months later. I also remove job templates that refer to retired clouds, old networks or dependencies nobody maintains.

Changes are made in version control and tested against a representative host. A check-mode run can expose an idempotency problem before it touches production, and a test inventory can prove that a new region or server role still receives the correct baseline. The automation then remains explainable rather than becoming an opaque internal process.

Start with one server build that repeats each month, turn its manual steps into a reviewed play, and run the first job in check mode with a colleague watching the output. Once verification is clean, enable the same workflow for the next host and record the result in the change log.

Experience

Information Technology Consulting

Independent Practice

Provides IT consulting services focused on infrastructure planning, cloud migration strategy, and systems architecture. Engagements draw on years of hands-on sysadmin and development experience across Linux, Windows, and hybrid environments.

K9 Search & Rescue Volunteer

Ongoing

Active participant in K9 Search & Rescue operations, combining technical logistics skills with field support for canine search teams.

Karl Katzke's Blog

October 2006 – May 2014

Published a long-running personal technology blog covering cloud vs. in-house infrastructure, F# and Mono on OSX, hardware vendor critiques, RAID card performance analysis, and sysadmin storytelling. Notable posts include "When Sysadmins Ruled the Earth" (May 15, 2014) and "Getting Started with F# and Mono on OSX" (December 22, 2012).

Credentials

A small badge icon with a shield shape in muted blue tones on a light background

Systems Administration

Deep experience with Linux (RHEL, SLES, CentOS), high-availability clusters, and STONITH configurations.

A small badge icon with a gear shape in muted blue tones on a light background

Cloud Infrastructure

Practical knowledge of AWS EC2, reserved instances, and cost analysis for cloud vs. on-premises deployments.

A small badge icon with a code symbol in muted blue tones on a light background

Development

Proficient in F#, PHP (Symfony), and cross-platform tooling including Mono and MonoDevelop on OSX.

Studies

F# & Functional Programming

Self-directed, 2012

Explored strongly typed functional programming with F# on OSX using the Mono runtime. Published a detailed getting-started guide covering toolchain setup and cross-platform game development research.

High-Availability & Cluster Management

Professional Development, 2009

Configured and documented crm_mon email alerting for STONITH events on SLES11-HAE clusters, integrating with Nagios monitoring for production environments.

Hardware & Storage Performance

Ongoing

Conducted hands-on benchmarking of SATA/SAS RAID controllers including HighPoint RocketRaid 2740 and LSI/SuperMicro AOC-USASLP2-H8iR, comparing against software RAID configurations.

Skills

A small icon representing a server with clean geometric lines in slate blue

Linux Administration

RHEL, SLES, CentOS — package management, kernel tuning, HA clustering, and monitoring integration.

A small icon representing a cloud shape with clean geometric lines in slate blue

Cloud Architecture

AWS EC2, reserved-instance planning, cost modeling, and hybrid infrastructure strategy.

A small icon representing code brackets with clean geometric lines in slate blue

F# & .NET/Mono

Functional programming on OSX, MonoDevelop toolchain, and cross-platform game-dev exploration.

A small icon representing a database cylinder with clean geometric lines in slate blue

PHP & Symfony

Web application development with the Symfony framework and the broader PHP ecosystem.

A small icon representing a storage drive with clean geometric lines in slate blue

Storage & RAID

SATA/SAS controller evaluation, md RAID configuration, and performance benchmarking.

A small icon representing a shield with clean geometric lines in slate blue

High Availability

Pacemaker, STONITH, crm_mon alerting, and Nagios integration for production cluster monitoring.