ansible模板为列表添加值-
基于以下ansible playbook值ansible模板为列表添加值-,ansible,jinja2,ansible-template,Ansible,Jinja2,Ansible Template,基于以下ansible playbook值 target: "actual.domain.com" aliases: - "alias1.domain.com" - "alias2.domain.com" 我正在尝试设置一个ansible模板来生成nginx服务器名称 在这种情况下,应该是: server_name: "actual.domain.com alias1.domain.com alias2.domain.com" 所以,我尝试了下面的jinja2脚本 {% if it
target: "actual.domain.com"
aliases:
- "alias1.domain.com"
- "alias2.domain.com"
我正在尝试设置一个ansible模板来生成nginx服务器名称
在这种情况下,应该是:
server_name: "actual.domain.com alias1.domain.com alias2.domain.com"
所以,我尝试了下面的jinja2脚本
{% if item.aliases is defined %}
{% set servername = [ item.target ] %}
{% for alias in item.aliases.iteritems() %}
{% if alias|length > 0 %}
{% servername|join(' '), alias %} # <= line 30
{% endif %}
{% endfor %}
server_name {{ servername }};
{% else %}
server_name {{ item.target }};
{% endif %}
....
{%如果定义了item.alias%}
{%set servername=[item.target]}
{item.alias.iteritems()中的别名为%s}
{如果别名|长度>0%}
{%servername | join(“”),alias%}为什么不简单地连接target
和alias
,然后对结果运行join(“”)
{% set servername = [ item.target ] %}
{% set aliases = item.aliases if item.aliases is defined else [] %}
{% set ignored = servername.extend(aliases) %}
servername: {{ servername | join(' ') }}
看来你把这件事弄得太复杂了。为什么不像这样
$ ansible-playbook -i hosts play.yml
PLAY [localhost] **************************************************************
TASK: [template src='servername.j2' dest=tmp/servername-{{item.target}}] ******
changed: [localhost] => (item={'target': 'actual.domain.com', 'aliases': ['alias1.domain.com', 'alias2.domain.com']})
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
文件内容
$tail-n 1000`find./-type f`
==>。//主机//play.yml//servername.j2//tmp/servername-actual.domain.com谢谢。。。即使丹的答案是我实现的。。。您的回答给了我一些关于jinja2脚本的提示…set ignored=
。啊。{%do%}
块会让它看起来不那么难看,但是Ansible似乎没有启用它。谢谢!我还不是很流利。。但这是真的,它可以变得更简单。。。知道了!请注意,这里有一个隐含的答案-将服务器名称
拉出,因为它是常量文本,而不是包含dict的变量。
$ tail -n 1000 `find ./ -type f`
==> .//hosts <==
[localhost]
localhost ansible_connection=local
==> .//play.yml <==
- hosts: localhost
gather_facts: false
vars:
servers:
- target: "actual.domain.com"
aliases:
- "alias1.domain.com"
- "alias2.domain.com"
tasks:
- template: src='servername.j2' dest=tmp/servername-{{item.target}}
with_items: servers
==> .//servername.j2 <==
server_name {{ item.target }} {{ item.aliases|join(" ") }}
==> .//tmp/servername-actual.domain.com <==
server_name actual.domain.com alias1.domain.com alias2.domain.com