如何在Ansible中根据用户选择提取对应站点的rooms数组
解决Ansible提取站点对应rooms数组的问题
你的核心需求是根据用户选择的站点,从sites数组中提取对应的rooms列表,当前的过滤器语法存在括号不闭合、缺少匹配项提取步骤的问题,以下是修正后的实现:
修正后的完整Playbook代码
--- - hosts: localhost become: no vars: - sites: [ { "site":"A","rooms":["test1","test2"]}, { "site":"B","rooms":["test3","test4"]}, { "site":"C","rooms":["test5","test6"]}, { "site":"D","rooms":["test7"] } ] vars_prompt: - name: site prompt: "whats site we working with A,B,C,D ?" private: no tasks: - name: 提取并打印对应站点的rooms数组 ansible.builtin.debug: msg: "{{ sites | selectattr('site', 'equalto', site) | first | json_query('rooms') }}" # 可选:将结果保存为变量,供后续任务直接调用 - name: 将rooms数组存入变量 set_fact: target_rooms: "{{ sites | selectattr('site', 'equalto', site) | first | json_query('rooms') }}" - name: 验证变量内容 ansible.builtin.debug: var: target_rooms
关键语法解释
selectattr('site', 'equalto', site):从sites列表中筛选出site字段与用户输入值匹配的字典项first:由于每个站点唯一,直接取筛选结果的第一个(也是唯一一个)字典json_query('rooms'):从匹配到的字典中提取rooms字段对应的数组(也可以用.rooms替代,效果完全一致)
测试效果
当用户输入A时,debug任务会输出["test1","test2"],target_rooms变量也会存储该数组,后续任务可直接通过{{ target_rooms }}调用。
内容的提问来源于stack exchange,提问作者Damien Dye
相关产品推荐
相关产品推荐

