kubernetes 使用变量时返回不带引号的整数值

mfuanj7w  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(107)

我是Ansible的新手(大约1周的经验)。我有这个剧本,它使用模块kubernetes.core.k8s在我的Kubernetes集群中创建一个部署。

...
  vars:
    worker_count: "{{ lookup('ansible.builtin.env', 'worker_count') }}"
  tasks:
    - name: Create a deployment
      kubernetes.core.k8s:
        state: present
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: worker
            namespace: default
            labels:
              app: worker
          spec:
            replicas: "{{ worker_count }}"  <--- the problem
            selector:
              matchLabels:
                app: worker
...

字符串
vars部分,我从env var中检索worker_count,并在replicas字段中使用它。
当我尝试用Python包ansible_runner运行它时:

import ansible_runner
ansible_runner.run(playbook="path/to/pb", envvars={"worker_count": 5})


我得到了错误(我尝试用ansible-playbook CLI运行playbook,得到了相同的错误)。
致命:[localhost]:太棒了!=> {“changed”:false,“error”:400,“msg”:“部署工人:无法创建对象:b'{“kind”:“Status”,“apiVersion”:“v1”,“metadata”:{},“status”:“Failure”,“message”:“Deployment in version \“v1\”cannot be handled as a Deployment:json:cannot unmarshal string into Go struct field DeploymentSpec.spec.replicas of type int32”,“reason”:“BadRequest”,“code”:400}\n'",“reason”:“Bad Request”,“status”:400}
所以我尝试将replicas行改为:

replicas: "{{ worker_count | int }}"


但它仍然给出相同的错误。我的理解是,通过使用额外的| int,它被转换为整数,但随后再次返回为字符串。您可以对变量进行整数运算(加法,除法等),但它仍然会返回带有引号"source1source2)的String结果。这就是为什么它仍然给出相同的错误。
所以我想我需要返回没有引号的变量,但我找不到一个方法,在互联网上找了几个小时。

0ejtzxu1

0ejtzxu11#

注意:在下面的示例中,Ansible callbackyaml用于呈现stdout。
参见:

  • 默认值_STDOUT_回调
  • community.general.yaml回调
  • 或者,在CLI中显示帮助
ansible-doc -t callback yaml

字符串
下面的剧本解释了发生了什么

shell> cat pb2.yml
- hosts: localhost

  vars:

    w1: 5
    w2: '5'
    w3: "{{ w1 }}"
    w4: "{{ w1 + 1 - 1 }}"

  tasks:

    - debug:
        msg: |
          w1: {{ w1 }}
          w1|type_debug: {{ w1|type_debug }}
          w2: {{ w2 }}
          w2|type_debug: {{ w2|type_debug }}
          w3: {{ w3 }}
          w3|type_debug: {{ w3|type_debug }}
          w4: {{ w4 }}
          w4|type_debug: {{ w4|type_debug }}


给(删节)

shell> ansible-playbook pb2.yml
  ...
  msg: |-
    w1: 5
    w1|type_debug: int
    w2: 5
    w2|type_debug: AnsibleUnicode
    w3: 5
    w3|type_debug: int
    w4: 5
    w4|type_debug: str


w1的类型是整数,w2的类型是字符串。w3的类型也是整数,因为在这个简单的赋值中没有使用Jinja。但是只要模板中有任何操作,就会使用Jinja。这就是w4是字符串的原因。
Jinja模板的结果是一个字符串。您可以使用DEFAULT_JINJA2_NATIVE更改它:
此选项在模板操作期间保留变量类型。
这使得w4的类型为整数。

shell> ANSIBLE_JINJA2_NATIVE=true ansible-playbook pb2.yml
  ...
    w4|type_debug: int


下面的剧本将测试环境变量 worker_count

- hosts: localhost

  vars:

    worker_count: "{{ lookup('env', 'worker_count') }}"
    
    definition:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: worker
        namespace: default
        labels:
          app: worker
      spec:
        replicas: "{{ worker_count }}"
        selector:
          matchLabels:
            app: worker

  tasks:

    - debug:
        msg: |
          worker_count: {{ worker_count }}
          worker_count|type_debug: {{ worker_count|type_debug }}
          definition.spec.replicas: {{ definition.spec.replicas }}
          definition.spec.replicas|type_debug: {{ definition.spec.replicas|type_debug }}


给(删节)

shell> worker_count=5 ansible-playbook pb.yml
  ...
  msg: |-
    worker_count: 5
    worker_count|type_debug: AnsibleUnsafeText
    definition.spec.replicas: 5
    definition.spec.replicas|type_debug: AnsibleUnsafeText


除非设置ANSIBLE_JINJA2_NATIVE=true,否则将得到字符串

shell> ANSIBLE_JINJA2_NATIVE=true worker_count=5 ansible-playbook pb.yml
  ...
  msg: |-
    worker_count: 5
    worker_count|type_debug: int
    definition.spec.replicas: 5
    definition.spec.replicas|type_debug: int


Ansible Runner也识别此选项。Python脚本

shell> cat pb.py
import ansible_runner
r = ansible_runner.run(private_data_dir="/scratch/tmp7/test-565",
                       playbook="pb.yml",
                       envvars={"worker_count": 5})


给(删节)

shell> python3 pb.py

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "worker_count: 5\nworker_count|type_debug: AnsibleUnsafeText\ndefinition.spec.replicas: 5\ndefinition.spec.replicas|type_debug: AnsibleUnsafeText\n"
}
  ...


你也会得到字符串,除非你设置ANSIBLE_JINJA2_NATIVE=true

shell> ANSIBLE_JINJA2_NATIVE=true python3 pb.py

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "worker_count: 5\nworker_count|type_debug: int\ndefinition.spec.replicas: 5\ndefinition.spec.replicas|type_debug: int\n"
}
  ...

相关问题