首页 > 解决方案 > Ansible 中的调用变量

问题描述

为这个简单的问题道歉,但我尝试了各种方法但没有成功。

这是我的 vars 文件

---
preprod:
  name: nginx
prod:
  name: apache

我正在尝试name根据用户提供的环境名称(preprod、prod 等)传递 的值。这是我的模板

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: {{ env.name }} 
  name: {{ env.name }}
  namespace: default
spec:
  selector:
    matchLabels:
      app: {{ env.name }}
  template:
    metadata:
      labels:
        app: {{ env.name }}
    spec:
      containers:
      - image: {{ env.name }}
        imagePullPolicy: Always
        name: {{ env.name }}
        resources: {}

但是,当我尝试使用以下命令时:

ansible-playbook playbook.yaml -e env=preprod

我收到以下错误。

fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'str object' has no attribute 'name'"}

我的期望是在这种情况下{{ env.name }}应该用preprod.nameas的值替换。nginx

我希望用户在命令行上提供envvia的值-e,如果我喜欢preprod.name直接在模板上,它似乎可以工作,但我不希望那样。

我希望这能澄清我正在尝试做的事情,但它没有奏效。我可以知道我错过了什么吗?

标签: ansiblejinja2

解决方案


此错误消息表明在命令行上传递的额外 var-e是一个字符串,而不是我们从 vars 文件加载的 dict 的键(我们期望)。

我正在编写一个示例剧本,因为您没有展示如何加载 vars 文件。我正在使用include_vars,因为我们可以命名要加载 dict 的变量。

    # include vars with a name, so that we can access testvars[env]
    - include_vars:
        file: testvars.yml
        name: testvars
    - template:
        src: test/deployment.yaml.j2
        dest: /tmp/deployment.yaml
      vars:
        _name: "{{ testvars[env]['name'] }}"

使用这种方法,prodpreprod键将在 下可用testvars,并且可以用变量引用,例如env.

然后模板应该使用_name变量,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: {{ _name }} 

推荐阅读