Ansible:如何正确关联产品字典与对应数据库字典条目?
解决Ansible中产品与对应数据库配对的问题
问题原因
你遇到的核心问题是每次循环执行set_fact时,都会覆盖同一个db_info变量。循环结束后,这个变量仅保留最后一次循环的赋值结果,因此所有产品的数据库信息都显示为最后一条数据库记录。
解决方案
方案1:生成数据库映射字典(推荐)
先将databases列表转换为以location为键的映射字典,后续可直接通过产品的location字段快速匹配对应数据库信息:
tasks: - name: 生成数据库映射字典 set_fact: db_map: "{{ databases | items2dict(key_name='location', value_name='') }}" - name: 验证产品与数据库配对 ansible.builtin.debug: msg: "host is {{ db_map[item.location].db_host }} in {{ item.location }} with {{ item.portfolio }}." loop: "{{ product_list }}"
说明:items2dict过滤器会把databases列表中的每个元素,以location的值作为键,元素本身作为值,生成新字典db_map。遍历产品时,db_map[item.location]即可直接获取对应数据库的完整连接信息。
方案2:遍历产品时直接匹配数据库
如果不需要提前生成映射字典,可在debug任务中直接用过滤器筛选对应数据库:
tasks: - name: 验证产品与数据库配对 ansible.builtin.debug: msg: "host is {{ (databases | selectattr('location', 'equalto', item.location) | first).db_host }} in {{ item.location }} with {{ item.portfolio }}." loop: "{{ product_list }}"
说明:selectattr('location', 'equalto', item.location)从databases列表中筛选出与当前产品location匹配的元素,first取第一个匹配结果(因每个location唯一),再提取db_host字段。
内容的提问来源于stack exchange,提问作者Ron Shehebar
相关产品推荐
相关产品推荐

