Goal. Site-1 on server-1, site-2 on server-2.
Trellis defaults. The Trellis default is to put all sites for an environment (e.g., all sites listed in
group_vars/production/wordpress_sites.yml) on all servers listed in the hosts file (aka “inventory file”) for that environment (e.g.,
hosts/production). As discussed above, you can easily put multiple sites on a single server just by adding multiple sites to the
wordpress_sites list. If you happen to list multiple server IPs in
hosts/production, that would be a step toward setting up some kind of load-balancing, where all sites are being served from all servers (oversimplification).
Those Trellis defaults don’t accommodate the scenario you asked about: “site-1 on server-1 and site-2 on server-2”. Some customization would be required. I’ll list some options that come to mind and others can critique or expand on them. UNTESTED.
Option 1: Use a second Trellis project
Attitude: “For this project, I can’t spend much time tinkering. I’ll choose the most hassle-free approach to my goal, even if it is not particularly DRY.”
You could just leave your first Trellis project for site-1 on server-1, then create another Trellis project (separate code, etc.) for site-2 on server-2. I think that is perfectly respectable and will be reasonably easy to maintain.
Option 2: Add the two IPs to your hosts file but only deploy one site to each (bad hack)
Attitude: “I’m willing to tinker, but this time I’ll go with a shortcut instead of understanding. I’ve got a hack that appears to work and I’m unconcerned about unintended consequences that may bite me in the future.”
I discourage this approach, but it might work. You could stick with a single Trellis project but add the IPs for server-1 and server-2 to your
hosts/production and run
server.yml. That would provision the two servers so they are ready to receive a deployment of either site. Then, only deploy site-1 to server-1 and only deploy site-2 to server-2. I wouldn’t do this. I mentioned it only to provide a little more perspective on what the various hosts files and playbook files are doing.
Option 3: Use Ansible’s
Attitude: “I’m willing to tinker and I’m committed to understanding and finding an appropriate implementation for my slightly different use-case. I understand this will be more work to apply updates from the Trellis upstream to my customized fork, but I’m comfortable with having my fingers in the code.”
To achieve “site-1 on server-1 and site-2 on server-2” you need the
wordpress_sites list to differ per server/host. You can use Ansible’s
host_vars in two steps.
Step 1. Adjust
Step 2. Add a new
host_vars directory at Trellis root (e.g., next to
.yml files are copies of
wordpress_sites, each with only the site info for the given site. You could also structure it with directories per site if you want:
Once you have that set up, you don’t need to change your
ansible-playbook commands at all. Things should work as normal. You may want to edit
group_vars/production/wordpress_sites.yml with a note to yourself that
wordpress_sites values are actually being drawn from the
UNTESTED. Would love to hear if it works for you.
host_vars in option 3 above makes no distinction between environments (e.g., staging vs. production). Perhaps there’s an easy way to address this next level of complexity, but I haven’t explored it yet.