我应该在哪里组织特定于主机的 files/templates?

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

我正在尝试根据 Directory Layout 结构组织我的剧本。该文档似乎没有针对特定主机的建议 files/templates.

我在一个网站上有 2 个播放

这些文件位于我的结构的根目录中。配置剧本仅包含其他角色

---
- hosts: example.com

  roles:
    - common
    - application
    - database

  become: true
  become_method: su
  become_user: root

部署手册不包含角色,但有自己的 varstasks 部分。我有几个 templatecopy 任务,我想知道 'best practice' 是什么,用于将这些特定于主机的 templates/files 放在这个目录结构中的什么地方。

现在我在 ./roles/example.com/templates/./roles/example.com/files/ 有它们,但需要从我的部署手册中引用这些文件及其完整路径,例如

- name: deployment | copy httpd config
  template:
    src: ./roles/example.com/templates/{{ host }}.conf.j2
    # ...

而不是

- name: deployment | copy httpd config
  template:
    src: {{ host }}.conf.j2
    # ...

面对同样的问题,最干净的方法对我来说似乎是以下结构:

在顶级目录(与 playbook 同一级别)中,我有一个 files 文件夹(如果我需要,还有一个 templates 文件夹)。在 files 文件夹中,每个主机都有一个文件夹,其中包含自己的文件,文件夹名称与清单中的主机名称相同。 (见下面的结构:myhost1 myhost2

.
├── files
│   ├── common
│   ├── myhost1
│   ├── myhost2
|
├── inventory
│   ├── group_vars
│   └── host_vars
├── roles
│   ├── first_role
│   └── second_role
└── my_playbook.yml

现在在任何角色中,您都可以相对访问具有文件模块的文件:

# ./roles/first_role/main.yml

- name: Copy any host based file
  copy:
    src={{ inventory_hostname }}/file1
    dest= /tmp

解释:

魔法变量inventory_hostname是获取host,见here 任何 file 模块(例如 copy)在各自的角色目录 中查找 files 目录 files 目录与调用剧本处于同一级别。当然这同样适用于模板(但如果你有不同的模板用于相同的角色,你应该重新考虑你的设计)

从语义上讲,特定于主机的文件不属于某个角色,而是在某个角色之外(如 host_vars)。