首页 > 解决方案 > Ansible 模板:试图索引到一个两级列表

问题描述

在 Ansible 中,我正在尝试模板化 apache 虚拟主机配置,每个文件一个。

我有一个 jinja 模板,其中包含:

...
DocumentRoot {{ mydomain.DocumentRoot }}
...

我有一个调用模板的剧本,其中包含:

vars:
  domain1:
    DocumentRoot: /var/www/html/domain1
  domain2: 
    DocumentRoot: /var/www/html/domain2

我希望能够推出此模板在 domain1 和 domain2 之间进行选择以选择 DocumentRoot(以及其他未显示的变量)

所以我需要以某种方式在我的模板中写下 mydomain 应该替换为“domain1”或“domain2”。

除其他外,我尝试了

ansible-playbook myplaybook.yml  -e mydomain=domain1

没有运气。

我需要某种变量间接,但我不知道如何编写它,或者即使它是可能的。

我知道我应该能够遍历数组的内容,所以为什么我不能构造一个简单的间接。

有什么办法可以做到这一点?

标签: templatesansiblejinja2

解决方案


创建字典列表会更容易。例如

  vars:
    apache_vhost:
      - ServerName: domain1
        DocumentRoot: /var/www/html/domain1
      - ServerName: domain2
        DocumentRoot: /var/www/html/domain2

然后下面的任务

- template:
    src: vhost.j2
    dest: "{{ apache_conf_path }}/extra/{{ item.ServerName }}.conf"
  loop: "{{ apache_vhost }}"
  notify: reload apache

和模板

     <VirtualHost *:80>
     ServerName {{ item.ServerName }}
     DocumentRoot {{ item.DocumentRoot }}
     </VirtualHost>

将使用目录中的虚拟主机配置创建文件extra。请参阅示例如何为虚拟主机创建文件、目录,并将额外文件包含在httpd.conf.


推荐阅读