Hmm, good point. Maybe we can actually make both of them work. For example, let Salt setup the initial state: create a UTF8 cluster, create a user, create a database based on what's in pillar. We can use a different state trees to define the database name for each machine, e.g. database_name: rapidsms_staging or something. So the fabfile can just assume the database exists and we set env.db accordingly.

Another thing to think about is whether or not we're going to have the need to manage passwords. Maybe for rabbit? Or if we change the gunicorn user to be www-data. In that case, the fabfile, during setup_server(), would only need to reset the user's password, but otherwise everything else would be managed by salt.