Я использую Ansible и модуль k8s
для развертывания приложений в кластере OpenShift. В целом это работает очень хорошо.
Однако, когда я пытаюсь установить значение порта в конфигурации развертывания, используя значение из переменной, все не так радует.
У меня в качестве примера приведено следующее задание:
- 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}