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= 选项指定的那个) .