Ansible剧本中途能否使用vars定义变量及语法报错排查
问题修复方案
错误原因
- 核心语法错误为
vars块的缩进位置非法:vars是block的同级属性,不能插入到block的任务列表中间,YAML解析时无法识别插入在任务中间的vars字段,就会抛出「未找到预期key」的报错 - 额外不规范点:存在空的
name字段,部分Ansible版本会校验name非空,也可能触发异常 - 关于中途定义变量的疑问:Ansible支持执行过程中定义变量,静态变量可以写在play/block/role级别的vars中,动态赋值则用
set_fact模块即可
补充说明:你修正语法后运行会发现Hello 2会正常打印,因为你给ntpServer赋值为initVal,不等于空字符串,符合when的判断条件,如果要让条件不成立可以把ntpServer的值设为空字符串即可。
语法修正后的最小可运行示例
--- - name: Chrony Service Setup hosts: localhost gather_facts: no vars: ntpServers: [] tasks: - name: "Ask user if they wish to add their own NTP servers" pause: prompt: "Do you want to add unique NTP server (y/n)?" register: result - set_fact: addNTP: "{{ result.user_input | lower }}" - block: - name: 打印测试信息1 debug: msg: "Hello" - block: - name: 打印测试信息2 debug: msg: "Hello 2" when: ntpServer != "" vars: ntpServer: "initVal" when: addNTP == "y"
实现「收集用户输入NTP地址存入列表」的完整剧本
如果要多次收集用户输入直到用户停止,可以用include_tasks循环实现,示例如下:
--- - name: Chrony Service Setup hosts: localhost gather_facts: no vars: ntpServers: [] tasks: - name: 询问是否需要自定义NTP服务器 pause: prompt: "是否需要添加自定义NTP服务器 (y/n)?" register: ntp_confirm_result - set_fact: add_custom_ntp: "{{ ntp_confirm_result.user_input | lower }}" - block: - name: 循环收集NTP服务器地址 include_tasks: input_ntp.yml loop: [1,2,3,4,5] # 最多支持添加5个,可自行调整 when: continue_add_ntp | default('y') == 'y' - name: 打印最终收集到的NTP服务器列表 debug: var: ntpServers when: add_custom_ntp == 'y'
同目录下新建input_ntp.yml文件,内容如下:
--- - name: 输入NTP服务器地址/域名,输入空则停止添加 pause: prompt: "请输入第 {{ ansible_loop.index }} 个NTP服务器地址,直接回车结束输入" register: ntp_input_result - set_fact: continue_add_ntp: "{{ 'n' if ntp_input_result.user_input == '' else 'y' }}" - name: 将合法输入添加到NTP列表 set_fact: ntpServers: "{{ ntpServers + [ntp_input_result.user_input] }}" when: ntp_input_result.user_input != ''
内容的提问来源于stack exchange,提问作者Ruth Edges
相关产品推荐
相关产品推荐

