我试图根据Directory Layout结构组织我的剧本。该文档似乎没有针对主机特定文件/模板的建议。
我有2个播放单个网站
这些文件位于我的结构的根目录中。供应手册只包括其他角色
---
- hosts: example.com
roles:
- common
- application
- database
become: true
become_method: su
become_user: root
部署手册不包含角色,但拥有自己的vars
和tasks
部分。我有几个template
和copy
任务,我想知道最佳做法是什么'用于将这些特定于主机的模板/文件放在此目录结构中的哪个位置。
现在我将它们放在./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
# ...
答案 0 :(得分:32)
面对同样的问题,最清洁的方式对我来说似乎有以下结构:
在顶级目录(与playbooks相同的级别)中,我有一个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
是获取主机,请参阅here
任何file
模块(例如copy
)都会查找相应角色目录中的files
目录和 files
目录中的host_vars
目录作为调用剧本的水平。当然,同样适用于模板(但如果你有相同角色的不同模板,你应该重新考虑你的设计)
从语义上讲,特定于主机的文件不属于角色,而是属于某个角色(如GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';
)。