Ansible 变量转换为 int 被忽略

问题描述 投票:0回答:1

使用 Ansible,我想找到 K8s 集群上某个范围内哪个端口可用,并使用此端口临时公开服务。

我能够找到并提取端口,但是当我使用该端口声明 Nodeport 时,任务失败。

ansible 似乎没有使用指令 {{ port|int }} 将我的“port”变量转换为 int。

- block:
    - name: List all ports in range 32200 to 32220
      wait_for:
        port: "{{ item|int }}"
        timeout: 1
        state: stopped
        msg: "Port {{ item }} is already in use"
      register: available_ports
      with_sequence: start=32200 end=32220
      ignore_errors: yes

    - name: extract first unused port from list
      set_fact:
        port: "{{ available_ports.results | json_query(\"[? state=='stopped'].port\") | first }}"
    
- debug:
        var: port
    
- name: Expose service as a nodeport service
  k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Service
      metadata:
        name: "{{ namespace }}-service-nodeport"
        namespace: "{{ namespace }}"
      spec:
        type: NodePort
        selector:
          component: my-app
        ports:
          - protocol: TCP
            targetPort: 5432
            nodePort: "{{ port|int }}"
            port: 5432

输出以下内容:

TASK [../roles/my-role : debug] ***************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "port": "32380"
}

TASK [../roles/my-role : Expose service as a nodeport service] *******************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": false, "error": 400, "msg": "Failed to create object: b'{\"kind\":\"Status\",\"apiVersion\":\"v1\",\"metadata\":{},\"status\":\"Failure\",\"message\":\"Service in version \\\\\"v1\\\\\" cannot be handled as a Service: v1.Service.Spec: v1.ServiceSpec.Ports: []v1.ServicePort: v1.ServicePort.NodePort: readUint32: unexpected character: \\\\ufffd, error found in #10 byte of ...|dePort\\\\\": \\\\\"32380\\\\\", \\\\\"p|..., bigger context ...|rotocol\\\\\": \\\\\"TCP\\\\\", \\\\\"targetPort\\\\\": 5432, \\\\\"nodePort\\\\\": \\\\\"32380\\\\\", \\\\\"port\\\\\": 5432}]}}|...\",\"reason\":\"BadRequest\",\"code\":400}\\n'", "reason": "Bad Request", "status": 400}

如果我将节点端口设置为固定值,例如 32800,它就可以工作。

kubernetes service ansible
1个回答
0
投票

也许这不是你的情况,但我解决了我的问题。

我在地图中有变量,其中所有变量都是字符串...... 由于 k8s 是用 GO 编写的,因此您不能拥有多种类型的映射,因此请尝试将变量移至其他位置。

© www.soinside.com 2019 - 2024. All rights reserved.