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
).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…