I provision a lot of infrastructure with Terraform, so while Hashicorp recommends using some kind of config as code tool to manage provisioning software on the infrastructure I find it much easier and less complex to use heavily restricted bash scripts that run on the infrastructure for software provisioning. I use Terraform provisioners to execute and deploy the bash scripts. To me, adding another tool (like Ansible) is adding a whole lot of eccentricity (and the need to know that tool) to an already complex topic. I try to keep the number of different tools I use to a minimum so that things are easier to understand and troubleshoot. The added benefit to bash scripts is that it tells readers exactly what was run on the command line should they need to manually replicate anything or undo it.