如何在Ansible循环中存储变量值?
如何在Ansible循环中存储变量值?
嘿,我来帮你搞定这个问题!你想把循环里的{{ item }}值存到变量里,结合你给出的任务代码,我给你几个实用的方案:
方案1:在每次循环中存储单个item值(供角色内部使用)
如果你只是希望每次调用role1时,把当前循环的item值存成变量供角色内部使用,最简单的方式是直接在角色的任务里用set_fact存储:
# role1/tasks/main.yml 中的内容 - name: 将当前循环的item存入变量current_item set_fact: current_item: "{{ item }}"
这样每次循环调用role1时,current_item变量就会被设置为当前迭代的item值,你可以在角色的后续任务里直接使用这个变量。
方案2:收集所有循环的item值到一个列表变量
要是你想把整个循环里的所有item值都收集起来,存成一个全局列表变量,可以用register结合map来实现:
- name: 循环调用role并注册循环结果 include_role: name: role1 vars: template_path: "inventories/{{ ENV }}/group_vars/all" template_name: "wlc_wlb" loop: "{{ range(1, ihs_number+2) | list }}" register: loop_run_results - name: 提取所有循环的item值到all_stored_items变量 set_fact: all_stored_items: "{{ loop_run_results.results | map(attribute='item') | list }}"
执行完这两个任务后,all_stored_items就是包含所有循环item值的列表了——比如如果ihs_number是3,这个列表就是[1,2,3,4]。
方案3:循环时直接传递item到角色变量
其实你也可以不用额外存储,直接把item作为变量传递给角色,这样在角色内部直接调用这个变量就行:
- name: 循环调用role并传递item值 include_role: name: role1 vars: template_path: "inventories/{{ ENV }}/group_vars/all" template_name: "wlc_wlb" loop_item_value: "{{ item }}" # 直接把item传给角色的自定义变量 loop: "{{ range(1, ihs_number+2) | list }}"
之后在role1里直接用{{ loop_item_value }}就能访问当前的循环值,这种方式更直接,不需要额外的set_fact操作。
备注:内容来源于stack exchange,提问作者tima
相关产品推荐
相关产品推荐

