【问题标题】:In Ansible, how can I use different template substitutions based on a variable value? [duplicate]在 Ansible 中,如何根据变量值使用不同的模板替换? [复制]
【发布时间】:2017-12-10 13:56:26
【问题描述】:

我有一个 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中加入内存相关的参数如:

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

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

【问题讨论】:

    标签: ansible yaml ansible-template


    【解决方案1】:

    您可以使用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 块,但我认为这会很麻烦)。

    阅读 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'
    

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

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多