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

dee*_*our 32 ansible

我正在尝试根据目录布局结构来组织我的剧本.该文档似乎没有针对特定于主机的文件/模板的建议.

我有2个播放单个网站

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

这些文件位于我的结构的根目录中.配置手册仅包括其他角色

---
- hosts: example.com

  roles:
    - common
    - application
    - database

  become: true
  become_method: su
  become_user: root
Run Code Online (Sandbox Code Playgroud)

部署手册不包含角色,但有自己的部分varstasks部分.我有一对夫妇templatecopy任务,并想知道什么"最佳实践"是从哪里把这个目录结构中的这些主机特定的模板/文件.

现在我把它们放在./roles/example.com/templates/./roles/example.com/files/,但是需要从我的部署手册中引用文件的完整路径,比如

- name: deployment | copy httpd config
  template:
    src: ./roles/example.com/templates/{{ host }}.conf.j2
    # ...
Run Code Online (Sandbox Code Playgroud)

代替

- name: deployment | copy httpd config
  template:
    src: {{ host }}.conf.j2
    # ...
Run Code Online (Sandbox Code Playgroud)

Pro*_*e85 39

面对同样的问题,最清洁的方式对我来说似乎是以下结构:

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

.
??? files
?   ??? common
?   ??? myhost1
?   ??? myhost2
|
??? inventory
?   ??? group_vars
?   ??? host_vars
??? roles
?   ??? first_role
?   ??? second_role
??? my_playbook.yml
Run Code Online (Sandbox Code Playgroud)

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

# ./roles/first_role/main.yml

- name: Copy any host based file
  copy:
    src={{ inventory_hostname }}/file1
    dest= /tmp
Run Code Online (Sandbox Code Playgroud)

说明:

魔术变量inventory_hostname是获取主机,请参见此处 任何file模块(例如copy)查找files相应角色目录中的目录以及files与调用playbook相同级别的目录.当然同样适用于模板(但是如果你有相同角色的不同模板,你应该重新考虑你的设计)

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

  • 我决定根据这个答案走一条稍微不同的路线。现在,我的供应项目结构的根目录下有一个目录,用于每个主机。我在每个主机目录中都有一个`files /`,`group_vars /`和`templates /`目录,并使用相对的../ templates / ...`样式路径引用它们-对您同样简单{{stocker_hostname}}方法。感谢您朝着正确的方向前进。 (3认同)