【发布时间】:2019-09-13 05:24:02
【问题描述】:
我正在使用 Ansible 和 k8s 模块将应用程序部署到 OpenShift 集群。总的来说,这工作得很好。
但是,当我尝试在部署配置中使用变量中的值设置端口值时,事情就不那么愉快了。
我以下面的 ansible 任务为例:
- name: Create app service
k8s:
name: "{{ name | lower }}"
state: present
definition:
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
app: "{{ name | lower }}"
name: "{{ name | lower }}"
namespace: "{{ name | lower }}"
spec:
ports:
- name: "{{ port }}-tcp"
port: "{{ port }}"
protocol: TCP
targetPort: "{{ port | int }}" <--- the problem!
selector:
deploymentconfig: "{{ name | lower }}"
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
变量设置在yaml文件中,读入playbook,变量设置如port: "5000"。
如果我将其更改为port: 5000,那么它可以解决问题,但是我在其他几个地方和其他剧本中使用了这个变量,所以我更愿意保持这个变量不变。
我已尝试使用以下方法来解决此问题:
"{{ port | int }}"
我得到的错误示例是:
fatal: [localhost]: FAILED! => {"changed": false, "error": 422, "msg": "Failed to patch object: {\"kind\":\"Status\",\"apiVersion\":\"v1\",\"metadata\":{},\"status\":\"Failure\",\"message\":\"Service \\\"myapp\\\" is invalid: spec.ports[0].targetPort: Invalid value: \\\"7001\\\": must contain at least one letter or number (a-z, 0-9)\",\"reason\":\"Invalid\",\"details\":{\"name\":\"usdt-wallet\",\"kind\":\"Service\",\"causes\":[{\"reason\":\"FieldValueInvalid\",\"message\":\"Invalid value: \\\"5000\\\": must contain at least one letter or number (a-z, 0-9)\",\"field\":\"spec.ports[0].targetPort\"}]},\"code\":422}\n", "reason": "Unprocessable Entity", "status": 422}
【问题讨论】:
-
为什么不在您的 yaml 文件 (
port: 5000) 中将其指定为 int,然后在必要时将其转换为字符串?目前尚不清楚在什么情况下将其指定为 int 会失败。你确定它不会正常工作吗?总是有{{ port|str }}。 -
{"msg": "template error while templating string: no filter named 'str'. String: {{ port|str }}"}的错误。我认为“k8s”模块不适用于过滤器。一些工作,例如lower但str不是
标签: kubernetes ansible openshift