The right "fit" for deployment I think has a lot to do with the size, complexity, and operational profile of your deployment. If your app runs on a single machine and you only spin up new instances once in a while and you can actually successfully automate that entirely in shell, count your blessings and use that shell script while you can. There is value in simplicity.
At some point as your deployment architecture, cluster size, team size, number of staging/test environments, deployment frequency, etc grows, it makes sense to graduate to the next level of sophistication with something like Fabric or similar. There are both costs and advantages. The main advantages, or really the way I think of it, requirements that are really difficult to meet in a shell script, are things like remote deployment to multiple targets simultaneously, idempotent re-application of scripts to already-deployed instances. Don't get caught up in the slickness of the higher level languages (python, ruby, etc), third party modules you can use, etc. Stick to the basics. Only pay for deployment complexity you really need to meet requirements and when simple scripts work, stick with them. Case study: many pieces of Solaris exist as Korn shell scripts and have worked properly for 10+ years. A small amount of Fabric/Capistrano/Puppet/Chef/Etc orchestrating a solid set of shell scripts can handle most of the medium range of the deployment spectrum.