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=value1
、key2=value2
等:lookup('ansible.builtin.csvfile', key1=value1, key2=value2, ...)
和 query('ansible.builtin.csvfile', key1=value1, key2=value2, ...)
参数 |
注释 |
---|---|
要返回的列(从 0 开始索引)。 默认值: |
|
如果在文件中找不到值,则返回的内容。 |
|
文件中的字段分隔符,对于制表符,您可以指定 默认值: |
|
使用的 CSV 文件的编码(字符集)。 默认值: |
|
要打开的 CSV/TSV 文件的名称。 默认值: |
|
要搜索的列(从 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=' '"
返回值
键 |
描述 |
---|---|
存储在文件列中的值 已返回:成功 |