Dictionary 该任务包括一个带有未定义变量的选项。错误是';ansible.utils.unsafe_proxy.AnsibleUnsafeText对象';没有属性';数据'\N

Dictionary 该任务包括一个带有未定义变量的选项。错误是';ansible.utils.unsafe_proxy.AnsibleUnsafeText对象';没有属性';数据'\N,dictionary,ansible,Dictionary,Ansible,我有一个简单的剧本,其中使用curl从Vault服务器获取一些数据 tasks: - name: role_id shell: 'curl \ --header "X-Vault-Token: s.ddDblh8DpHkOu3IMGbwrM6Je" \ --cacert vault-ssl-cert.chained \ https://active.vault.service.c

我有一个简单的剧本,其中使用curl从Vault服务器获取一些数据

tasks:
    - name: role_id
      shell: 'curl \
             --header "X-Vault-Token: s.ddDblh8DpHkOu3IMGbwrM6Je" \
             --cacert vault-ssl-cert.chained \
             https://active.vault.service.consul:8200/v1/auth/approle/role/cpanel/role-id'
      register: 'vault_role_id'
    - name: test1
      debug:
        msg: "{{ vault_role_id.stdout }}"
输出如下:

TASK [test1] *********************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "auth": null,
        "data": {
            "role_id": "65d02c93-689c-eab1-31ca-9efb1c3e090e"
        },
        "lease_duration": 0,
        "lease_id": "",
        "renewable": false,
        "request_id": "8bc03205-dcc2-e388-57ff-cdcaef84ef69",
        "warnings": null,
        "wrap_info": null
    }
}
如果我正在访问第一级属性,那么一切都正常,如前一个示例中的.stdout。我需要更深层次的属性才能访问,比如
vault\u role\u id.stdout.data.role\u id
。我尝试此操作时失败,出现以下错误:

"The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'data'\n\n
你有什么建议我可以做,以获得正确的属性值从更深层次的对象层次

“该任务包含一个带有未定义变量的选项。错误为:'ansible.utils.unsafe\u proxy.AnsibleUnsafeText object'没有属性'data'\n\n”

是的,因为用
{
将它转换成
msg:
就是将JSON文本强制转换成python
dict
;如果您确实希望它是
dict
,那么可以使用
msg:{(vault\u role\u id.stdout | from\u JSON.data.role\u id}}}或者您可以使用
set\u事实:{vault\u role\u data:{{vault\u role\u id.stdout}}
然后
vault\u role\u data
将是一个
dict
,其原因与您的
msg
强制使用的原因相同

在msg前面加上任何字符都可以看到相反的过程:

-name:这是文本
调试:
msg:vault\u role\u id是{{vault\u role\u id.stdout}
-姓名:这是强迫的
调试:
msg:“{vault\u role\u id.stdout}”


虽然这不是您所要求的,但您也应该将
--fail
添加到
curl
中,这样如果请求返回non-200-OK,它就存在一个非零返回码,或者您可以使用更简单的方式via设置参数

过滤curl的输出。例如curl…| jq'。请参阅。我已经尝试过,但没有更好的方法。没有fil我也有json格式的输出,正如我在上面粘贴的那样。但是,由于某种原因,无法从对象结构中的北斗七星级访问属性,然后是第一级,在我的示例中是.stdout…谢谢你,mdaniel,它工作得很好。我正要使用uri,但面临验证ssl证书的问题,我不知道如何处理。With curl certs验证工作正常-可能是因为它没有使用python。SSL:CERTIFICATE\u VERIFY\u FAILED]CERTIFICATE VERIFY FAILED:无法获取本地颁发者证书(_SSL.c:1123)他们可以选择,但是的,我认为实际上信任自签名的Vault需要通知python它是受信任的。是的,有这样的选项。是的,它是Vault自签名证书。我相信你说的同样正确,它需要通知python它是受信任的。我将使用非Vault,但常规的ge进行测试一般信任证书。谢谢你,伙计!