Use both. If it talks ssh, Ansible. If it talks http, Terraform. I use Ansible to define what goes into Packer images. I use Terraform to deploy those images. Then I use Ansible again to flip flags or run migrations.
You can use depends_on to wait for a resource in terraform. In the last year there has been at least one occasion in which a new AWS resource was supported in Terraform before it was supported in CloudFormation.