I definitely have hit a few pain-points but I share your view. JSON/YAML are too primitive (and YAML's treacherous magic behaviours are downright hazardous) but a general-purpose programming language gives a lot of room to make hard-to-understand or non-deterministic code.
I've gotten a ton of value out of Fabric (this is in no way a criticism of Jeff's great work) but I've seen multiple projects where people took at advantage of everything they could do in Python and made a deployment system which is as much of a project to maintain as the code it deployed. There are only so many teams disciplined enough to avoid that and I think the declarative approach avoids many of those pitfalls, critically dependent on providing a sufficiently rich set of abstractions.