如何通过Ansible extra-vars传递字典列表?遇变量未定义错误
解决Ansible通过extra-vars传递字典列表的问题
你遇到的错误根源是:传递的real_servers_list是单个字典,而非字典组成的列表。Playbook里应该是在遍历列表元素,单个字典会被当成非列表类型处理,导致访问real_server_index属性时失败。
下面是几种正确的传递方式:
方式一:JSON格式传递列表
传递单个字典的列表
把字典包裹在数组[]内,执行命令:
ansible-playbook configure-l4.yaml -e '{"real_servers_list": [{"real_server_ip":"1.1.1.1", "real_server_index":"RealServer1"}]}'
传递多个字典的列表
直接扩展数组内容即可:
ansible-playbook configure-l4.yaml -e '{"real_servers_list": [{"real_server_ip":"1.1.1.1", "real_server_index":"RealServer1"}, {"real_server_ip":"1.1.1.2", "real_server_index":"RealServer2"}]}'
方式二:YAML格式传递
如果觉得JSON写起来繁琐,可用YAML格式,注意shell的引号处理:
ansible-playbook configure-l4.yaml -e "real_servers_list: - real_server_ip: 1.1.1.1 real_server_index: RealServer1 - real_server_ip: 1.1.1.2 real_server_index: RealServer2"
也可以把YAML内容写入文件(比如vars.yml):
# vars.yml real_servers_list: - { real_server_ip: 1.1.1.1, real_server_index: RealServer1 } - { real_server_ip: 1.1.1.2, real_server_index: RealServer2 }
再通过@引用文件执行命令:
ansible-playbook configure-l4.yaml -e @vars.yml
这样Playbook遍历real_servers_list时,就能正确获取每个字典的real_server_ip和real_server_index属性。
内容的提问来源于stack exchange,提问作者Etai Kol
相关产品推荐
相关产品推荐

