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

时间:2017-12-10 13:56:27

标签: ansible yaml ansible-template

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

模板包括experssion

[Service]
Environment="JAVA_OPTS=-Djava.net.preferIPv4Stack=true -Denvironmentname={{environment_name | default('NOT_SET') }}"

其中 environment_name 是Ansible在运行playbook时出现的变量。 Playbook有这个指示:

- name: Copy systemd service script
  template: src=systemd.service dest="{{systemd_dir}}/{{systemd_service_name}}.service"

我想将与内存相关的参数添加到JAVA_OPTS中,例如:

如果 environment_name = DEV,则然后添加到JAVA_OPTS' -Xmx = 2000Mb -Xms = 1000Mb',如果 environment_name = PROD,然后添加' -Xmx = 20000Mb -Xms = 10000Mb' *等(我有几个环境)。

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

1 个答案:

答案 0 :(得分:2)

您可以使用if Jinja模板指令。也许是这样的:

{% 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语句中内嵌Environment=块,但我认为这会变得混乱。

阅读Jinja文档的control structures部分,了解有关if / then的更多信息,并阅读assignments了解set指令的相关信息

话虽如此,我可能会把这个逻辑放在我的ansible playbook中,而不是将它嵌入到模板中:

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

- set_fact:
    extra_java_opts: "-Xmx=20000Mb -Xms=10000Mb"
  when: environment == 'PROD'

这使得模板更加简单,并将所有逻辑保存在一个地方,而不是在剧本和模板之间拆分。