Jinja2 模板中的 Ansible CSV 查找,如何处理丢失的键
Ansible CSV lookup in Jinja2 template, how to handle missing key
j2 模板,这是一个片段:
{% set denyGroups %}
{{lookup('csvfile', '{{ ansible_hostname }} file={{ csvFile }} delimiter=, col=5')}}
{% endset %}
{%- if denyGroups |trim() -%}
simple_deny_groups = {{ denyGroups |replace(";", ",") }}
{%- endif -%}
我正在根据 csv 值将值注入模板。但是,如果在 csv 中找不到密钥 (ansible_hostname),则会出现此错误:AnsibleError: csvfile: list index out of range
我该如何处理这个错误?首先检查它是否在 csv 中。现在我可以在 tasks 中注入值,但是会更麻烦一些,我更喜欢这种模板方式。谢谢
list index out of range
– 这是列数的问题。
列从零开始计数,因此对于 col=5
– 文件中必须有 6 列。
如果你想 return 缺少密钥时的默认项,请使用 default=myvalue
选项。
更新:让我们看看 the code:
def read_csv(self, filename, key, delimiter, encoding='utf-8', dflt=None, col=1):
try:
f = open(filename, 'r')
creader = CSVReader(f, delimiter=to_bytes(delimiter), encoding=encoding)
for row in creader:
if row[0] == key:
return row[int(col)]
except Exception as e:
raise AnsibleError("csvfile: %s" % to_str(e))
return dflt
所以在 csv 中是这样的:
mykey,val_a,val_b.val_c
key(第 0 列)是 mykey,第 1 列 - val_a,第 2 列 - val_b,第 3 列 - val_c.
如果格式错误或者你的参数不正确,将触发异常——你对此无能为力。 尝试使用 col=4
with我的示例 csv 文件将出现 list index out of range
异常。
如果在文件中找不到密钥(row[0] == key
每一行都是假的),默认值将是 returned(你用 default=
选项指定的那个) .
j2 模板,这是一个片段:
{% set denyGroups %}
{{lookup('csvfile', '{{ ansible_hostname }} file={{ csvFile }} delimiter=, col=5')}}
{% endset %}
{%- if denyGroups |trim() -%}
simple_deny_groups = {{ denyGroups |replace(";", ",") }}
{%- endif -%}
我正在根据 csv 值将值注入模板。但是,如果在 csv 中找不到密钥 (ansible_hostname),则会出现此错误:AnsibleError: csvfile: list index out of range
我该如何处理这个错误?首先检查它是否在 csv 中。现在我可以在 tasks 中注入值,但是会更麻烦一些,我更喜欢这种模板方式。谢谢
list index out of range
– 这是列数的问题。
列从零开始计数,因此对于 col=5
– 文件中必须有 6 列。
如果你想 return 缺少密钥时的默认项,请使用 default=myvalue
选项。
更新:让我们看看 the code:
def read_csv(self, filename, key, delimiter, encoding='utf-8', dflt=None, col=1):
try:
f = open(filename, 'r')
creader = CSVReader(f, delimiter=to_bytes(delimiter), encoding=encoding)
for row in creader:
if row[0] == key:
return row[int(col)]
except Exception as e:
raise AnsibleError("csvfile: %s" % to_str(e))
return dflt
所以在 csv 中是这样的:
mykey,val_a,val_b.val_c
key(第 0 列)是 mykey,第 1 列 - val_a,第 2 列 - val_b,第 3 列 - val_c.
如果格式错误或者你的参数不正确,将触发异常——你对此无能为力。 尝试使用 col=4
with我的示例 csv 文件将出现 list index out of range
异常。
如果在文件中找不到密钥(row[0] == key
每一行都是假的),默认值将是 returned(你用 default=
选项指定的那个) .