Ansible字典变量无法解析,访问时提示变量未定义
问题
我在Ansible中创建了如下字典变量:
sw_version: v9_0_7: src_copy: "files/9_0_7/Splunk Forwarder/" dest_copy: 'C:\\temp\\source_software_package\\9.0.7\\Splunk_Forwarder' source_package_path: "{{dest_copy}}\\Installer.exe" inst_creates_path: 'C:\\Program Files\\SplunkUniversalForwarder\\bin\\splunk.exe' product_ID: '{XXXXXX-91DB-406D-XXXX-4E92366B381B}' product_VERSION: '9.7.1.1.0'
当我尝试以"{{ sw_version['v9_0_7']['dest_copy'] }}"的方式访问该变量时,始终报错:
"sw_version": "VARIABLE IS NOT DEFINED!"
但如果将所有键的值替换为简单字符串(如下所示),就能正常解析该变量:
sw_version: v9_0_7: src_copy: a dest_copy: b source_package_path: c inst_creates_path: d product_ID: e product_VERSION: f
请问我需要做哪些修正才能解决此问题?
解决方案
问题根源是source_package_path字段的定义:你在字典内部直接使用{{dest_copy}}引用变量,但此时dest_copy还在字典的解析过程中,Ansible无法在构建字典的阶段解析内部的变量引用,导致整个sw_version字典解析失败,最终触发“变量未定义”的错误。
可以通过以下两种方式修正:
方法一:使用self关键字引用字典内部字段
利用Ansible的self关键字指向当前字典层级,修改source_package_path的定义:
sw_version: v9_0_7: src_copy: "files/9_0_7/Splunk Forwarder/" dest_copy: 'C:\\temp\\source_software_package\\9.0.7\\Splunk_Forwarder' source_package_path: "{{ self.dest_copy }}\\Installer.exe" inst_creates_path: 'C:\\Program Files\\SplunkUniversalForwarder\\bin\\splunk.exe' product_ID: '{XXXXXX-91DB-406D-XXXX-4E92366B381B}' product_VERSION: '9.7.1.1.0'
方法二:拆分变量定义流程
先定义不包含变量引用的基础字典,再单独为source_package_path赋值,此时sw_version已完成解析:
sw_version: v9_0_7: src_copy: "files/9_0_7/Splunk Forwarder/" dest_copy: 'C:\\temp\\source_software_package\\9.0.7\\Splunk_Forwarder' inst_creates_path: 'C:\\Program Files\\SplunkUniversalForwarder\\bin\\splunk.exe' product_ID: '{XXXXXX-91DB-406D-XXXX-4E92366B381B}' product_VERSION: '9.7.1.1.0' sw_version.v9_0_7.source_package_path: "{{ sw_version.v9_0_7.dest_copy }}\\Installer.exe"
两种方法都能让Ansible正确解析sw_version字典,消除变量未定义的错误。
内容的提问来源于stack exchange,提问作者user12007109
相关产品推荐
相关产品推荐

