Ansible:如何重置循环传递的变量值(不使用set_fact)
问题根源
你遇到的问题是因为set_fact设置的APPLICATION变量会被存入主机的**事实(facts)**中,而Ansible的变量优先级里,主机事实的优先级高于循环传入的变量。所以下一次循环时,新传入的item会被已存在的主机事实覆盖,导致变量无法更新为下一个应用名称。
解决办法
办法一:循环传入时直接修正名称
提前在循环阶段处理错误的应用名称,main.yml里直接使用修正后的变量即可,无需再修改:
- name: 循环处理每个应用 include: main.yml APPLICATION="{{ 'WinZip' if item == 'WiinZip' else item }}" with_items: "{{ applications_from_ansible_survey }}"
办法二:用新变量存储修正后的值
不要修改原始的APPLICATION变量,而是定义一个新变量来存修正后的名称,后续步骤都使用这个新变量:
# main.yml 中的任务 - name: 生成修正后的应用名称 set_fact: corrected_app: "{{ 'WinZip' if APPLICATION == 'WiinZip' else APPLICATION }}" # 后续任务使用修正后的变量 - name: 安装应用 win_package: name: "{{ corrected_app }}" state: present
这种方式下,原始的APPLICATION始终是循环传入的当前item,下一次循环会被自动覆盖,不会有残留值。
办法三:在使用时直接写条件表达式
如果只是个别任务需要用到修正后的名称,没必要单独设置变量,直接在任务中动态计算即可:
# main.yml 中的任务 - name: 安装应用 win_package: name: "{{ 'WinZip' if APPLICATION == 'WiinZip' else APPLICATION }}" state: present
这种方式完全不会修改原始变量,每次都根据当前循环传入的APPLICATION实时计算,不会影响下一次循环。
内容的提问来源于stack exchange,提问作者testcodezz
相关产品推荐
相关产品推荐

