I'm trying to organize my playbooks according to the Directory Layout structure. The documentation doesn't seem to have a recommendation for host-specific files/templates.
I have 2 plays for a single site
These files are located in the root of my structure. The provisioning playbook simply includes other roles
--- - hosts: example.com roles: - common - application - database become: true become_method: su become_user: root
The deployment playbook doesn't include roles, but has it's own vars
and tasks
sections. I have a couple template
and copy
tasks, and am wondering what the 'best practice' is for where to put these host-specific templates/files within this directory structure.
Right now I have them at ./roles/example.com/templates/
and ./roles/example.com/files/
, but need to reference the files with their full path from my deployment playbook, like
- name: deployment | copy httpd config template: src: ./roles/example.com/templates/{{ host }}.conf.j2 # ...
instead of
- name: deployment | copy httpd config template: src: {{ host }}.conf.j2 # ...
inventory/group_vars/ is the folder where we store any Ansible variables that we want to set for each group of target computers. The group_vars/ folder has to be in the same folder that your inventory files are in, otherwise Ansible cannot find the group vars.
Variables and Vaults A best practice approach for this is to start with a group_vars/ subdirectory named after the group. Inside of this subdirectory, create two files named vars and vault . Inside of the vars file, define all of the variables needed, including any sensitive ones.
host_vars is a folder that you create and within the folder are YAML files which reference each specific device. group_vars is also a folder you create and within the folder are YAML files which reference groups of devices or all devices.
Facing the same problem the cleanest way seems for me the following structure:
In the top-level directory (same level as playbooks) I have a files
folder (and if I needed also a templates
folder). In the files
folder there is a folder for every host with it's own files where the folder's name is the same as the host name in inventory. (see the structure below: myhost1
myhost2
)
. ├── files │ ├── common │ ├── myhost1 │ ├── myhost2 | ├── inventory │ ├── group_vars │ └── host_vars ├── roles │ ├── first_role │ └── second_role └── my_playbook.yml
Now in any role you can access the files with files modules relatively:
# ./roles/first_role/main.yml - name: Copy any host based file copy: src={{ inventory_hostname }}/file1 dest= /tmp
Explanation:
The magic variable inventory_hostname
is to get the host, see here The any file
module (as for example copy
) looks up the files
directory in the respective role directory and the files
directory in the same level as the calling playbook. Of course same applies to templates (but if you have different templates for the same role you should reconsider your design)
Semantically a host specific file does not belong into a role, but somewhere outside (like host_vars
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With