如何在Ansible命令行传递嵌套结构的子变量
解决Ansible命令行传递嵌套点符号变量的问题
没问题,这个需求完全可以实现,关键是要在命令行用JSON/YAML格式传递嵌套变量,而不是普通的key=value形式,这样就能不用修改playbook里的变量引用方式。
为什么之前的方法会报错?
当你尝试用--extra-vars "source.git_instance_url=bar.baz.com"传递时,Ansible会把source.git_instance_url当作一个扁平的变量名,而不是source字典下的git_instance_url键。因为你已经从extra-vars.json里移除了source.git_instance_url,此时source这个字典在变量中并未被完整定义,自然会出现source is undefined的错误。
正确的命令传递方式
你可以通过在命令行传入JSON或YAML格式的嵌套结构变量,让Ansible识别出这是source字典的一部分,和extra-vars.json里的现有source字段自动合并:
方式1:JSON格式传递
ansible-playbook your-playbook.yml --extra-vars "@extra-vars.json" --extra-vars '{"source": {"git_instance_url": "bar.baz.com"}}'
方式2:YAML格式传递
如果你的shell支持,也可以用YAML语法传递:
ansible-playbook your-playbook.yml --extra-vars "@extra-vars.json" --extra-vars "source: {git_instance_url: bar.baz.com}"
原理说明
Ansible会自动合并多个--extra-vars参数的内容:
extra-vars.json里的source包含access_token和repo字段- 命令行传入的
source包含git_instance_url字段
两者合并后,source字典就拥有了完整的三个字段,playbook里的{{ source.git_instance_url }}、{{ source.access_token }}等引用都能正常工作,完全不需要修改playbook里的变量调用方式。
注意事项
- 使用JSON格式时,建议用单引号包裹整个JSON字符串,避免shell解析里面的双引号导致格式错误
- 如果需要传递多个嵌套变量,可以在同一个JSON/YAML字符串里添加更多字段,比如
'{"source": {"git_instance_url": "bar.baz.com"}, "target": {"key": "value"}}'
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

