Ansible-core 2.19
> A practical, field-tested guide to what changed, what’s still broken, and how to upgrade safely (Oct 26, 2025)
Ansible-core 2.19 is the biggest plumbing change since collections. It delivered the Data Tagging overhaul and a stricter templating engine, which in turn surfaced long-hidden assumptions in playbooks, roles, and collections—especially in networking. This guide explains the why, catalogs today’s known issues, and gives you copy-pasteable mitigations and an upgrade plan that won’t melt your pipelines.
---
TL;DR (for busy humans)
* 2.19 tightened templating & typing (“tagged” values) and changed parts of module argument loading. That exposed brittle Jinja/JMESPath patterns and broke some “direct execution” flows used by network content. ([Ansible Documentation][1])
* ansible.netcommon initially didn’t mesh with 2.19’s new behavior; vendor collections relying on it (Arista, Cisco, Juniper, etc.) were impacted until follow-up fixes landed. Do not upgrade core alone—move core + netcommon + vendor collections together after testing. ([Ansible][2])
* If you need a stable baseline today:
``bash
pip install "ansible-core<2.19" # or
pip install "ansible~=11"
`
Then ready your codebase for 2.19 using the steps below. (Some vendor ecosystems—e.g., arista.avd 5.x—explicitly support up to 2.18.x.) ([avd.arista.com][3])
---
What actually changed (and why it matters)
1) Data Tagging & stricter templating
Values flowing through Jinja are now explicitly typed/tagged rather than always coerced to strings. That’s more correct and safer, but it breaks patterns that counted on implicit coercion—especially JMESPath via community.general.json_query, which expects raw arrays/strings/numbers. Typical symptoms:
* _AnsibleTaggedStr or “invalid type for value” JMESPath errors
* Loop expressions failing unless the input is a concrete list
👉 Action: Prefer pure Jinja (selectattr, map, list, sort) or coerce to plain JSON before json_query. See recipes below. ([Ansible Documentation][1])
2) Network content & “direct execution”
Core 2.19 refactors around how action modules patch/parse arguments. ansible.netcommon had been patching internals (e.g., _load_params, sys.argv) to enable “direct execution.” 2.19 broke that path until collection/core shims arrived. 👉 Upgrade together and target a netcommon release that states 2.19 compatibility. ([Ansible][2])
---
The open 2.19 issues you should actually care about (curated)
> Source: GitHub issues filtered for is:issue state:open 2.19` (pages 1–2), captured Oct 26, 2025. Use these summaries to decide what to refactor vs. what to pin. ([GitHub][4])
Run control & UX
Ctrl+C no longer stops entire play (regression): interrupt cancels the current task but play continues. Impact: harder to abort cleanly. Mitigate:* structure plays into smaller units; abort