如何将Flask表单接收的用户输入传入Ansible变量并触发Playbook执行
Flask表单传递参数触发Ansible Playbook实现方案
1. 前置依赖安装
首先确保环境已安装所需组件,执行以下命令:
pip install flask # 安装Ansible,根据系统选择对应安装方式,以下为Debian/Ubuntu示例 apt update && apt install ansible -y
2. 修改Flask后端代码(applet.py)
通过Python标准库subprocess调用ansible-playbook命令,将表单收集到的参数通过--extra-vars参数传递给Ansible,修改后代码如下:
from flask import Flask, render_template, request import subprocess import shlex app = Flask(__name__) @app.route('/form') def form(): return render_template('form.html') @app.route('/data/', methods = ['POST', 'GET']) def data(): if request.method == 'GET': return "The URL /data is accessed directly. Try going to '/form' to submit form" if request.method == 'POST': form_data = request.form.to_dict() # 构造Ansible额外参数,将表单数据转为JSON格式传递,避免空格特殊字符问题 extra_vars = str(form_data).replace("'", '"') # 构造Ansible执行命令,替换为你的playbook实际路径 cmd = f'ansible-playbook /path/to/your/playbook.yml --extra-vars \'{extra_vars}\'' # 执行命令,捕获输出 process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) stdout, stderr = process.communicate() # 返回执行结果给前端,也可以渲染到自定义模板 return f""" <h3>表单提交成功,Ansible执行结果:</h3> <p>标准输出:<pre>{stdout}</pre></p> <p>错误输出:<pre>{stderr}</pre></p> <p>传入参数:<pre>{form_data}</pre></p> """ if __name__ == '__main__': # 生产环境不要用debug模式 app.run(host='localhost', port=5000, debug=False)
3. Ansible Playbook示例
你可以直接在Playbook中调用表单传递的变量,变量名和表单input的name属性完全一致,示例playbook.yml内容如下:
--- - name: 接收Flask表单参数执行任务 hosts: all tasks: - name: 打印用户输入的参数 ansible.builtin.debug: msg: "用户姓名:{{ Name }},所在城市:{{ City }},所在国家:{{ Country }}" # 下方添加你需要执行的其他Ansible任务
4. 关键注意事项
- 运行Flask应用的系统用户需要有Ansible执行权限、对应inventory文件和目标主机的访问权限,建议提前手动测试Ansible命令可正常执行
- 生产环境必须添加表单输入校验,过滤特殊字符,避免命令注入风险,也可以使用ansible-runner第三方库替代直接调用subprocess,安全性更高
- 如果Playbook执行时间超过1分钟,建议引入Celery等异步任务框架处理执行逻辑,避免Flask请求超时
- 你可以根据需求将Ansible执行结果存储到日志文件,再展示到前端页面,方便后续排查问题
内容的提问来源于stack exchange,提问作者Sudhi
相关产品推荐
相关产品推荐

