在Ansible中,如何基于变量值使用不同的模板替换?

在Ansible中,如何基于变量值使用不同的模板替换?,ansible,yaml,ansible-template,Ansible,Yaml,Ansible Template,我有一个system.d服务脚本的模板,我使用Ansible playbook来填充它 模板包括Expersion [Service] Environment="JAVA_OPTS=-Djava.net.preferIPv4Stack=true -Denvironmentname={{environment_name | default('NOT_SET') }}" 其中,上面的环境\u name是运行剧本时Ansible中存在的变量。Playbook有以下说明: - name: Copy s

我有一个system.d服务脚本的模板,我使用Ansible playbook来填充它

模板包括Expersion

[Service]
Environment="JAVA_OPTS=-Djava.net.preferIPv4Stack=true -Denvironmentname={{environment_name | default('NOT_SET') }}"
其中,上面的环境\u name是运行剧本时Ansible中存在的变量。Playbook有以下说明:

- name: Copy systemd service script
  template: src=systemd.service dest="{{systemd_dir}}/{{systemd_service_name}}.service"
我想向JAVA_选项中添加与内存相关的参数,例如:

如果环境名称=DEV,那么添加到JAVA选项-Xmx=2000Mb-Xms=1000Mb',如果环境名称=PROD,那么添加-Xmx=20000Mb-Xms=10000Mb'*,等等(我有几个环境)


如何在模板或调用脚本中对此类替换进行编码?

您可以使用
if
Jinja-template指令。可能是这样的:

{% if environment_name == 'DEV' %}
{% set extra_java_opts = "-Xmx=2000Mb -Xms=1000Mb" %}
{% elif environment_name == 'PROD' %}
{% set extra_java_opts = "-Xmx=20000Mb -Xms=10000Mb" %}
{% endif %}
Environment="JAVA_OPTS=-Djava.net.preferIPv4Stack=true -Denvironmentname={{environment_name | default('NOT_SET') }} {{ extra_java_opts }}"
这并不是解决这个问题的唯一方法(例如,您可以在
环境=
语句中内联一个
if
块,但我认为这会变得混乱)

阅读Jinja文档的一节,了解有关
如果
/
那么
的更多信息,以及有关
设置
指令的信息

话虽如此,我可能会将此逻辑放在我的ansible剧本中,而不是将其嵌入模板中:

- set_fact:
    extra_java_opts: "-Xmx=2000Mb -Xms=1000Mb"
  when: environment == 'DEV'

- set_fact:
    extra_java_opts: "-Xmx=20000Mb -Xms=10000Mb"
  when: environment == 'PROD'
这使得模板更加简单,并将所有逻辑保持在一个位置,而不是在剧本和模板之间分割