【问题标题】:Ansible, k8s and variablesAnsible、k8s 和变量
【发布时间】: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”模块不适用于过滤器。一些工作,例如lowerstr 不是

标签: kubernetes ansible openshift


【解决方案1】:

根据发布的错误消息,您的问题不是|int|string——尽管我同意错误消息具有误导性:

"message": "服务\"usdt-wallet\" 无效:spec.ports[0].targetPort:无效值:\"70001\":必须至少包含一个字母或数字(az, 0- 9)",

但这是由于尝试使用 70001 作为目标端口造成的,但 TCP 端口必须在 1 到 65535 的范围内,如the fine manual 所述

【讨论】:

  • 很好的定位。我最初尝试使用端口 7000,但将其更改为 70001 以检查我的更改是否被拾取。但是,错误是关于从变量中误读的值。
  • 呃,是 |string 不是 |str ?
猜你喜欢
  • 2022-08-20
  • 2022-01-23
  • 2015-12-18
  • 2017-08-30
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多