Jinja2模板中的Ansible CSV查找,如何处理丢失的密钥

时间:2016-08-11 17:09:13

标签: python csv ansible jinja2

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中。现在我可以在任务中注入值,但这会更麻烦,我更喜欢这种模板方式。感谢

1 个答案:

答案 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=选项指定的值)。