Jinja2 嵌套变量
Jinja2 nested varibles
下面是我的 jinja2 模板文件和用于填充它的变量。但是,我只想在 aditional_keys = true
时包含一个新部分。这可能吗?
我的变量
- { name: 'container1', version: '1.0.0.0', port: '', registry_path: 'container1', replicas: '1', namespace: 'general', aditional_keys: 'false'}
- { name: 'container2', version: '3.6.14.1', port: '8080', registry_path: 'container2', replicas: '1', namespace: 'general', aditional_keys: 'true'}
我的模板
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ item.name }}
environment: {{ location }}_{{ env }}
name: {{ item.name }}
namespace: "{{ item.namespace }}"
spec:
replicas: {{ item.replicas }}
selector:
matchLabels:
app: {{ item.name }}
environment: {{ location }}_{{ env }}
template:
metadata:
labels:
app: {{ item.name }}
environment: {{ location }}_{{ env }}
spec:
containers:
- envFrom:
- configMapRef:
name: {{ item.name }}
image: registry.com/{{ item.registry_path }}:{{ item.version }}
imagePullPolicy: Always
name: {{ item.name }}
ports:
- containerPort: {{ item.port }}
protocol: TCP
我尝试添加这个,但我显然没有正确调用变量
{% if item.additional_keys == true %}
env:
- name: PRIVATE_KEY
valueFrom:
secretKeyRef:
key: id_{{ item.name }}_rsa
name: id-{{ item.name }}-rsa-priv
optional: false
- name: PUBLIC_KEY
valueFrom:
secretKeyRef:
key: id_{{ item.name }}.pub
name: id-{{ item.name }}-rsa-pub
optional: false
{% else %}
{% endif %}
首先,literal compare to boolean values 是您可能想要遵循的 ansible-lint 规则之一。
现在你上面的例子中有 2 个真正的问题。
- 您的变量定义 (
aditional_keys
) 中有错字,但您在模板中拼写正确 (ad
ditional_keys
)
- 您的变量被指定为字符串 (
'false'
),而您期望的是布尔值 (false
)。同时,在 ansible 中经常发生正确的布尔值在解析时可以转换为字符串的情况(例如命令行上的 extra_vars)。为了克服这个问题,好的做法是在您不完全信任来源时使用 bool
过滤器系统地将值转换为布尔值。
一旦您将 var 文件中的变量名和布尔值定义修复为 additional_keys: false
,您模板中的以下条件将确保您不会再次遇到该问题:
{% if item.additional_keys | bool %}
下面是我的 jinja2 模板文件和用于填充它的变量。但是,我只想在 aditional_keys = true
时包含一个新部分。这可能吗?
我的变量
- { name: 'container1', version: '1.0.0.0', port: '', registry_path: 'container1', replicas: '1', namespace: 'general', aditional_keys: 'false'}
- { name: 'container2', version: '3.6.14.1', port: '8080', registry_path: 'container2', replicas: '1', namespace: 'general', aditional_keys: 'true'}
我的模板
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ item.name }}
environment: {{ location }}_{{ env }}
name: {{ item.name }}
namespace: "{{ item.namespace }}"
spec:
replicas: {{ item.replicas }}
selector:
matchLabels:
app: {{ item.name }}
environment: {{ location }}_{{ env }}
template:
metadata:
labels:
app: {{ item.name }}
environment: {{ location }}_{{ env }}
spec:
containers:
- envFrom:
- configMapRef:
name: {{ item.name }}
image: registry.com/{{ item.registry_path }}:{{ item.version }}
imagePullPolicy: Always
name: {{ item.name }}
ports:
- containerPort: {{ item.port }}
protocol: TCP
我尝试添加这个,但我显然没有正确调用变量
{% if item.additional_keys == true %}
env:
- name: PRIVATE_KEY
valueFrom:
secretKeyRef:
key: id_{{ item.name }}_rsa
name: id-{{ item.name }}-rsa-priv
optional: false
- name: PUBLIC_KEY
valueFrom:
secretKeyRef:
key: id_{{ item.name }}.pub
name: id-{{ item.name }}-rsa-pub
optional: false
{% else %}
{% endif %}
首先,literal compare to boolean values 是您可能想要遵循的 ansible-lint 规则之一。
现在你上面的例子中有 2 个真正的问题。
- 您的变量定义 (
aditional_keys
) 中有错字,但您在模板中拼写正确 (ad
ditional_keys
) - 您的变量被指定为字符串 (
'false'
),而您期望的是布尔值 (false
)。同时,在 ansible 中经常发生正确的布尔值在解析时可以转换为字符串的情况(例如命令行上的 extra_vars)。为了克服这个问题,好的做法是在您不完全信任来源时使用bool
过滤器系统地将值转换为布尔值。
一旦您将 var 文件中的变量名和布尔值定义修复为 additional_keys: false
,您模板中的以下条件将确保您不会再次遇到该问题:
{% if item.additional_keys | bool %}