В Ansible, как я могу использовать различные замены шаблонов на основе значения переменной?

У меня есть шаблон сценария службы system.d, который я заполняю с помощью Ansible playbook.

Шаблон включает выражение

[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 параметры, связанные с памятью, например:

если имя_окружения=DEV, то добавить в JAVA_OPTS '-Xmx=2000Mb -Xms=1000Mb', если имя_окружения=PROD, то добавьте '-Xmx=20000Mb -Xms=10000Mb'* и т. д. (у меня несколько сред).

Как я могу закодировать такие замены в шаблоне или в вызывающем скрипте?


person Askar Ibragimov    schedule 10.12.2017    source источник


Ответы (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 }}"

Это не единственный способ решения этой проблемы (например, вы можете поместить блок 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'

Это делает шаблоны намного проще и сохраняет всю вашу логику в одном месте, а не разделяет ее между плейбуками и шаблонами.

person larsks    schedule 10.12.2017