Ansible Playbook角色循环调用时{{ item }}变量未定义问题求助
问题根因
- 第一:Ansible 不支持直接在
roles字段的行内角色定义中使用loop并将item变量传递到角色内部任务,你在角色定义行写的loop不会把迭代值传给角色里的参数,所以会报item未定义。 - 第二:你在角色的
vars/main.yml里的days变量定义语法错误:不需要加外层的vars:字段,其次lookup函数需要包裹在{{ }}里才能执行;另外还有变量加载顺序问题:你把days定义在角色内部,但是在playbook调用角色的时候就引用了days变量,此时角色还没加载,days变量还未生效。
修复步骤
- 先修正
roles/remove-snapshot/vars/main.yml的语法:
# 修正后的 vars/main.yml 内容,去掉外层vars字段,给lookup加执行标记 days: - "{{ lookup('pipe', 'date +\"%F\"') }}" - "{{ lookup('pipe', 'date -d \"-1 days\" +\"%F\"') }}" - "{{ lookup('pipe', 'date -d \"-2 days\" +\"%F\"') }}" - "{{ lookup('pipe', 'date -d \"-3 days\" +\"%F\"') }}"
- 修改playbook的角色调用方式,把行内角色调用改成任务级的
include_role调用,loop加在任务上就能正确传递item变量,不需要修改原有角色的任务代码,也不需要新建角色:
- name: Managing Snapshot(s) hosts: "{{ target }}" become: false gather_facts: no roles: - confirm tasks: # 已定义ssn参数的场景 - name: 删除指定名称的快照 include_role: name: remove-snapshot vars: snapshot_state: "{{ sss | default('absent') }}" snapshot_name: "{{ ssn }}" when: ssn is defined # 未定义ssn参数的场景,循环删除对应日期快照 - name: 循环删除近4天的快照 include_role: name: remove-snapshot vars: snapshot_state: "{{ sss | default('absent') }}" snapshot_name: "{{ item }}" loop: "{{ days }}" when: ssn is undefined
内容的提问来源于stack exchange,提问作者Sergante
相关产品推荐
相关产品推荐

