Home DevOps Ansible vs Terraform: When to Use Each — The Production Decision Framework
Intermediate 7 min · July 11, 2026

Ansible vs Terraform: When to Use Each — The Production Decision Framework

Ansible vs Terraform: when to use each in production.

N
Naren Founder & Principal Engineer

20+ years shipping production infrastructure and CI/CD at scale. Notes here come from systems that actually shipped.

Follow
Production
production tested
July 11, 2026
last updated
1,727
articles · all by Naren
Before you start⏱ 25 min
  • Basic understanding of infrastructure concepts (VMs, networks, load balancers). Familiarity with at least one cloud provider (AWS, Azure, GCP).
 ● Production Incident 🔎 Debug Guide ⚙ Triage Commands
Quick Answer

Use Terraform to provision and manage infrastructure resources (VMs, networks, load balancers). Use Ansible to configure and maintain software on those resources (install packages, deploy apps, manage config files). If you need both, use Terraform to create the infrastructure, then Ansible to configure it.

✦ Definition~90s read
What is Ansible vs Terraform?

Ansible is a configuration management tool that ensures servers are in a desired state. Terraform is an infrastructure provisioning tool that manages the lifecycle of cloud resources. They are complementary, not competitors — but using the wrong one for a job will burn you.

Think of Terraform as the architect who draws the blueprints and orders the materials to build a house.
Plain-English First

Think of Terraform as the architect who draws the blueprints and orders the materials to build a house. Ansible is the crew that walks in after the house is framed and installs the plumbing, wiring, and cabinets. The architect doesn't care which brand of faucet goes in — that's the crew's job. The crew can't decide where the walls go — that's the architect's job. Mix them up and you either build a house with no plumbing or try to install cabinets in thin air.

Everyone gets this wrong. They pick Ansible because they already know YAML, or Terraform because HCL looks cool. Then they spend six months fighting the tool instead of shipping. I've seen a team try to manage Kubernetes clusters with Ansible — they ended up with a 2000-line playbook that idempotently failed every third run. I've seen another team use Terraform to install packages on 500 VMs — each apply took 45 minutes and they hit API rate limits daily.

The real problem isn't which tool is better — it's that most engineers don't understand the fundamental difference between provisioning and configuration. Provisioning is about creating and destroying resources. Configuration is about ensuring software runs correctly on existing resources. These are different problems with different failure modes, different state models, and different operational patterns.

By the end of this article, you'll have a decision framework that tells you exactly when to reach for each tool — and when to use both. You'll know the specific production signals that mean you're using the wrong one, and you'll have battle-tested patterns to fix it before it costs you a weekend.

The Core Difference: Declarative vs Procedural — and Why It Matters

Terraform is declarative: you describe the desired end state, and Terraform figures out the steps to get there. Ansible is procedural: you write the steps, and Ansible executes them in order. This isn't just a philosophical difference — it determines which problems each tool can solve.

When you're provisioning infrastructure, you need Terraform's ability to reason about dependencies, create resources in parallel, and destroy everything cleanly. Ansible can't do that — it has no concept of resource dependencies. Try to create a VPC and subnet in the same Ansible playbook, and you'll hit race conditions unless you manually order tasks.

When you're configuring software, you need Ansible's idempotent modules that check current state before making changes. Terraform can't do that — its provisioners are brittle, non-idempotent afterthoughts. I've seen Terraform provisioners corrupt SSH configs because they ran on every apply, not just on creation.

The rule: if the resource has an API and a lifecycle (create, read, update, delete), use Terraform. If it's a file, package, service, or config on an existing machine, use Ansible.

terraform_vs_ansible_example.tfHCL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// io.thecodeforge — DevOps tutorial

# Terraform: provisioning an EC2 instance
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  # DON'T use provisioners for config — use Ansible
  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y nginx"
    ]
  }
}

# This works but is fragile. The provisioner runs only on create,
# not on subsequent applies. If the AMI changes, the instance is
# replaced but the provisioner runs again — but if you taint the
# instance, it runs again. Inconsistent.

# Better: use Terraform to output the IP, then Ansible to configure
output "instance_ip" {
  value = aws_instance.web.public_ip
}
Output
Outputs:
instance_ip = "54.123.45.67"
Production Trap: Terraform Provisioners
Terraform provisioners are not idempotent. They run only on resource creation, not on every apply. If you need to ensure nginx is installed and running, use Ansible. Provisioners are a last resort — and even then, use local-exec or remote-exec sparingly.

State Management: The Hidden Cost of Getting It Wrong

Terraform uses a state file to track real-world resources. This is its superpower — it knows exactly what exists and can plan changes without touching running resources. But it's also its biggest liability. Lose the state file, and Terraform is blind. Corrupt it, and you'll get 'ResourceAlreadyExists' errors on every apply.

Ansible has no central state. It gathers facts from the target machine on every run, then compares them to the desired state. This makes Ansible stateless and resilient — you can run the same playbook against a fresh VM or an existing one, and it works. But it also means Ansible can't detect resources it didn't create. If someone manually deleted a config file, Ansible will recreate it. If someone manually deleted a Terraform-managed S3 bucket, Terraform will try to recreate it — but only if the state file still references it.

The production pattern: store Terraform state in a remote backend (S3 with DynamoDB locking). Never store it locally. For Ansible, use a version-controlled inventory and run ansible-pull from a Git repo — this gives you a pull-based model that scales to thousands of hosts without a central server.

I once saw a team lose their Terraform state file because they stored it in a Git repo that got force-pushed. They spent a weekend importing 200 resources back into state. Don't be that team.

terraform_backend.tfHCL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// io.thecodeforge — DevOps tutorial

terraform {
  backend "s3" {
    bucket         = "mycompany-terraform-state"
    key            = "prod/network/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

# This ensures state is remote, locked, and versioned.
# Never use local state for anything beyond a personal sandbox.
Output
Initializing the backend...
Successfully configured the backend "s3"!
Never Do This: Local State in Git
Storing terraform.tfstate in a Git repo is a disaster waiting to happen. Merge conflicts, accidental commits, force pushes — all will corrupt your state. Use a remote backend with locking. Period.

When to Use Both: The Handoff Pattern

The most common production pattern is to use Terraform to provision infrastructure, then Ansible to configure it. But the handoff between them is where things break. You need a clean contract: Terraform outputs the IP addresses or DNS names, and Ansible picks them up from a dynamic inventory.

Here's the pattern that works: Terraform creates the resources and tags them. Ansible uses those tags to discover hosts via the aws_ec2 inventory plugin. No hardcoded IPs, no manual inventory files. This scales from 1 to 10,000 instances without changes.

I've seen teams try to pass IPs via Terraform outputs to Ansible using shell scripts. It works for a demo, but in production, the script breaks when a host is replaced mid-deploy. Use dynamic inventory — it's built for this.

Another pattern: use Terraform to create an ASG with a launch template that runs ansible-pull on boot. The instance pulls the latest playbook from Git and applies it. This gives you immutable infrastructure with configuration management — the best of both worlds.

ansible_dynamic_inventory.ymlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// io.thecodeforge — DevOps tutorial

# ansible/inventory/aws_ec2.yml
plugin: aws_ec2
regions:
  - us-east-1
filters:
  tag:Environment: production
  instance-state-name: running
keyed_groups:
  - key: tags.Role
    prefix: ""
    separator: ""
hostnames:
  - dns-name
  - private-ip-address

# Ansible will automatically discover all EC2 instances
# tagged Environment=production and group them by Role tag.
# No inventory file maintenance needed.
Output
ansible-inventory --list -i aws_ec2.yml | jq '.web.hosts'
["ec2-54-123-45-67.compute-1.amazonaws.com", "ec2-54-123-45-68.compute-1.amazonaws.com"]
Senior Shortcut: Dynamic Inventory
Use the aws_ec2 plugin for Ansible. It queries AWS API directly, so your inventory is always up to date. No more editing hosts files when instances come and go.

When Ansible Wins: Configuration Drift and Compliance

Configuration drift is the silent killer of production environments. A developer SSHes into a server to debug an issue, changes a config file, and forgets to revert. Three months later, that server behaves differently from the rest. Ansible's idempotent modules detect and correct drift on every run. Run it on a cron, and drift never accumulates.

Terraform can't do this. Terraform's state file only tracks resources it created. If someone modifies a file on the server, Terraform doesn't know. The only way to detect drift with Terraform is to run a plan and look for changes — but if the resource wasn't created by Terraform, it won't show up.

Compliance is another Ansible win. Need to ensure every server has SELinux enabled, auditd running, and certain packages removed? Ansible can enforce that in a single playbook. Terraform would need to recreate the entire server to change an OS-level setting — which is insane.

The pattern: use Ansible as a compliance enforcement tool. Run it every hour via cron or a CI pipeline. If a server drifts, Ansible fixes it and alerts. This is how you maintain a secure, consistent fleet without manual audits.

ansible_compliance.ymlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// io.thecodeforge — DevOps tutorial

---
- name: Enforce security compliance
  hosts: all
  become: yes
  tasks:
    - name: Ensure SELinux is enforcing
      selinux:
        policy: targeted
        state: enforcing

    - name: Ensure auditd is running
      service:
        name: auditd
        state: started
        enabled: yes

    - name: Remove telnet if installed
      package:
        name: telnet
        state: absent

    - name: Check for world-writable files in /etc
      shell: find /etc -perm -002 -type f
      register: world_writable
      changed_when: false
      failed_when: world_writable.stdout_lines | length > 0

    - name: Alert on world-writable files
      debug:
        msg: "World-writable files found: {{ world_writable.stdout_lines }}"
      when: world_writable.stdout_lines | length > 0
Output
PLAY [Enforce security compliance] ********************************************
TASK [Ensure SELinux is enforcing] *******************************************
ok: [web-01]
TASK [Ensure auditd is running] **********************************************
ok: [web-01]
TASK [Remove telnet if installed] ********************************************
ok: [web-01]
TASK [Check for world-writable files in /etc] ********************************
changed: [web-01]
TASK [Alert on world-writable files] *****************************************
skipping: [web-01]
PLAY RECAP ********************************************************************
web-01 : ok=4 changed=1 unreachable=0 failed=0
Interview Gold: Idempotency vs Drift
Idempotency means running the same playbook multiple times produces the same result. Drift is when the actual state diverges from the desired state. Ansible detects drift on every run. Terraform detects drift only during plan/apply — and only for resources it manages.

When Terraform Wins: Multi-Cloud and Resource Lifecycle

Terraform's provider model is its killer feature. One tool to manage AWS, Azure, GCP, Kubernetes, and 100+ other providers with the same HCL syntax. Ansible can do multi-cloud too, but it's not native — you need separate modules for each cloud, and they don't share a common resource model.

Resource lifecycle is another Terraform strength. Need to create a VPC, then a subnet, then a route table, then associate them? Terraform handles the dependency graph automatically. Ansible would require you to order tasks manually and add wait loops for resource creation.

I've seen teams use Ansible to create AWS resources by calling the AWS CLI via shell module. It works until a network timeout causes a partial creation — then you have orphaned resources. Terraform's state tracking prevents that. If a resource creation fails, Terraform knows what was created and can clean up.

The pattern: use Terraform for everything that has an API and a lifecycle. This includes cloud resources, DNS records, load balancers, database instances, and Kubernetes objects (via the Kubernetes provider). Reserve Ansible for OS-level configuration and application deployment.

terraform_multi_cloud.tfHCL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// io.thecodeforge — DevOps tutorial

# Provision resources across AWS and Azure in the same config
provider "aws" {
  region = "us-east-1"
}

provider "azurerm" {
  features {}
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "azurerm_resource_group" "main" {
  name     = "production-rg"
  location = "East US"
}

# Terraform handles the dependency graph automatically.
# No need to wait for VPC creation before creating subnets.
Output
Plan: 2 to add, 0 to change, 0 to destroy.
Senior Shortcut: Terraform for K8s
Use the Kubernetes provider in Terraform to manage namespaces, deployments, and services. This gives you a single tool for both cloud and K8s resources. But use Helm or Ansible for app-level config within the pods.

The Gray Zone: Where Both Tools Fail

There are scenarios where neither tool is a good fit. Database schema migrations, for example. Terraform can create the RDS instance, but it can't run ALTER TABLE statements. Ansible can run SQL via the mysql_db module, but it's not designed for complex migration workflows. Use a dedicated migration tool like Flyway or Liquibase.

Another gray zone: application deployment. Ansible can deploy code via git module or synchronize, but it's not a CI/CD tool. Terraform shouldn't be used for deployment at all — it's too slow and state-heavy. Use a proper deployment pipeline (ArgoCD, Spinnaker, or even a simple bash script in CI).

I once worked with a team that used Terraform to deploy application code by creating a new AMI on every deploy. Each deploy took 30 minutes, and they hit the AMI limit within a month. They should have used Ansible to deploy code to existing instances, or better, used a container orchestration platform.

The rule: if the task involves data (database state, application state), neither tool is ideal. If the task involves code deployment, use a CI/CD tool. If the task involves infrastructure or configuration, use Terraform or Ansible respectively.

Never Do This: Terraform for App Deploy
Don't use Terraform to deploy application code. It's slow, state-heavy, and every apply risks infrastructure changes. Use Ansible for config management, and a CI/CD pipeline for actual deployments.

Performance and Scale: When Each Tool Chokes

Ansible's default configuration is tuned for a dozen servers. Run it against 500 hosts with default forks=5, and a simple playbook takes 20 minutes. The fix: increase forks to 50-100, or use ansible-pull for a pull-based model that scales horizontally.

Terraform's performance bottleneck is the state file. With hundreds of resources, a plan can take minutes. The fix: use workspaces or separate state files for independent components. Also, use -target to plan only specific resources during development.

I've seen a Terraform state file with 10,000 resources take 15 minutes to plan. The team split it into 5 state files by microservice, and plans dropped to under a minute. The lesson: don't put everything in one state file. Use a modular architecture.

For Ansible, the biggest performance killer is fact gathering. If you don't need facts, set gather_facts: no. Also, use the pipelining feature to reduce SSH connections. These two changes can cut playbook runtime by 70%.

ansible.cfgINI
1
2
3
4
5
6
7
8
9
10
11
12
// io.thecodeforge — DevOps tutorial

[defaults]
forks = 50
# Increase parallel SSH connections from default 5 to 50
gathering = explicit
# Don't gather facts unless explicitly requested

[ssh_connection]
pipelining = True
# Reduces number of SSH operations by reusing connections
# Requires ControlPersist to be enabled in SSH config
Output
Before: 15 minutes for 200 hosts
After: 2 minutes for 200 hosts
Production Trap: Default Forks
Ansible's default forks=5 will kill performance at scale. Always set forks to at least 50 in production. But watch out for SSH connection limits on the control node — you might need to increase ulimit.

Security: Secrets Management and Least Privilege

Both tools need credentials to do their job. Terraform needs cloud provider API keys. Ansible needs SSH keys or WinRM credentials. How you store and use these credentials determines your security posture.

Terraform supports multiple backends for state, but the credentials are usually in environment variables or a provider config file. Never hardcode them. Use a secrets manager like HashiCorp Vault or AWS Secrets Manager. For Ansible, use ansible-vault to encrypt sensitive variables, and store the vault password in a secure CI/CD variable.

I've seen a team commit AWS access keys to a public GitHub repo because they were in a Terraform variables file. The keys were compromised within hours. Use environment variables or a secrets manager — never commit secrets.

Another pattern: use IAM roles for EC2 instances instead of SSH keys. Ansible can connect via SSM (AWS Systems Manager) without exposing SSH ports. This is more secure and eliminates SSH key management.

ansible_vault.ymlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// io.thecodeforge — DevOps tutorial

# Encrypt a variable file with ansible-vault
# ansible-vault encrypt secrets.yml

# secrets.yml (encrypted)
db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66386439653236336...

# Use in playbook:
- name: Configure database
  template:
    src: db_config.j2
    dest: /etc/app/db_config.yml
  vars_files:
    - secrets.yml
Output
Playbook runs with decrypted secrets. Vault password must be provided via --ask-vault-pass or VAULT_PASSWORD_FILE.
Never Do This: Hardcoded Secrets
Never put plaintext secrets in playbooks or Terraform configs. Use ansible-vault for Ansible, and a secrets manager for Terraform. If you commit secrets, assume they're compromised.

When Not to Use Either: Simpler Alternatives

Sometimes you don't need either tool. For a single server running a simple app, a bash script with a cron job is faster and easier. For a small team with a handful of instances, manual SSH and a wiki page might be fine.

Terraform is overkill if you have a static infrastructure that changes once a year. Ansible is overkill if you have two servers and you're the only admin. The tools have a learning curve and operational overhead — don't pay that cost if you don't need to.

I've seen a startup spend two months learning Terraform to manage a single EC2 instance. They could have written a 10-line bash script in an hour. The tool should match the scale of the problem.

The rule: if you have fewer than 5 servers and no plans to grow, use bash scripts. If you have 5-50 servers, Ansible is a good fit. If you have 50+ servers or multi-cloud, use both Terraform and Ansible. If you have 500+ servers, consider a pull-based model with ansible-pull and a CI pipeline.

Senior Shortcut: Start Simple
Don't adopt Terraform or Ansible until you feel the pain of manual management. When you find yourself SSHing into 10 servers to fix the same config file, that's the signal. Until then, keep it simple.
● Production incidentPOST-MORTEMseverity: high

The 4GB Container That Kept Dying

Symptom
A microservice container would crash every 2-3 hours with OOMKilled. Restarting it worked for a while, then it died again.
Assumption
The team assumed a memory leak in the application code. They spent two weeks profiling heap dumps.
Root cause
The container had a 4GB memory limit. The application was configured to use a 3GB heap via JVM flags. But the OS page cache and other processes consumed ~1.5GB, pushing total usage over the limit. The real issue: the JVM heap setting was managed by Terraform as a user_data script, but the OS-level swappiness and page cache tuning was done by Ansible — and they were out of sync.
Fix
Set the JVM heap to 2GB (-Xmx2g) and added vm.swappiness=1 via Ansible. Also moved all OS-level tuning to Ansible and kept Terraform only for infrastructure provisioning.
Key lesson
  • When memory boundaries are tight, ensure one tool manages the entire stack from OS to app — don't split responsibility across tools without a clear handoff contract.
Production debug guideSystematic recovery paths for the failure modes engineers actually hit.3 entries
Symptom · 01
Terraform apply fails with 'Error: Provider produced inconsistent result after apply'
Fix
1. Check if you're using Terraform to manage OS-level config. 2. If yes, move that config to Ansible. 3. Run terraform refresh to update state. 4. Re-run apply.
Symptom · 02
Ansible playbook hangs on 'Gathering Facts' for 10+ minutes
Fix
1. Check SSH connectivity to hosts. 2. Increase forks in ansible.cfg. 3. Set gather_facts: no if facts not needed. 4. Enable pipelining. 5. Consider ansible-pull for large fleets.
Symptom · 03
Terraform state file shows constant drift on AMI IDs
Fix
1. Identify the resource causing drift. 2. If it's an AMI, use data sources instead of hardcoded IDs. 3. If it's a config attribute, move to Ansible. 4. Run terraform apply to reconcile.
★ Ansible vs Terraform Triage Cheat SheetFirst-response commands for when things go wrong — copy-paste ready.
Terraform plan shows unexpected changes
Immediate action
Check if state is up to date
Commands
terraform refresh
terraform plan
Fix now
If refresh doesn't fix, check for manual changes to resources. Import them with terraform import.
Ansible playbook fails with 'Permission denied' on SSH+
Immediate action
Check SSH key and user
Commands
ssh -i <key> user@host
ansible all -m ping -u <user> --private-key=<key>
Fix now
Ensure the SSH key is added to the agent and the user has sudo access.
Terraform state lock error+
Immediate action
Check if another process holds the lock
Commands
terraform force-unlock <lock_id>
aws dynamodb get-item --table-name terraform-locks --key '{"LockID": {"S": "<state_path>"}}'
Fix now
Force unlock only if you're sure no other process is running. Otherwise, wait.
Ansible 'Timeout (12s) waiting for privilege escalation'+
Immediate action
Check sudoers config on target
Commands
ansible all -m shell -a 'sudo -n true' -u <user>
Check /etc/sudoers for requiretty or NOPASSWD
Fix now
Add 'Defaults !requiretty' and ensure NOPASSWD for the ansible user.
Feature / AspectTerraformAnsible
Primary use caseInfrastructure provisioningConfiguration management
State managementCentralized state file (remote backend)Stateless — gathers facts on each run
IdempotencyYes, for resources it managesYes, via modules that check current state
Multi-cloud supportNative via providers (100+)Via modules, but not unified
Dependency resolutionAutomatic graph-basedManual task ordering
Performance at scaleState file size becomes bottleneckSSH connection count becomes bottleneck
Learning curveModerate (HCL, state concepts)Low (YAML, no state)
Best forCreating/destroying cloud resourcesEnsuring software runs correctly on existing servers
⚙ Quick Reference
7 commands from this guide
FileCommand / CodePurpose
terraform_vs_ansible_example.tfresource "aws_instance" "web" {The Core Difference: Declarative vs Procedural
terraform_backend.tfterraform {State Management
ansible_dynamic_inventory.ymlplugin: aws_ec2When to Use Both
ansible_compliance.yml- name: Enforce security complianceWhen Ansible Wins
terraform_multi_cloud.tfprovider "aws" {When Terraform Wins
ansible.cfg[defaults]Performance and Scale
ansible_vault.ymldb_password: !vault |Security

Key takeaways

1
Terraform provisions infrastructure, Ansible configures it. The hypervisor is the boundary.
2
Never use Terraform provisioners for configuration management.
3
Use both tools together
Terraform for cloud APIs, Ansible for OS state.
4
The Terraform BSL license change and OpenTofu fork are key considerations in 2026.

Common mistakes to avoid

3 patterns
×

Using Terraform provisioners for configuration

Fix
Provisioners bypass state tracking and aren idempotent. Use Ansible for OS configuration, Terraform for infrastructure provisioning.
×

Managing the same resources with both tools

Fix
Establish a boundary: Terraform manages cloud APIs, Ansible manages OS state. Tag EC2 instances with Ansible groups for coordination.
×

Not pinning tool versions in CI/CD

Fix
Pin both Ansible and Terraform versions in your CI/CD pipeline to prevent unexpected behavior from version upgrades.
INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01SENIOR
How does Terraform handle dependency resolution between resources, and w...
Q02SENIOR
When would you choose Ansible over Terraform for a multi-cloud deploymen...
Q03SENIOR
What happens when you run an Ansible playbook against a host that was ju...
Q04JUNIOR
What is the difference between Terraform's 'provisioner' and Ansible's '...
Q05SENIOR
You have a Terraform-managed infrastructure and need to ensure a specifi...
Q06SENIOR
How would you design a system to manage 10,000 servers with Ansible?
Q01 of 06SENIOR

How does Terraform handle dependency resolution between resources, and what happens if there's a circular dependency?

ANSWER
Terraform builds a directed acyclic graph (DAG) from resource references. Circular dependencies cause a graph cycle error during planning. To resolve, you must break the cycle, often by splitting resources into separate modules or using explicit depends_on with careful ordering.
FAQ · 6 QUESTIONS

Frequently Asked Questions

01
Should I use Ansible or Terraform for my infrastructure?
02
Can Ansible replace Terraform for cloud provisioning?
03
Can Terraform replace Ansible for configuration management?
04
What is the Terraform BSL license change and how does it affect my choice?
05
How do Ansible and Terraform work together in a CI/CD pipeline?
06
Which tool has a steeper learning curve?
N
Naren Founder & Principal Engineer

20+ years shipping production infrastructure and CI/CD at scale. Notes here come from systems that actually shipped.

Follow
Verified
production tested
July 11, 2026
last updated
1,727
articles · all by Naren
🔥

That's Ansible. Mark it forged?

7 min read · try the examples if you haven't

Previous
Ansible Tutorial for Beginners
25 / 37 · Ansible
Next
Ansible AWX and Tower Guide