Ansible部署Kubernetes Ingress时遭遇YAML语法错误:mapping values are not allowed in this context
解决Ansible部署K8s Ingress时的YAML语法错误
我刚碰到过几乎一模一样的问题,来帮你排查下!你的错误提示「Syntax Error while loading YAML. mapping values are not allowed in this context」主要来自两个语法问题,逐一拆解如下:
1. Host字段的多余闭合大括号
你在spec.rules[0].host里写了"{MY_DOMAIN}}",这里多了一个额外的},这会直接触发YAML解析失败。如果MY_DOMAIN是Ansible变量,应该写成:
host: "{{ MY_DOMAIN }}"
如果是K8s侧的静态占位符(不需要Ansible解析),则改为:
host: "{MY_DOMAIN}"
2. Annotation中的特殊字符串解析冲突
错误提示指向的nginx.ingress.kubernetes.io/auth-url行,问题出在双引号包裹的字符串里包含:和$开头的变量占位符:
YAML解析器会把双引号内https://$host/...中的:误认为是新的键值对分隔符,再加上Ansible会尝试解析双引号内$开头的内容为自身变量,双重逻辑冲突导致了解析报错。
解决方法是把这两个annotation的值改用单引号包裹,让YAML将其识别为纯字符串,不进行任何变量解析或语法识别:
nginx.ingress.kubernetes.io/auth-url: 'https://$host/oauth2/auth' nginx.ingress.kubernetes.io/auth-signin: 'https://$host/oauth2/start?rd=$escaped_request_uri'
修正后的完整Ingress任务代码
- name: Create K8s ingress k8s: api_version: networking.k8s.io/v1 namespace: "{{ namespace }}" definition: kind: Ingress metadata: name: "{{ namespace }}-ingress" annotations: nginx.ingress.kubernetes.io/backend-protocol: HTTP nginx.ingress.kubernetes.io/auth-url: 'https://$host/oauth2/auth' nginx.ingress.kubernetes.io/auth-signin: 'https://$host/oauth2/start?rd=$escaped_request_uri' nginx.ingress.kubernetes.io/force-ssl-redirect: 'false' nginx.ingress.kubernetes.io/hsts: 'false' nginx.ingress.kubernetes.io/ssl-redirect: 'false' nginx.ingress.kubernetes.io/websocket-services: core-service nginx.org/websocket-services: core-service spec: rules: - host: "{{ MY_DOMAIN }}" http: paths: - backend: service: name: "wordpress" port: number: 80 path: / pathType: ImplementationSpecific
额外说明
K8s Ingress的annotation值本质都是字符串,所以像'false'这种用单引号包裹布尔值的写法是正确的,能避免YAML将其解析为布尔类型导致K8s API报错。
内容的提问来源于stack exchange,提问作者SSAR
相关产品推荐
相关产品推荐

