1、项目结构
# tree flask_shell
flask_shell
├── host.cfg // ansible inventory文件
├── main.py // 项目主要代码
├── requirements.txt // 项目依赖
└── templates // 模板目录
└── index.html // web 页面
1 directory, 4 files
2、项目文件内容
# cat flask_shell/host.cfg
192.168.1.254
192.168.1.125
# cat flask_shell/main.py
# coding: utf-8
from flask import Flask
from flask import render_template, request
import ansible.runner
import os
app = Flask(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == "POST":
cmd = request.form.get('cmd', type=str, default=None)
ip = request.form.get('ip', type=str, default=None)
host_cfg = os.path.join(BASE_DIR, 'host.cfg')
print cmd, ip, host_cfg
# 1 or None None or 1
# 1 and None None or 1
# if cmd or ip:
# 对比结果
if cmd and ip:
runner = ansible.runner.Runner(
host_list=os.path.join(BASE_DIR, host_cfg),
module_name='shell',
module_args=cmd,
pattern=ip,
forks=10
)
datastructure = runner.run()
for key, value in datastructure.items():
if 'contacted' in key:
exec_result = value
return render_template('index.html', result=exec_result, ip=ip, cmd=cmd)
else:
return render_template('index.html')
else:
return render_template('index.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8888, debug=True)
# cat flask_shell/requirements.txt
ansible==1.9.4
Flask==1.0.2
# cat flask_shell/templates/index.html
<div>
<div >
<h1>执行命令</h1>
<form id="command_form" method="POST" action="/">
<div>
<input name="cmd" type="text" placeholder="命令" value="{{ cmd }}">
<span>@</span>
<input name="ip" type="text"placeholder="IP" value="{{ ip }}">
<span>
<input name="submit"type="submit" value="执行" />
</span>
</div>
</form>
</div>
<div id="result">
<h3>命令结果</h3>
<textarea rows="20" cols="100">
{% if result %}
{{ result }}
{% endif %}
</textarea>
</div>
</div>
3、使用方法
运行在 Python 2.7.x 环境下,依赖 ansible,flask
# python -V
Python 2.7.5
# git clone https://github.com/ackfin/flash_shell.git
# cd flash_shell
# pip install -r requirements.txt
下面的IP根据你的情况配置,但要配置好ssh免密认证
# cat host.cfg
192.168.1.254
192.168.1.125
测试 ansible 是否能使用 host.cfg 的 ip 正常运行
# ansible -i host.cfg all -m ping
192.168.1.254 | success >> {
"changed": false,
"ping": "pong"
}
192.168.1.125 | success >> {
"changed": false,
"ping": "pong"
}
启动项目
# python main.py
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
比如运行在 192.168.1.254 这台机器上,
就用浏览器打开 http://192.168.1.254:8888
flask_shell_result.png
网友评论