ansible.builtin.csvfile lookup – 从 TSV 或 CSV 文件读取数据

注意

此 lookup 插件是 ansible-core 的一部分,包含在所有 Ansible 安装中。在大多数情况下,您可以使用简短的插件名称 csvfile。但是,我们建议您使用 完整限定集合名称 (FQCN) ansible.builtin.csvfile,以便轻松链接到插件文档并避免与可能具有相同 lookup 插件名称的其他集合发生冲突。

概要

  • csvfile lookup 读取 CSV(逗号分隔值)格式的文件内容。lookup 查找第一列与 keyname(可以是多个单词)匹配的行,并返回 col 列(默认值为 1,从 0 开始索引,表示文件中的第二列)中的值。

  • 至少需要一个 keyname,作为 lookup 的位置参数提供。

关键字参数

这描述了 lookup 的关键字参数。这些是在以下示例中 key1=value1key2=value2 等的值:lookup('ansible.builtin.csvfile', key1=value1, key2=value2, ...)query('ansible.builtin.csvfile', key1=value1, key2=value2, ...)

参数

注释

col

字符串

要返回的列(从 0 开始索引)。

默认值: "1"

default

字符串

如果在文件中找不到值,则返回的内容。

delimiter

字符串

文件中的字段分隔符,对于制表符,您可以指定 TAB\t

默认值: "TAB"

encoding

字符串

所用 CSV 文件的编码(字符集)。

默认值: "utf-8"

file

字符串

要打开的 CSV/TSV 文件的名称。

默认值: "ansible.csv"

keycol

整数

在 ansible-core 2.17 中添加

要搜索的列(从 0 开始索引)。

默认值: 0

备注

注意

  • 默认情况下使用的是 TSV 文件(制表符分隔),而不是 CSV 文件(逗号分隔)……是的,名称具有误导性。

  • 从 2.11 版本开始,搜索参数(必须与文件第一列匹配的文本)和文件名参数可以是多个单词。

  • 出于历史原因,在搜索 keyname 中,引号按字面意思处理,不能用于字符串周围,除非它们出现在您正在解析的文件的第一列中(根据需要转义)。

另请参阅

另请参阅

任务路径

用于相对文件的搜索路径。

示例

- name:  Match 'Li' on the first column, return the second column (0 based index)
  ansible.builtin.debug: msg="The atomic number of Lithium is {{ lookup('ansible.builtin.csvfile', 'Li file=elements.csv delimiter=,') }}"

- name: msg="Match 'Li' on the first column, but return the 3rd column (columns start counting after the match)"
  ansible.builtin.debug: msg="The atomic mass of Lithium is {{ lookup('ansible.builtin.csvfile', 'Li file=elements.csv delimiter=, col=2') }}"

# Contents of bgp_neighbors.csv
# 127.0.0.1,10.0.0.1,24,nones,lola,pepe,127.0.0.2
# 128.0.0.1,10.1.0.1,20,notes,lolita,pepito,128.0.0.2
# 129.0.0.1,10.2.0.1,23,nines,aayush,pepete,129.0.0.2

- name: Define values from CSV file, this reads file in one go, but you could also use col= to read each in it's own lookup.
  ansible.builtin.set_fact:
    '{{ columns[item|int] }}': "{{ csvline }}"
  vars:
    csvline: "{{ lookup('csvfile', bgp_neighbor_ip, file='bgp_neighbors.csv', delimiter=',', col=item) }}"
    columns: ['loop_ip', 'int_ip', 'int_mask', 'int_name', 'local_as', 'neighbour_as', 'neight_int_ip']
    bgp_neighbor_ip: '127.0.0.1'
  loop: '{{ range(columns|length|int) }}'
  delegate_to: localhost
  delegate_facts: true

# Contents of people.csv
# # Last,First,Email,Extension
# Smith,Jane,[email protected],1234

- name: Specify the column (by keycol) in which the string should be searched
  assert:
    that:
    - lookup('ansible.builtin.csvfile', 'Jane', file='people.csv', delimiter=',', col=0, keycol=1) == "Smith"

# Contents of debug.csv
# test1 ret1.1 ret2.1
# test2 ret1.2 ret2.2
# test3 ret1.3 ret2.3

- name: "Lookup multiple keynames in the first column (index 0), returning the values from the second column (index 1)"
  debug:
    msg: "{{ lookup('csvfile', 'test1', 'test2', file='debug.csv', delimiter=' ') }}"

- name: Lookup multiple keynames using old style syntax
  debug:
    msg: "{{ lookup('csvfile', term1, term2) }}"
  vars:
    term1: "test1 file=debug.csv delimiter=' '"
    term2: "test2 file=debug.csv delimiter=' '"

返回值

描述

返回值

列表 / 元素=字符串

存储在文件列中的值

返回:成功

作者

  • Jan-Piet Mens (@jpmens) <jpmens(at)gmail.com>

提示

每个条目类型的配置条目具有从低到高的优先级顺序。例如,列表中较低的变量将覆盖较高的变量。