Ansible命令行传入环境参数调用对应嵌套变量报错如何解决?
错误原因
你通过-e env=preprod传入的env是纯字符串类型,仅代表"preprod"这个文本值,Ansible不会自动将其映射到vars文件中同名的配置对象,所以调用.name属性时会抛出字符串无该属性的报错。
解决方案
两种实现方案都可以满足你通过命令行动态传环境、不写死配置的需求:
方案1:直接修改模板(操作最简)
把模板中所有{{ env.name }}替换为{{ vars[env].name }}即可。vars是Ansible的内置变量,存储了所有已加载的变量值,通过vars[env]可以动态获取到和传入的环境名匹配的配置对象。
修改后的模板对应部分示例:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: {{ vars[env].name }} name: {{ vars[env].name }} namespace: default # 其余位置的env.name全部按上述规则替换即可
方案2:Playbook中提前预处理变量(可读性更高)
如果不想在模板中写太长的变量调用,可以在Playbook的任务中先将对应环境的配置提取为单独变量:
- name: 加载对应环境配置 set_fact: env_conf: "{{ vars[env] }}"
后续模板中直接使用{{ env_conf.name }}调用即可,后续如果要扩展环境的其他配置项,也可以直接通过env_conf.xxx调用,维护更方便。
内容的提问来源于stack exchange,提问作者smc
相关产品推荐
相关产品推荐

