【发布时间】:2021-09-06 09:46:46
【问题描述】:
Ansible 任务重用 Python 请求中的 HTTP 会话
场景:
- 复杂的 Web 服务登录过程,包括多次重定向和表单抓取(通过 BeautifulSoup)
- Python 脚本文件使用带有 Session 的 Requests 模块,用于存储登录成功的令牌和 cookie,以供后续 Web 服务 API 调用使用
目标:
- Ansible 任务 1:执行 Python 脚本进行 Web Service 身份验证,将 HTTPS 会话返回给 Ansible
- Ansible 任务 2..n:使用内置的
uriAnsible 模块执行 Web 服务 API,使用来自 HTTPS 会话
想法:
- 老实说,我有点困惑如何在 Ansible 中有效地构建它。将用于身份验证的整个 Python 脚本视为一个 Ansible 模块可能是明智的?
Python 身份验证脚本示例(简化)
def main():
import requests
# Create Session for requests, store all cookies in this object
https_session = requests.Session()
if 'page_1' not in globals():
page_1 = https_session.get(
'https://login.test.com',
allow_redirects=True
)
...
...
...
if 'redirect_8' not in globals():
redirect_8 = https_session.post(
'https://login.test.com/authenticate',
allow_redirects=True,
data = {
"token": response_7['token']
}
)
# Return the Cookie Jar
return https_session.cookies
main()
ANSIBLE 调用示例:
- name: test1
script: login.py
args:
executable: python3
environment:
username: "{{ input_user }}"
password: "{{ input_pwd }}"
ignore_errors: yes
register: login_test
- debug:
msg: "{{ login_test }}.stdout"
返回 ANSIBLE 的示例:
"
{
"results": [
{
"changed": True,
"rc": 0,
"stdout": "<RequestsCookieJar[<Cookie TOKEN=wxyz-wxyz for .home.test.com/>, <Cookie USER_ID=123456789 for .home.test.com/>\\n",
"stdout_lines": [
"<RequestsCookieJar[<Cookie TOKEN=wxyz-wxyz for .home.test.com/>, <Cookie USER_ID=123456789 for .home.test.com/>, "
],
"stderr": "",
"stderr_lines": [],
"failed": False,
"ansible_loop_var": "item",
}
],
"skipped": False,
"changed": True,
"msg": "All items completed",
}
.stdout"
【问题讨论】:
-
也许
return json.dumps(https_session.cookies.get_dict())是要走的路?仍然对采取什么方向/此用例可用的选项感到困惑
标签: python ansible ansible-inventory