Как получить переменную env внутри шаблона jinja2 в ansible

#bash #ansible #jinja2 #ansible-template

#bash #ansible #jinja2 #ansible-template

Вопрос:

Итак, у меня есть этот скрипт bash:

 #!/bin/bash

echo -ne "Enter stack name: "
read -r STACK
echo -ne "Enter node type (Compute/Storage): "
read -r NODE_TYPE

export STACK
export NODE_TYPE

ansible-playbook -i inventory -l "$AC_STACK" node-exporter-install.yml -e "stack=$STACK"
  

Файл инвентаризации так же прост, как определение группы:

 [SERVERS]
ip-address-1
ip-address-2
...
  

Тогда у меня есть этот шаблон Jinja2, который используется в сборнике игр ansible:

 {% for node in groups.getenv('STACK') -%}
  - job_name: '{{ lookup('env', 'STACK') }}-{{ lookup('env', 'NODE_TYPE') }}-{{ node }}'
    static_configs:
    - targets: ['{{ node }}:9100']
{% endfor %}
  

Как мне получить стек переменных ENV, определенный в скрипте bash, внутри шаблона ?!

Если я вручную определяю внутри шаблона jinja2 {{ for noe in groups.SERVERS %} , он работает просто отлично.

Так что в основном мне нужны эти группы.СЕРВЕРЫ должны быть любым переменным ENV, который я определяю при выполнении скрипта bash….

Ответ №1:

Мне было трудно понять, о чем вы спрашивали, но я думаю, вы этого хотите:

 {% for node in groups[lookup('env', 'STACK')] -%}
  - job_name: '{{ lookup('env', 'STACK') }}-{{ lookup('env', 'NODE_TYPE') }}-{{ node }}'
    static_configs:
    - targets: ['{{ node }}:9100']
{% endfor %}
  

Вы могли бы немного упростить это, что избавит нас от необходимости искать STACK несколько раз:

 {% set stack = lookup('env', 'STACK') %}
{% for node in groups[stack] -%}
  - job_name: '{{ stack }}-{{ lookup('env', 'NODE_TYPE') }}-{{ node }}'
    static_configs:
    - targets: ['{{ node }}:9100']
{% endfor %}

  

Комментарии:

1. БОЖЕ! Я пытался сделать это уже более 2 часов и не смог разобраться. Это сработало как шарм! Вы спасли мой день! Большое вам спасибо!