-1

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

模板包括表达式

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

其中,上面的environment_name是运行 playbook 时 Ansible 中存在的变量。剧本有这个指令:

- 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'* 等(我有几个环境)。

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

4

1 回答 1

2

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

{% 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 文档的控制结构部分以获取有关if/的更多信息then,并阅读有关分配的信息以获取有关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'

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

于 2017-12-10T14:00:57.883 回答