模板化字符串时出现 Ansible 模板错误:电子邮件中出现意外字符“@”

Ansible template error while templating string : unexpected char '@' in email

我正在使用 Ansible 从 API 获取用户电子邮件列表,我想遍历它们。

这是我从 API:

得到的 json 回复
"users": [
{
    "email": "email1@email.com",
    "id": 1,
    "is_admin": true
},
{
    "email": "email2@email.com",
    "id": 2,
    "is_admin": false
},
]

编辑: 之后我需要电子邮件的任务:

- name: Send emails
      register: result
      uri:
        url: http://api
        method: GET
        body_format: json
        return_content: yes
        body:
          email: "{{ item.email }}"
          scope: SCOPE
      loop: "{{ users.json['users'] }}"

- name: Print result
  debug:
    var: result

我得到的错误:

fatal: [localhost]: FAILED! => {"msg": "template error while templating string: unexpected char '@' at 16. String: {{ email@email.com }}"}

如果我使用 email: item.email,json 请求正文将是 "body": {"email": "item.email"} 而不是电子邮件值

如何获取每个用户的完整邮箱地址?

您需要从 var: 指令中删除 {{}} 标记。 var 的值在 Jinja 模板上下文中隐式计算,因此您不需要这些标记:

- name: Print returned json dictionary
  debug:
    var: item.email
  loop: "{{ users.json['users'] }}"

(根据对您问题的编辑更新)

您展示的示例不会产生您询问的错误。这是一个完整的复制器,只更改了 uri

- hosts: localhost
  gather_facts: false
  vars:
    users:
      json:
        users:
          - email: email1@email.com
            id: 1
            is_admin: true
          - email: email2@email.com
            id: 2
            is_admin: false

  tasks:
    - name: Send emails
      register: result
      uri:
        url: https://eny1tdcqj6ghp.x.pipedream.net
        method: GET
        body_format: json
        return_content: true
        body:
          email: "{{ item.email }}"
          scope: SCOPE
      loop: "{{ users.json['users'] }}"

这运行没有错误(尽管请注意我怀疑 使用带有 JSON 正文的 GET 请求;通常你会期望 这是一个 POST 请求)。

您可以看到 运行 这个剧本 here 的结果,它表明请求中发送的值正是我们从数据中期望的值。