ansible - 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.name
as的值替换。nginx
我希望用户在命令行上提供env
via的值-e
,如果我喜欢preprod.name
直接在模板上,它似乎可以工作,但我不希望那样。
我希望这能澄清我正在尝试做的事情,但它没有奏效。我可以知道我错过了什么吗?
解决方案
此错误消息表明在命令行上传递的额外 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'] }}"
使用这种方法,prod
和preprod
键将在 下可用testvars
,并且可以用变量引用,例如env
.
然后模板应该使用_name
变量,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ _name }}
推荐阅读
- r - 在R中使用nls函数的可变长度不同错误
- zend-framework - Zend - 动态表单下拉菜单
- java - 如何向后打印数字以便显示以下输出?
- java - 这个的输出是 20 但如何?
- javascript - Hightcharts getTimezoneOffset 错误 moment_1.default.tz 不是函数
- reactjs - 在 fetch json api 中搜索
- r - 将数据与 Datamaps 包中的地图合并。
- php - 如何在codeigniter中获取控制器方法参数?
- mysql - 对两列进行分组时删除冗余
- android - 从 MapActivity 中选择 Address 并返回 MainActivity