json - JSON 文件中的 Ansible 变量替换问题
问题描述
我有一个 JSON 文件,其中包含我要创建用户的用户详细信息。如果 JSON 中的所有内容都是纯文本,则一切正常。但是,我想将密码保存在 Ansible 保险库中,并将其从那里读入我的 JSON。但是,当我加载文件时,变量没有被密码替换。我可以打印以纯文本形式打印密码的密码变量。
我需要将用户详细信息作为 JSON 对象提供给使用该信息创建用户的 API 之一。我的密码在 ansible 保险库中。我有一个带有此密码的 ansible 哈希的变量。我的 JSON 文件如下所示。
{"Users":
[
{
"databaseName" : "admin",
"roles" : [ {
"databaseName" : "admin",
"roleName" : "readAnyDatabase"
} ],
"username" : "AnsibleReadUser",
"password" : "{{ apikey }}"
},
{
"databaseName" : "admin",
"roles" : [ {
"databaseName" : "admin",
"roleName" : "readWriteAnyDatabase"
} ],
"username" : "AnsibleReadWriteUser",
"password" : "{{ apikey }}"
}
]
}
这是我加载 JSON 文件的可靠任务。
- name: Load Input files
set_fact:
userinfo_json: "{{ lookup('file', 'UserDetails.json') | from_json }}"
当我打印“userinfo_json”的内容时,变量不会被替换。
"msg": "UserDetails JSON: {'Users': [{'databaseName': 'admin', 'roles': [{'databaseName': 'admin', 'roleName': 'readAnyDatabase'}], 'username': 'AnsibleReadUser', 'password': '{{ apikey }}'}, {'databaseName': 'admin', 'roles': [{'databaseName': 'admin', 'roleName': 'readWriteAnyDatabase'}], 'username': 'AnsibleReadWriteUser', 'password': '{{ apikey }}'}]}"
}
我希望将 {{ apikey }}' 替换为变量值。
{"Users":
[
{
"databaseName" : "admin",
"roles" : [ {
"databaseName" : "admin",
"roleName" : "readAnyDatabase"
} ],
"username" : "AnsibleReadUser",
"password" : "Password"
},
{
"databaseName" : "admin",
"roles" : [ {
"databaseName" : "admin",
"roleName" : "readWriteAnyDatabase"
} ],
"username" : "AnsibleReadWriteUser",
"password" : "Password"
}
]
}
解决方案
lookup('file', ...
过滤器(from_yaml
对我有用,失败)都from_jason
不会扩展变量
vars:
apikey: my-secret-apikey
tasks:
- set_fact:
userinfo_json: "{{ lookup('file', 'UserDetails.json') | from_yaml }}"
- debug:
msg: "{{ userinfo_json.Users|json_query('[*].password') }}"
上面的任务给
"msg": [
"{{ apikey }}",
"{{ apikey }}"
]
改用include_vars _
vars:
apikey: my-secret-apikey # replace with vault encrypted variable
tasks:
- name: Load Input files
include_vars:
file: UserDetails.json
name: userinfo_json
- debug:
var: userinfo_json
这给
"userinfo_json": {
"Users": [
{
"databaseName": "admin",
"password": "my-secret-apikey",
"roles": [
{
"databaseName": "admin",
"roleName": "readAnyDatabase"
}
],
"username": "AnsibleReadUser"
},
{
"databaseName": "admin",
"password": "my-secret-apikey",
"roles": [
{
"databaseName": "admin",
"roleName": "readWriteAnyDatabase"
}
],
"username": "AnsibleReadWriteUser"
}
]
}
笔记。name: userinfo_json
没有必要。如果省略此参数,用户列表将存储在变量中Users
。
使用vars_files可以达到相同的结果
vars:
apikey: my-secret-apikey
vars_files:
- UserDetails.json
tasks:
- debug:
var: Users
问:“ I was trying to load two files as below. But only anotherfileinfo_json has the json content and userinfo_json is empty.
”
- include_vars:
file: UserDetails.json
name: userinfo_json
file: AnotherFile.json
name: anotherfileinfo_json
A:查看示例,以下任务应该有效
- include_vars: "{{ lookup('file', my_files) }}"
vars:
my_files:
- UserDetails.json
- AnotherFile.json
推荐阅读
- jquery - 使用jQuery将文本从最近的元素复制到字段中
- docker - Docker拒绝端口443上的连接
- apache2 - mod_auth_openidc 错误 400 错误请求 - cookie 太多(?)
- turing-machines - 图灵机与计算机相比如何?
- swift - 我的 Swift 代码出现错误 Can't form range with upperbound < lowerbound
- python-2.7 - 使用 LinkedIn API 回复评论时是否有任何问题
- javascript - 多个 Vue 实例绑定到父子元素
- python - 我需要消除特征之间的多重共线性
- pandoc - Pandoc HTML 到 DOCX 使用模板
- c# - 我无法在多行文本文件中打印richTextBox.Text