我是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
,它被转换为整数,但随后再次返回为字符串。您可以对变量进行整数运算(加法,除法等),但它仍然会返回带有引号"
(source1,source2)的String结果。这就是为什么它仍然给出相同的错误。
所以我想我需要返回没有引号的变量,但我找不到一个方法,在互联网上找了几个小时。
1条答案
按热度按时间0ejtzxu11#
注意:在下面的示例中,Ansible callbackyaml用于呈现stdout。
参见:
字符串
下面的剧本解释了发生了什么
型
给(删节)
型
w1的类型是整数,w2的类型是字符串。w3的类型也是整数,因为在这个简单的赋值中没有使用Jinja。但是只要模板中有任何操作,就会使用Jinja。这就是w4是字符串的原因。
Jinja模板的结果是一个字符串。您可以使用DEFAULT_JINJA2_NATIVE更改它:
此选项在模板操作期间保留变量类型。
这使得w4的类型为整数。
型
下面的剧本将测试环境变量 worker_count
型
给(删节)
型
除非设置
ANSIBLE_JINJA2_NATIVE=true
,否则将得到字符串型
Ansible Runner也识别此选项。Python脚本
型
给(删节)
型
你也会得到字符串,除非你设置
ANSIBLE_JINJA2_NATIVE=true
型