At first glance, I don't see that m4 does anything jinja2 (Ansible's templating system) doesn't do better.
Eg:
dpkg-query --show \
--showformat='${Package;6} ${Installed-Size;4}^L\n' \
m4 python2.7-minimal dash bash mksh ksh \|
sort -n -k2
dash 212
m4 382
mksh 878
ksh 3110
bash 3941
python 5456
(Not that you can avoid python-minmal on Debian - but in a chroot you might, etc).As for can and cannot do, consider this "feature" of m4:
$ cat <<eof|m4 -Dme=you -Dpredictable=surprise
me=predictable
eof
you=surprise
Again, I'm not suggesting m4+dash is a great idea vs ansible -- just clarifying a couple of things...Some good comments on both sides here:
http://www.quora.com/Python-Web-Frameworks/What-are-the-adva...
http://www.reddit.com/r/Python/comments/ktjm2/jinja2_or_mako...
Just why not use a readily available template/macro language along with shell scripts, if you've decided to use shell scripts.
I suppose you could use jinja and bash -- but why pull in two full interpreters as a dependency?