在 Ansible 中,如何根据变量值使用不同的模板替换?
In Ansible, how can I use different template substitutions based on a variable value?
我有一个 system.d 服务脚本模板,我使用 Ansible 剧本填充了它。
模板包含表达式
[Service]
Environment="JAVA_OPTS=-Djava.net.preferIPv4Stack=true -Denvironmentname={{environment_name | default('NOT_SET') }}"
其中 environment_name 是 Ansible 中存在的变量,而 运行 是剧本。剧本有这条指令:
- name: Copy systemd service script
template: src=systemd.service dest="{{systemd_dir}}/{{systemd_service_name}}.service"
我想在JAVA_OPTS中加入内存相关的参数如:
if environment_name=DEV, then 添加到 JAVA_OPTS '-Xmx=2000Mb -Xms= 1000Mb', if environment_name=PROD, then 添加 '-Xmx=20000Mb -Xms=10000Mb'* 等(我有几个环境)。
如何在模板或调用脚本中对此类替换进行编码?
您可以使用 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 }}"
这不是解决此问题的唯一方法(例如,您可以在 Environment=
语句中内嵌 if
块,但我认为这会变得混乱)。
通读 control structures section of the Jinja documentation for more information about if
/then
, and read about assignments 以获取有关 set
指令的信息。
话虽如此,我可能会将此逻辑放在我的 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'
这使得模板更简单,并将所有逻辑放在一个地方,而不是在剧本和模板之间拆分。
我有一个 system.d 服务脚本模板,我使用 Ansible 剧本填充了它。
模板包含表达式
[Service]
Environment="JAVA_OPTS=-Djava.net.preferIPv4Stack=true -Denvironmentname={{environment_name | default('NOT_SET') }}"
其中 environment_name 是 Ansible 中存在的变量,而 运行 是剧本。剧本有这条指令:
- name: Copy systemd service script
template: src=systemd.service dest="{{systemd_dir}}/{{systemd_service_name}}.service"
我想在JAVA_OPTS中加入内存相关的参数如:
if environment_name=DEV, then 添加到 JAVA_OPTS '-Xmx=2000Mb -Xms= 1000Mb', if environment_name=PROD, then 添加 '-Xmx=20000Mb -Xms=10000Mb'* 等(我有几个环境)。
如何在模板或调用脚本中对此类替换进行编码?
您可以使用 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 }}"
这不是解决此问题的唯一方法(例如,您可以在 Environment=
语句中内嵌 if
块,但我认为这会变得混乱)。
通读 control structures section of the Jinja documentation for more information about if
/then
, and read about assignments 以获取有关 set
指令的信息。
话虽如此,我可能会将此逻辑放在我的 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'
这使得模板更简单,并将所有逻辑放在一个地方,而不是在剧本和模板之间拆分。