如何在不使用引号的情况下使用 k8s Ansible 模块?

Tha*_*nos 2 ansible kubernetes

我正在尝试使用模块community.kubernetes.k8s \xe2\x80\x93 使用角色中的变量(例如role/sampleRole/vars 文件)管理Kubernetes (K8s) 对象。

\n

当涉及到整数点时我失败了,例如:

\n
- name: sample                                                                                                                                                         \n  community.kubernetes.k8s:                                                                                                                                                                                                                      \n  state: present                                                                                                                                                                                                                               \n  definition:                                                                                                                                                                                                                                    \n    apiVersion: apps/v1                                                                                                                                                                                                                          \n    kind: Deployment                                                                                                                                                                                                                             \n    metadata:                                                                                                                                                                                                                                      \n      name: "{{ name }}"\n      namespace: "{{ namespace }}"                                                                                                                                                                                             \n      labels:\n        app: "{{ app }}"                                                                                                                                                                                              \n    spec:\n      replicas: 2\n        selector:\n          matchLabels:\n            app: "{{ app }}"                                                                                                                                                                                    \n        template:\n          metadata:\n            labels:\n              app: "{{ app }}"                                                                                                                                                                                \n          spec:\n            containers:\n            - name: "{{ name }}"                                                                                                                                                                                  \n              image: "{{ image }}"                                                                                                                                                                                \n              ports:\n              - containerPort: {{ containerPort }}\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用这种格式进行部署时,显然它会失败,因为它无法解析对 var 的“引用”。

\n

错误示例:

\n
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:\nJSON: Expecting value: line 1 column 1 (char 0)\n\nSyntax Error while loading YAML.\n  found unacceptable key (unhashable type: \'AnsibleMapping\')\n\nThe error appears to be in \'deploy.yml\': line <some line>, column <some column>, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n              ports:\n              - containerPort: {{ containerPort }}\n                                ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n    with_items:\n      - {{ foo }}\n\nShould be written as:\n\n    with_items:\n      - "{{ foo }}"\n
Run Code Online (Sandbox Code Playgroud)\n

当我在变量上使用引号时,例如- containerPort: "{{ containerPort }}",我收到以下错误(部分错误):

\n
v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.Ports: []v1.ContainerPort: v1.ContainerPort.ContainerPort: readUint32: unexpected character: \\\\\\\\ufffd, error found in #10 byte of ...|nerPort\\\\\\\\\\":\\\\\\\\\\"80\\\\\\\\\\"}]}],\\\\\\\\\\"d|..., bigger context ...|\\\\\\\\\\",\\\\\\\\\\"name\\\\\\\\\\":\\\\\\\\\\"samplegreen\\\\\\\\\\",\\\\\\\\\\"ports\\\\\\\\\\":[{\\\\\\\\\\"containerPort\\\\\\\\\\":\\\\\\\\\\"80\\\\\\\\\\"}]}],\\\\\\\\\\"dnsPolicy\\\\\\\\\\":\\\\\\\\\\"ClusterFirst\\\\\\\\\\",\\\\\\\\\\"restartPolicy\\\\\\\\\\"|...\\",\\"field\\":\\"patch\\"}]},\\"code\\":422}\\\\n\'", "reason": "Unprocessable Entity", "status": 422}\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试使用 using 将字符串转换为 int- containerPort: "{{ containerPort | int }}"但没有成功。问题似乎来自引号,独立于我如何在 var 文件中定义 var,例如containerPort: 80containerPort: "80"

\n

我在Ansible、k8s 和变量论坛上发现了类似的问题,但用户似乎没有遇到与我相同的问题。

\n

我正在使用该模块的最新版本运行:

\n
$ python3 -m pip show openshift\nName: openshift\nVersion: 0.11.2\nSummary: OpenShift python client\nHome-page: https://github.com/openshift/openshift-restclient-python\nAuthor: OpenShift\nAuthor-email: UNKNOWN\nLicense: Apache License Version 2.0\nLocation: /usr/local/lib/python3.8/dist-packages\nRequires: ruamel.yaml, python-string-utils, jinja2, six, kubernetes\n
Run Code Online (Sandbox Code Playgroud)\n

有没有解决这个问题的方法或者它是一个错误?

\n

更新(08-01-2020):该问题已在版本 0.17.0 上修复。

\n
$ python3 -m pip show k8s\nName: k8s\nVersion: 0.17.0\nSummary: Python client library for the Kubernetes API\nHome-page: https://github.com/fiaas/k8s\nAuthor: FiaaS developers\nAuthor-email: fiaas@googlegroups.com\nLicense: Apache License\nLocation: /usr/local/lib/python3.8/dist-packages\nRequires: requests, pyrfc3339, six, cachetools\n
Run Code Online (Sandbox Code Playgroud)\n

lar*_*sks 5

您可以尝试以下解决方法;在此示例中,我们创建一个文本模板,然后使用from_yaml过滤器将其转换为我们所需的数据结构:

- name: sample                                                                                                                                                         
  community.kubernetes.k8s:                                                                                                                                                                                                                      
    state: present                                                                                                                                                                                                                               
    definition:                                                                                                                                                                                                                                    
      apiVersion: apps/v1                                                                                                                                                                                                                          
      kind: Deployment                                                                                                                                                                                                                             
      metadata:                                                                                                                                                                                                                                      
        name: "{{ name }}"
        namespace: "{{ namespace }}"                                                                                                                                                                                             
        labels:
          app: "{{ app }}"                                                                                                                                                                                              
      spec: "{{ spec|from_yaml }}"
  vars:
    spec: |
      replicas: 2
        selector:
          matchLabels:
            app: "{{ app }}"                                                                                                                                                                                    
        template:
          metadata:
            labels:
              app: "{{ app }}"                                                                                                                                                                                
          spec:
            containers:
            - name: "{{ name }}"                                                                                                                                                                                  
              image: "{{ image }}"                                                                                                                                                                                
              ports:
              - containerPort: {{ containerPort }}
Run Code Online (Sandbox Code Playgroud)