json - JSON 文件中的 Ansible 变量替换问题

标签 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 文件的 ansible 任务。

- 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

答:查看 Examples下面的任务应该有效

  - include_vars: "{{ lookup('file', my_files) }}"
    vars:
      my_files:
        - UserDetails.json
        - AnotherFile.json

关于json - JSON 文件中的 Ansible 变量替换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56955725/

相关文章:

c# - ASP.NET MVC ModelBinder 自定义字段映射

json - swift json 解析返回可选

ansible - 为多个 import_playbook 包含文件中的变量

python - 如何使用 ansible 和 module portinstall 安装 FreeBSD port?

Ansible:查找文件并遍历路径

ansible - 使用 lineinfile 插入行但未按预期工作

python - 如何将 pandas 列中的 JSON 数据转换为新列

python - Pandas to_dict 不希望地修改 float

php - PHP 中的 REST 与 RPC

ansible - 使用 ansible 在远程主机上启动长时间运行的进程