Lloyds Banking Group
Learning journey
$ terraform apply
ClickOps GitOps
How to reskill a traditional ClickOps Mac team into a GitOps team at enterprise scale.
1,500+ resources managed
4 months to trained
GUI = breakglass
Jamf
01 · Context

Who are we & where are we today ?

Who we are ?
Where we are today ?

Fully operational with Terraform

Every Jamf Pro change flows through a GitHub PR with no exceptions.
Over 1,500 resources under active management.
3 stage environment route to Live setup
All changes require a +1 approval from another engineer
Every change is versioned and can be rolled back
Gui access is read only, write access is restricted to break glass operations

Full mac@LBG team trained

Every Mac team member performs their day job with Terraform as the control plane.
Training artifacts released as open source
Currently up skilling our packaging and endpoint security teams.

02 · Goals

Learning outcomes & what success looked like

Learning outcomes

Collaborate

On changes together; externalise domain knowledge from people's heads into self-documenting code. Reduce single points of failure and catch mistakes before they reach production.

Fast recovery

When something goes wrong the team can revert to a known good configuration. Because mistakes are recoverable, engineers make changes they would previously have avoided or escalated.

Team confidence

To implement changes using GitOps + Terraform and perform their role effectively. Any team member can pick up any change, make it → get it reviewed → ship it.

Read a plan before you approve it

Every engineer can read a terraform plan and predict exactly what will change before approving it. Every safe apply depends on this skill.

Knowing when not to use Terraform

Recognising when breakglass GUI access is the right call, and when to stop and ask for review.

Prove what changed, when and why

On demand, when asked by stakeholders or external audit.

Every change to production goes through a pull request

Zero manual console changes. If someone asks "how did Jamf Pro get into its current state," the answer is always "check the commit history," never "ask around."

What success looked like
Success you could see

Design conversations happen in PR threads, not in chat
Juniors review senior engineers' changes
"How did it get like this?" is answered with a commit link, not a meeting

TODO: confirm which behaviours were observed
Benefits ripple outward
Individuals Would get…

New transferable skills
A safety net that makes mistakes recoverable
Reduced cognitive load (not having to make changes in different instances)

Team Would get…

No single point of failure
Same engineering practices as cloud teams and same language
Cross team awareness of changes
Failures become learning opportunities and not blame
Collaboration without stepping on one another's toes
TF modules allow for self service consumption by sister engineering teams

Org Would get…

Compliance and audit without a mad scramble
Governance without slowing delivery
Deployment guardrails that scale beyond one team

TRAINED =

An engineer counted as trained when they could take a real change from branch to production unaided.

TODO: confirm the bar the team actually used
NOT THE GOAL

Everyone becoming a Terraform expert · zero incidents · the end of Jamf GUI knowledge

TODO: confirm real non-goals
03 · Execution

How we ran it

THE SECONDMENT

One engineer, moved into the DevOps CoE

3 months
full time, on a train-the-trainer model

Not a course and not a shadowing arrangement. A posting, long enough to pair macOS and Jamf Pro domain depth with GitOps practice in the same person.

Everything on the right came out of that one decision.
01

Training materials, written together

The CoE brought the Terraform and Git content; the seconded engineer put it in Mac language and cut what did not apply.

02

Sessions designed for their medium

In-person and remote sessions planned separately rather than one deck delivered twice.

03

Hackathons and homework

In-person labs built on tasks the team already recognised, with practice set between sessions so nothing decayed in the gaps.

04

Migration waves, run by the same engineer

Training carried on past the fundamentals. Running the waves kept the reasoning behind each migration decision inside the Mac team and taught advanced Terraform on the real estate.

05

Full handover

The Mac team owned the control plane, the materials and the reasoning.

macOS and Jamf Pro context goes in
Terraform, Git and GitOps practice comes back
04 · Retrospective

What worked

Paired programming

Real-time knowledge transfer. Engineers learn faster from a peer than from documentation alone. Effective pairs that transfer knowledge well share a disciplined (one topic at a time, staged clarification, deliberately pushing context rather than only answering questions asked) approach.

Scenario-based hack labs

Interactive, visual, hands-on learning beats abstract exercises, always. This is especially true when learning git for the first time. Engineers learn the 'why' immediately and hands on helps build a mental model quicker. Learning scenarios should be tied to real life team operations. Provide sequenced learning before open-ended practice.

Ability-grouped learning cohorts

Grouping engineers at similar skill levels keeps pace right, no one gets bored or is left behind.

Safe lab environments

Ensure that you have dedicated non-prod sandboxes for engineers to experiment freely and without fear of breaking production. Do not YOLO in prod!

Secondments to DevOps teams

Team shadowing (even on other tf providers) gives real grounding and broad exposure.

Good documentation

Make use of the terraform registry for known good working examples for each resource. Read our and others open-sourced training and reference implementations for your own learning or to build your own syllabus

Patience. It takes time…..

The sheer size of conceptual surface area that needs to be covered is large.

05 · Retrospective

What didn't work

144 hours of learning, spread across six months

SHAPE IS ILLUSTRATIVE
high low CONFIDENCE MONTH 1MONTH 2MONTH 3 MONTH 4MONTH 5MONTH 6 platform not ready gap interest wanders relearning the basics again shaded bands = teaching

Mixed-ability cohorts

Pace wrong at both ends. Prior coding experience predicted success, not Jamf Pro familiarity or age.

Theory before the hands-on

No mental model formed. In one ear and out the other.

Step-by-step tutorials

Workbooks devolved into copy-paste. Completed, not retained.

Shaped like a reference manual

214,645 words of good content, written to be complete rather than to be learned from.

Gaps we could not close

Our internal developer platform was not ready and online when engineers needed it.

Interest wandered

Four weeks of content over six months. The hours were about right; the calendar was not.

Effort stayed invisible

Nothing showed who had genuinely put the hours in until after handover.

What replaced it

3,778 words: two modules and four labs, one of them deliberately broken. 57x smaller.

I understood the slides but had no idea what to actually do when I opened VS Code.
Engineer feedback
TODO: verify quote
06 · Conditions

Creating the conditions for success

THE CONDITION THAT CARRIES THE REST

Psychological safety

Teams that treat mistakes as learning, not blame, retain skills faster and ship more reliably. It is the most evidenced condition of all.

Make it explicit. Say it out loud, early, and more than once.

Don't assume it already exists because the team seems friendly.

It has to still hold the week somebody breaks something that matters.

Everything to the right depends on this being true.
01

Stakeholder buy-in first

Get non-technical stakeholders and senior leadership bought in on the priority before you start. Ours were slow to 'get it', which cost early momentum.

02

Complete pre-reqs before workshops

Engineers who skipped pre-requisite learning held back their whole cohort. Gate attendance on it, no exceptions.

03

Tight loop: learn → practice

Long gaps caused rapid knowledge loss. Keep days, not weeks, between learning something and practising it for real.

04

In-person training and pairing

Remote worked for self-paced pre-reqs, but pairing and labs were dramatically better face to face.

05

Partner with your platform-tooling owners

You'll need whoever owns Terraform and GitHub for access, guardrails and troubleshooting throughout.

06

Expect the dip

The team gets slower before it gets faster. Set that expectation up front, so early friction reads as part of the plan. TODO: how long

07 · Curriculum

Learning priorities by role

The same three roles. How far each has to stretch depends on who else is in the building.

Junior engineers

Breadth over depth
  • Environment working: editor, extensions, Terraform on PATH
  • Git basics and branching fundamentals
  • Terraform basics: read a plan and predict what it changes
  • Can they write a working PR and apply a change safely?

Engineers

Applying it daily
  • Own modules and everyday resource changes end-to-end
  • Review junior PRs; raise their own with confidence
  • Read the Jamf Pro API docs when the provider docs are ambiguous

Senior engineers

The escalation point
  • Advanced Terraform: for_each, dynamic blocks, modules
  • Release management: tagging, promotion, rollback
  • Strong Jamf Pro API understanding
  • Unsupported resource? API gap or provider gap, and is it worth raising
  • Pairs with and mentors juniors; reviews and unblocks
SMALL ORG

No DevOps function

Design, build and maintain the platform and manage the Jamf Terraform workflows

Terraform Git GitOps Jamf APIs Environment Mentoring
  • The platform is yours too: the toolchain, the runners and the state backend
  • Nobody provisions a repo for you, so the whole environment is yours to stand up and keep alive
  • Fewer people, so one person often spans all three roles at once
LARGE ORG

Specialist teams either side

Consume the platform, inside its guardrails and manage the Jamf Terraform workflows

Terraform Git GitOps Jamf APIs Environment Mentoring
  • You still own the branching strategy, the triggers into your environments, merges and releases
  • Repos come from platform templates, every PR needs a second approver, and you cannot disable Checkov or the linters
  • You still need to know how the platform is designed. But your workflow will have to conform with wider company standards
08 · Curriculum

The learning pathway that worked for us

Git, Terraform and GitOps grow together — one skill per discipline at each milestone.
STAGE →DISCIPLINE ↓
01
Oriented
▸ NEW TO CONCEPTS
02
Safe Contributor
▸ PRIOR CODER
03
Independent
 
04
Release Owner
 
05
Advanced
 
Environment
pick ide · linters · language installers · ide extensions
extensions · fmt-on-save · commit hooks · signed commits
Git
What is · clone · branch · commit · merge · push · pull
raise PR · resolve conflicts
review PRs · CODEOWNERS
tags · semantic versioning
Release please
rebase · history recovery
Terraform
What is HCL · providers · plan
tf registry
fmt · validate · apply
uses modules · data sources · state · workspaces
version pin · promote
for_each · builds modules · dynamic
GitOps
as source of truth · why
PR-driven · drift alerts
branch protection · audit
rollback · change tickets
policy-as-code · cost
KEY PRINCIPLE

Each milestone is practised for real before moving right. No skipping ahead.

09 · Curriculum
GIT TERRAFORM GITOPS ENV

The learning timeline for a typical engineer

Milestones are indicative and will vary individual to individual
engineer@your_org: ~/week-01
# stop 01 · WEEK 1
Environment & access
+ ENV   Install tools — IDE, extensions, TF on PATH
+ ENV   SSH keys set up, repo cloned, first diff read
+ GITOPS   Grasp why the repo is the single source of truth
engineer@your_org: ~/week-02
# stop 02 · WEEK 2
Git fundamentals
+ GIT   Daily basics: add · commit · status · log · diff
+ GIT   Branch, switch, merge; .gitignore for secrets
+ GIT   Read an open PR and follow the review thread
engineer@your_org: ~/week-03
# stop 03 · WEEK 3
Terraform foundations
+ TF   IaC principles and declarative config
+ TF   Providers, resources, variables and outputs
+ TF   init → fmt → validate → plan; read the plan
engineer@your_org: ~/week-06
# stop 06 · WEEK 6
The GitOps change flow
+ GITOPS   branch → PR → plan → merge → apply, end to end
+ GITOPS   No manual or GUI edits — every change via PR
+ GITOPS   Read drift alerts and know how to respond
engineer@your_org: ~/week-05
# stop 05 · WEEK 5
Branching & pull requests
+ GIT   Raise a first PR from a feature branch
+ GIT   Resolve a merge conflict with confidence
+ GIT   Give and act on a first review comment
engineer@your_org: ~/week-04
# stop 04 · WEEK 4
First plan & apply
+ TF   Run apply and destroy safely in a sandbox
+ TF   Understand state — what it is and why it matters
+ ENV   fmt-on-save and pre-commit hooks working
engineer@your_org: ~/week-07/08
# stop 07 · WEEKS 7–8
First real task (solo)
+ TF   Deliver a real non-prod change end to end, unpaired
+ TF   Own a small module: inputs, outputs, version pin
+ GITOPS   See your own change through review to apply
engineer@your_org: ~/week-09-11
# stop 08 · WEEKS 9–11
Modules, reuse & review
+ TF   count & for_each for dynamic resources
+ TF   Reusable modules with clean inputs and outputs
+ GIT   Rebase, review peers' PRs, respect CODEOWNERS
engineer@your_org: ~/week-12+
# stop 09 · WK 12 → MONTH 4
Release ownership & independence
+ GITOPS   Promote a change across dev → stage → prod
+ GITOPS   Roll back by revert & re-apply; tag releases
+ TF   Policy-as-code guardrails and cost checks on PRs
10 · Curriculum

What engineers need to learn

The full skills map for reskilling into GitOps — foundations through advanced, across the four core disciplines.

Environment

EDITOR & TERMINAL
  • VS Code / JetBrains / Neovim + terminal
  • Git ext: inline diff, blame, staging
  • Editor for commits; .editorconfig
LANGUAGE SUPPORT
  • terraform-ls: complete, hover, defs
  • Format-on-save → terraform fmt
  • YAML ext with schema validation
  • Confirm TF binary is on PATH
QUALITY GATES
  • pre-commit: fmt · tflint · secrets scan
  • tfsec / trivy security scanning
  • Go: gopls, golangci-lint (if providers)
ACCESS & FIRST COMMIT
  • SSH keys / credential helper
  • .gitignore template pre first commit

Git

FOUNDATIONS
  • Version control & the distributed model
  • Git vs GitHub / GitLab; why it matters
  • git config & init; working → staging → remote
DAILY WORKFLOW
  • add · commit · status · log · diff
  • .gitignore for artefacts, secrets, env files
  • Branch, switch, merge (ff vs no-ff)
COLLABORATION
  • clone · push · pull · fetch; SSH keys
  • Pull requests, code review, issue tracking
  • Resolve merge conflicts confidently
ADVANCED
  • Rebase vs merge; tagging & stashing
  • Revert / reset, history rewrite, recovery
  • GitHub Flow team branching strategy
  • Git 3.0: SHA-256 & reftable (late 2026)

Terraform

FOUNDATIONS
  • IaC principles & declarative config
  • Install Terraform + provider CLI / creds
DAILY WORKFLOW
  • init → fmt → validate → plan → apply → destroy
  • Providers, resources, data, variables, outputs
  • Dependency graph, version pinning, lock file
REUSABILITY & STRUCTURE
  • Variables (types, validation), locals, functions
  • count & for_each for dynamic resources
  • Reusable modules with inputs & outputs
STATE MANAGEMENT
  • Local vs remote backends; state locking
  • Drift, terraform import, state moves
COLLABORATION — HCP TERRAFORM
  • Workspaces, projects, VCS & CLI runs
  • Variable sets, dynamic creds, RBAC
  • Policy-as-code (Sentinel), drift detection
CERTIFICATION
  • Terraform Associate 004 (live Jan 2026)
  • Authoring & Operations Professional

GitOps

FOUNDATIONS
  • Git as the single source of truth
  • Desired vs live state & reconciliation
  • Principles: declarative, versioned, pulled, reconciled
DAILY WORKFLOW
  • Change flow: branch → PR → plan → merge → apply
  • Every change via PR — no manual / GUI edits
  • CI/CD pipeline: fmt → validate → plan → apply
  • Drift detection & alerts on manual change
  • Keep secrets out of code (Vault / SOPS / KMS)
COLLABORATION
  • Branch protection & required status checks
  • Multi-team PR review & CODEOWNERS
  • Audit trail: commit → author → ticket
  • Jira / ServiceNow tickets + Slack / Teams alerts
RELEASE MANAGEMENT
  • Version tagging & semantic releases
  • Environment promotion: dev → stage → prod
  • Rollback by revert & re-apply
  • Dependency & module version pinning
ADVANCED
  • Policy-as-code guardrails (OPA / Sentinel)
  • Cost estimation on PRs (Infracost)
  • Self-service via workspaces & RBAC guardrails
  • Private module registry & versioned publishing
11 · Delivery

What lands well in the room together, what lands well remotely

When delivering technical training, you should consider the following:

In the room

SHOULD BE THE DEFAULT FOR THESE SCENARIOS
  • First exposure to a conceptYou can see someone is lost before they say so. On a call they have to interrupt everyone to admit it, so they don't.
  • Debugging someone else's broken config for a new conceptSomeone is looking at your screen the second you go wrong, not ten minutes later once you have built more on top of it.
  • Pairing people up for the first timeTwo people who don't know each other won't share a keyboard honestly. That trust builds in the talk around the work, which is hard to build initially when remote.
  • Game days, hacks and scenario labsThe atmosphere does the work. Ideas bounce, everyone hears everyone, and a team comradery forms while they solve something.
  • The week someone breaks somethingOwning up is much harder to a screen. In the room everyone watches the reaction be help rather than blame, and they speak up sooner next time.

Remote

WORKS WELL FOR THESE, BUT WITH SOME CONDITIONS
  • Pre-requisite training modulesInstalling a toolchain has one right answer, so there's nothing to gain from an audience. But without a deadline it doesn't get done, and learners turning up unprepared slows the whole room down.
  • Recorded expert think-aloudA recording can be paused, rewound and watched again at 11pm, which a room cannot. What it cannot do is answer a question back.
  • Co-editing, not screen sharingIf both people can type, remote pairing holds up. If only one can, the other is watching someone work and learning very little.
  • Async PR reviewThis is how review works in the job anyway, and PRs by their nature need time for reflection and analysis.
  • Follow-up clinicsVideo drains people far faster than a room does. Keep it under an hour with a break in the middle — past that they're still on the call but not learning.
THE RULE
If the learning depends on other people, put it in the room. If it's between a learner and the material, remote is fine, often better.
Environment setup is neither — automate it.·Reference material isn't a session in its own right and should be carried out separately.
12 · Content

Match the content to the moment

The same information in the wrong form is useless. A runbook teaches nobody, and a tutorial is worthless at 3am.
“I'm new and need to learn this”
TUTORIAL

Guided, hand-held, and it has to work every time. If step four fails they conclude they can't do this. The smallest thing that gets someone to a working PR.

EXAMPLESYour first Jamf Pro policy in Terraform
Clone to merged PR, end to end
“I know this — I just need to do it”
HOW-TO · RUNBOOK

The steps and nothing else. Assumes they already understand it, so no theory, no explanation, no reassurance.

EXAMPLESAdd a new configuration profile
Promote a change dev → stage → prod
“It's broken and I need a fact now”
REFERENCE · BREAK GLASS

Scannable under pressure. A decision tree, not paragraphs — nobody reads prose at 3am. A different document from the runbook, even for the same system.

EXAMPLESRoll back a bad apply to Jamf Pro
State is locked — what to do
Who to call, what not to touch
“Why do we work this way?”
EXPLANATION

Read when they're calm, never when something is on fire. The reasoning behind the setup, and the decisions that were already taken for them.

EXAMPLESWhy multi instance management is complex
What state is, and why drift matters
“I need to practise before it's real”
PRACTICE · SCENARIO

Deliberate failure somewhere that breaking it costs nothing. The one thing no document can do for you, and the one we got right.

EXAMPLESA Jamf repo with faults planted in it
Game day: a smart group vanished
AND VARY IT
Prior knowledge is the variable that matters, not learning style. Step-by-step guidance speeds novices up and actively slows down anyone who already has the model — so the topics that matter need a guided version and a terse one.
13 · Case study

Louise's journey

TODO: 3–4 min interview with Louise
replace this placeholder with the video
“Anyone can do this.”
Starting point
No prior CLI or scripting experience. Mac support background.
Challenge
Understanding why state matters. It clicked in week 4 after a real incident.
Turning point
First solo PR merged into main — "It felt like I'd actually built something real."
Advice
"Don't skip the fundamentals. It feels slow but it saves you later."
14 · Scope

Don't forget to train your sister engineering teams aswell

The larger the organisation the larger the amount of teams that will be required to go on this journey.
SMALL ORGANISATION
MID-SIZED
VERY LARGE
Endpoint security
Device management
Jamf platform ops
App packaging
Support & escalations
The Mac teamone team, all five
Security engineering
Platform, devices & packaging
Service desk
Endpoint security team
Device management team
Platform ops team
Packaging team
Service desk
1 cohort
3 cohorts
5 cohorts
15 · Timeline

The typical learning cycle

By duration — where the weeks actually go

Pre-work

Pre-reqs: videos, reading

1 week

Foundations

Core concepts + Terraform basics

2 weeks

Git & flow

Git, branching, pull requests

2 weeks

First real

First real-world task

2 weeks

Advanced

Advanced Terraform + DevOps

3 weeks

Independence

Solo delivery, mentoring others

4 weeks
Wk 0Wk 1Wk 3Wk 5Wk 7Wk 10Wk 14
TOTAL

~14 weeks (3.5 months) for a junior with no prior GitOps/TF experience — in-person cohort, real tasks from week 3.

16 · Onboarding

Onboarding new starters without TF experience

30 first PR merged 60 first solo delivery 90 real task, no help

Artifacts package

A new-hire pack: runbook index, architecture diagram, Git conventions, PR template, 'how we work' guide. Ship it on day one — don't make them ask.

Skill-gap assessment

A 20-min async skills check before they start — Terraform basics quiz + Git scenario. Results dictate cohort placement. No assumptions.

Assigned buddy

Every new hire gets a named senior buddy for 8 weeks — a peer, not a manager, who pairs, reviews PRs, and takes the first questions.

17 · Hiring

Hiring for the new world

Skills to hunt for

  • Terraform (any provider) — concept transfer is fast
  • Git + GitHub / GitLab — daily CLI use, not just GUI
  • Any scripting — Bash, Python, Ruby — comfort in a terminal
  • CI/CD pipeline experience (GitHub Actions, Jenkins…)
  • API / REST familiarity — a great signal for IaC aptitude
  • Open-source contribution — shows self-directed learning

Market signals

  • TF skills are still emerging in the Mac/endpoint space — the pool is small
  • Postings now list Terraform as required for senior Mac/MDM roles
  • Jamf + Terraform experience commands a premium — the gap will widen
  • Consider internal promotion — train your best Mac admins rather than competing for scarce talent
  • Screen for aptitude over credentials — curiosity + scripting beats a CV match
18 · Resources

Learning materials

Start here: Deployment Theory

Terraform Registry — deploymenttheory/jamfpro

Every resource, argument and example for the provider.

registry.terraform.io/providers/deploymenttheory/jamfpro

Terraform Demo Repo

Multi-environment setup with GitLab-flow and Terraform Cloud. Best-practice structure out of the box.

github.com/deploymenttheory/terraform-demo-jamfpro-v2

Terraform Training Repo

Built for workplace engineers with zero prior knowledge of git, gitOps and terraform.

github.com/deploymenttheory/terraform-training-jamfpro
Community & official

Jamf Developer Docs — Terraform Providers

developer.jamf.com

Jamf Blog — Getting Started with IaC Workflows

jamf.com/blog/managing-jamf-terraform-gitops-workflows

MacAdmins Slack — #terraform-provider-jamfpro

macadmins.org/slack

Neil Martin — terraform-jamfpro-starter

github.com/neilmartin83/terraform-jamfpro-starter
xx · Appendix

Colour system

Brand

Mountain Meadow
#11B67A · RGB 17 182 122
CMYK 91 0 33 29
Tropical Rain Forest
#006A4D · RGB 0 106 77
CMYK 100 0 27 58
Jamf Blue
#0468F1 · RGB 4 104 241
CMYK 98 57 0 5
Black
#000000 · RGB 0 0 0
CMYK 0 0 0 100
White
#FFFFFF · RGB 255 255 255
CMYK 0 0 0 0

Accents & tints

Bright Green
#3FE0A6 · RGB 63 224 166
CMYK 72 0 26 12
Bright Blue
#2F7DF6 · RGB 47 125 246
CMYK 81 49 0 4
Light Blue
#6FB0FF · RGB 111 176 255
CMYK 56 31 0 0
Alert Red
#C0503C · RGB 192 80 60
CMYK 0 58 69 25
Greens = team & journey. Blue = Jamf platform & tooling. Red flags what didn't work.

Neutrals & surfaces

Near-Black — background
#080B0A · RGB 8 11 10 · CMYK 27 0 9 96
Card Surface
#121614 · RGB 18 22 20 · CMYK 18 0 9 91
Card Border
#26302C · RGB 38 48 44 · CMYK 21 0 8 81
Blue Surface
#0E1A2B · RGB 14 26 43 · CMYK 67 40 0 83
Blue Border
#1E4785 · RGB 30 71 133 · CMYK 77 47 0 48
Muted Text
#8A938F · RGB 138 147 143 · CMYK 6 0 3 42
Near-White Text
#F4F6F5 · RGB 244 246 245 · CMYK 1 0 0 4
← → move · N notes · F full · T theme · K knobs
Speaker notes
THEME
Brand colours are fixed by the style guide. Tints are derived.