Templates Ansible模板:尝试索引到两级列表中
在Ansible中,我试图对apache虚拟主机配置进行模板化,每个文件一个 我有一个jinja模板,其中包含以下内容:Templates Ansible模板:尝试索引到两级列表中,templates,ansible,jinja2,Templates,Ansible,Jinja2,在Ansible中,我试图对apache虚拟主机配置进行模板化,每个文件一个 我有一个jinja模板,其中包含以下内容: ... DocumentRoot {{ mydomain.DocumentRoot }} ... 我有一个调用模板的剧本,其中包含: vars: domain1: DocumentRoot: /var/www/html/domain1 domain2: DocumentRoot: /var/www/html/domain2 我希望能够推出这个模板
...
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
没有运气
我需要某种间接变量,但我不知道如何编写它,甚至不知道是否可能
我知道我应该能够迭代数组的内容,所以为什么我不能构造一个简单的间接寻址呢
有什么方法可以做到这一点吗?您可以使用模板中的条件,根据
mydomain
的值设置DocumentRoot
一种简单的方法是直接使用模板中mydomain
的值,如果这是唯一的配置:
例如:
DocumentRoot/var/www/html/{{mydomain}
根据使用-e mydomain=
传递的内容,这将导致:
DocumentRoot /var/www/html/domain1
或
或者,如果存在特定于域的其他参数,则可以在模板中设置条件。考虑下面的示例模板:
{%if mydomain=='domain1%}
其他设置xyz
DocumentRoot/var/www/html/{{mydomain}
{%elif mydomain=='domain2%}
其他设置abc
DocumentRoot/var/www/html/{{mydomain}
{%endif%}
当您使用
-e“mydomain=domain1”
运行playbook时,它将呈现前两行。对于domain2
,它将匹配elif
语句并呈现适当的行。创建词典列表会更容易。比如说
vars:
apache_vhost:
-服务器名:域1
DocumentRoot:/var/www/html/domain1
-服务器名:域2
DocumentRoot:/var/www/html/domain2
然后是下面的任务
-模板:
src:vhost.j2
dest:{apache_conf_path}}/extra/{{item.ServerName}}.conf”
循环:“{apache_vhost}}”
通知:重新加载apache
模板呢
<VirtualHost *:80>
ServerName {{ item.ServerName }}
DocumentRoot {{ item.DocumentRoot }}
</VirtualHost>
服务器名{{item.ServerName}
DocumentRoot{{item.DocumentRoot}
将使用目录
extra
中的虚拟主机配置创建文件。查看如何为虚拟主机创建文件和目录,并在httpd.conf
中包含额外的文件,这是我使用的方法。谢谢,谢谢你的贡献。
<VirtualHost *:80>
ServerName {{ item.ServerName }}
DocumentRoot {{ item.DocumentRoot }}
</VirtualHost>