I’m tipping my toe in the Ansible pool via a simple project deployment script. I have 3 environments (the usual dev, staging, production) and the deployment is exactly the same for each. In every example I’ve seen so far, the hosts
are hard coded in the playbook. What I’d like to do is create a single deploy.yml
file and specify the hosts
value when I call it. Otherwise, at least in my limited understanding so far, we’ll have to either modify the playbook every time we want to run a deployment against one of our environments.
I’ve seen something like this:
$ ansible deploy.yml -e “hosts=development”
where, in deploy.yml
, we have hosts: $hosts
, but that feels ham-fisted.
Is this the recommended/best approach? Should I be structuring things differently?
The value for hosts in the playbook can be a group of hosts (defined in your inventory).
I’d suggest setting up different inventory files for each environment then you can run
ansible-playbook -i /etc/ansible/dev-inventory deploy.yml
or
ansible-playbook -i /etc/ansible/staging-inventory deploy.yml
Jon
Okay, that makes sense. In that scenario, I assume that deploy.yml just specifies hosts: all which would pick up everything in that inventory file, right?
Thanks!
Or when things get more complicated, you can define groups like “webservers” and have playbooks apply to the relevant group.
Are you using AWS or any other cloud provider ? I’d suggest using dynamic inventory then instead as it’ll be a pain later to keep updating names / IPs / etc. etc.
https://docs.ansible.com/ansible/intro_dynamic_inventory.html
Alex