Ansible Error: 'found a duplicate dict key' — Cause, Fix, and Troubleshooting Guide
Fix Ansible's 'found a duplicate dict key' YAML error: remove the repeated mapping key, rename duplicated task keywords, or fix accidental copy-paste in vars.
- #ansible
- #troubleshooting
- #automation
- #yaml
Fixing errors like this? Get 500 free DevOps AI prompts
500 copy-paste AI prompts for the stack you actually run — one PDF, free.
Overview
YAML mappings must have unique keys. When the same key appears twice at one level, the second silently overrides the first — so Ansible’s parser raises a warning or error to stop you from losing data:
ERROR! While constructing a mapping from /etc/ansible/site.yml, line 8, column 3, found a duplicate dict key (state). Using last defined value only.
It usually surfaces after a copy-paste that repeats a keyword like state, name, when, or tags.
Symptoms
- A play fails to load (or warns) pointing at a specific duplicated key.
- A parameter you set “does not take effect” because a later duplicate wins.
- The line/column in the message lands on the second occurrence.
ansible-playbook -i inventory.ini site.yml --syntax-check
ERROR! found a duplicate dict key (tags)
Common Root Causes
1. Repeated module parameter
Copy-paste leaves two state: or mode: keys under one module.
2. Repeated task keyword
Two when: or tags: on the same task — only the last applies.
3. Duplicate key in vars/inventory
The same variable defined twice in one vars: block or group_vars file.
4. Merged blocks after refactoring
Combining two tasks and forgetting to delete an overlapping key.
How to diagnose
Let YAML tooling point at the exact line:
yamllint site.yml
site.yml
9:5 error duplication of key "tags" in mapping (key-duplicates)
Or with Python:
python3 - <<'PY'
import yaml
class Strict(yaml.SafeLoader): pass
def no_dup(loader, node, deep=False):
seen=set()
for k,_ in node.value:
key=loader.construct_object(k, deep=deep)
assert key not in seen, f"duplicate key: {key}"
seen.add(key)
return yaml.SafeLoader.construct_mapping(loader, node, deep)
Strict.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, no_dup)
yaml.load(open("site.yml"), Strict)
PY
Fixes
Remove the duplicate parameter
Wrong:
- name: Create dir
ansible.builtin.file:
path: /opt/app
state: directory
state: present # duplicate — only this wins
Right:
- name: Create dir
ansible.builtin.file:
path: /opt/app
state: directory
Merge repeated keywords intentionally
Two tags: become one list:
- name: Deploy
ansible.builtin.copy:
src: app.conf
dest: /etc/app.conf
tags:
- config
- deploy
De-duplicate vars
Combine repeated variable definitions into a single key with the intended value.
What to watch out for
- The parser keeps the last value, so a duplicate can mask a bug where the wrong value silently wins — do not just delete one at random, confirm which value is correct.
- Add
key-duplicatesto youryamllintconfig and run it in CI to catch this before a run. - Anchors/aliases and merge keys (
<<) can reintroduce a key; check merged content too.
Related
- Ansible Error: ‘Syntax Error while loading YAML’
- Ansible Error: ‘X is not a valid attribute for a Task’
- Taming ansible-lint With AI: From Warnings to Clean Runs
More Ansible prompts & error guides
Every Ansible AI prompt and troubleshooting guide, in one place.
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.