Unless they changed something significant since I used it last, the puppet language is Ruby. They didn't get rid of loops, they used functional iteration (recursion) so you don't have side effects; it's declarative. Ansible uses YAML to do the same, and it's really the only way I'm aware to get idempotent results.
Your last sentence is true only for the most trivial of deployments, at which point, why are you using deployment automation in the first place, because it's a huge tech cost to invest in. If your deployments are that simple, why ass complexity by using a deployment automation and not just do a bin dump?
Your last sentence is true only for the most trivial of deployments, at which point, why are you using deployment automation in the first place, because it's a huge tech cost to invest in. If your deployments are that simple, why ass complexity by using a deployment automation and not just do a bin dump?