Ansible如何使用read_csv将CSV内容注册到动态命名变量中?
错误原因
你写的playbook存在两个语法和逻辑层面的问题,导致无法生成动态变量:
fruit_name不属于Ansible任务的合法内置参数,写在任务层级不会被引擎解析执行- 配合循环使用
register时,Ansible只会把所有循环的返回结果统一存入一个固定名称的变量,不会自动按循环项拆分注册为多个独立变量,也不支持在register参数里直接用循环变量拼接动态变量名。
正确实现方法
分两个任务实现需求,写法兼容所有Ansible 2.9+版本:
# 第一步:批量读取所有匹配规则的CSV文件,结果统一存入临时变量 - name: 读取水果目录下所有CSV文件 read_csv: path: "{{ item }}" with_fileglob: - "/tmp/fruits/*.csv" register: raw_fruit_records # 第二步:遍历读取结果,按文件名动态生成对应变量 - name: 注册文件名对应的独立变量 set_fact: "fruit_{{ item.item | basename | regex_replace('\\.csv$', '') }}": "{{ item.list }}" loop: "{{ raw_fruit_records.results }}"
效果说明
执行完成后会自动生成三个对应变量,可在后续任意play、task中直接调用:
fruit_apples:存储apples.csv解析后的结构化内容fruit_pears:存储pears.csv解析后的结构化内容fruit_grapes:存储grapes.csv解析后的结构化内容
正则替换部分使用\\.csv$是为了精确匹配文件名末尾的.csv后缀,避免文件名中包含csv字符时被误截断。
内容的提问来源于stack exchange,提问作者diaryfolio
相关产品推荐
相关产品推荐

