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

时间:2015-09-28 19:33:18

标签: ansible

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

我有2个播放单个网站

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

这些文件位于我的结构的根目录中。供应手册只包括其他角色

---
- hosts: example.com

  roles:
    - common
    - application
    - database

  become: true
  become_method: su
  become_user: root

部署手册不包含角色,但拥有自己的varstasks部分。我有几个templatecopy任务,我想知道最佳做法是什么'用于将这些特定于主机的模板/文件放在此目录结构中的哪个位置。

现在我将它们放在./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
    # ...

1 个答案:

答案 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'; )。