Ansible 我应该在哪里组织主机特定的文件/模板?

Ansible 我应该在哪里组织主机特定的文件/模板?,ansible,Ansible,我正试图根据结构来组织我的剧本。该文档似乎没有针对特定于主机的文件/模板的建议 我有两个单一的网站播放 example.com-provision.yml example.com-deploy.yml 这些文件位于我的结构的根目录中。供应剧本只包括其他角色 --- - hosts: example.com roles: - common - application - database become: true become_method: su

我正试图根据结构来组织我的剧本。该文档似乎没有针对特定于主机的文件/模板的建议

我有两个单一的网站播放

  • example.com-provision.yml
  • example.com-deploy.yml
这些文件位于我的结构的根目录中。供应剧本只包括其他角色

---
- hosts: example.com

  roles:
    - common
    - application
    - database

  become: true
  become_method: su
  become_user: root
部署手册不包括角色,但有自己的
vars
tasks
部分。我有两个
模板
复制
任务,我想知道在这个目录结构中放置这些主机特定模板/文件的“最佳实践”是什么

现在我在
/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
    # ...

面对同样的问题,我认为最干净的方式是以下结构:

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

现在,在任何角色中,您都可以使用文件模块访问文件:

# ./roles/first_role/main.yml

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

神奇变量
inventory\u hostname
用于获取主机,请参阅 任何
文件
模块(例如
复制
)查找相应角色目录中的
文件
目录,以及与调用剧本处于同一级别的
文件
目录。当然,同样的情况也适用于模板(但是如果同一角色有不同的模板,则应重新考虑您的设计)


从语义上讲,特定于主机的文件不属于角色,而是位于角色之外的某个位置(如
host\u vars

这也取决于您如何处理动态库存。我认为您应该考虑的最小范围是角色或组与主机。如果您的模板对于主机类型不同,那么它们可能是不同的角色。这也取决于模板的内容。基于这个答案,我决定走一条稍微不同的路线。现在,我在配置项目结构的根目录下为每个主机创建了一个目录。我在每个主机目录中都有一个
文件/
组变量/
模板/
目录,并使用相对的
。/templates/…
样式路径引用它们-对于
{inventory\u hostname}
方法同样简单。感谢您在正确的方向上所做的调整。遵循一个simlar路径,允许使用默认值过滤src,并且在playbook级别定义时(它也可以使用组/主机名),并遵循全局ansible/templates文件夹下的该路径
# ./roles/first_role/main.yml

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