模板化字符串时出现 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 的结果,它表明请求中发送的值正是我们从数据中期望的值。
我正在使用 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 的结果,它表明请求中发送的值正是我们从数据中期望的值。