Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where should I be organizing host-specific files/templates?

Tags:

ansible

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

  • example.com-provision.yml
  • example.com-deploy.yml

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     # ... 
like image 368
deefour Avatar asked Sep 28 '15 19:09

deefour


People also ask

Where do I put Ansible files?

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.

What is the recommended way to set variables in the Ansible project structure in Git?

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.

What is Host_vars and Group_vars in Ansible?

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.


1 Answers

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).

like image 200
ProfHase85 Avatar answered Sep 28 '22 04:09

ProfHase85