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中。现在我可以在任务中注入值,但这会更麻烦,我更喜欢这种模板方式。感谢
答案 0 :(得分:1)
list index out of range
- 这是列数的问题
列从零开始计算,因此对于col=5
- 文件中必须有6列
如果您想在缺少密钥时返回默认项,请使用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
键(第0列)是mykey,第1列 - val_a,第2列 - val_b,第3列 - val_c。
如果格式错误或参数不正确,将触发异常 - 您无法对其执行任何操作。尝试将col=4
与我的示例csv文件一起使用将上升list index out of range
例外。
如果在文件中找不到密钥(row[0] == key
每行都为false),将返回默认值(使用default=
选项指定的值)。