我应该在哪里组织特定于主机的 files/templates?
Where should I be organizing host-specific files/templates?
我正在尝试根据 Directory Layout 结构组织我的剧本。该文档似乎没有针对特定主机的建议 files/templates.
我在一个网站上有 2 个播放
- 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
部分。我有几个 template
和 copy
任务,我想知道 '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
)。
我正在尝试根据 Directory Layout 结构组织我的剧本。该文档似乎没有针对特定主机的建议 files/templates.
我在一个网站上有 2 个播放
- 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
部分。我有几个 template
和 copy
任务,我想知道 '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
)。