Flask+flask_sqlalchemy 生成动态ansible Inventory

1.Ansible Inventory  介绍;

Ansible Inventory 是包含静态 Inventory动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的 API 或者接入库查询等方式返回主机列表。



2.flask_sqlalchemy 配置;

(1).mysqlconfig.py (mysql 连接器)

    class MysqlConfig(object):
        DIALECT = mysql
        DRIVER =  pymysql 
        USERNAME = "root"
        PASSWORD = "test"
        HOST = "192.168.1.1"
        PORT = "3306"
        DATABASE = getApolloconf("DATABASE")
        SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST,                                                                          PORT, DATABASE)
        SQLALCHEMY_TRACK_MODIFICATIONS = False
(2.1).models.py (数据库字段设计)

    # -*- coding: utf-8 -*-
    import datetime
    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    
    class ansible_hosts(db.Model):
        __tablename__ = 'ansible_hosts'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 主键自增长
        host = db.Column(db.String(16), nullable=False)  ###不能为空
        username = db.Column(db.String(32), nullable=False)  ###不能为空
        password = db.Column(db.String(64), nullable=False)  ###不能为空
        port = db.Column(db.String(8), nullable=False)
        create_time = db.Column(db.DateTime(timezone=False), default=datetime.datetime.now())
    
        def to_dict(self):
           return {"id": self.id, "host": self.host, "username": self.username, "password": self.passsword,
                    "port": self.port}
             
(2.2).数据库表初始化文件
 
    from models import db
    from __init__ import create_app
    app = create_app()
    with app.app_context():
        db.create_all()
        
(2.3)初始化表;

       python36 table.py
        
(2.4).查看数据库表结构;
 MySQL [ansible]> desc ansible_hosts;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| host        | varchar(16) | NO   |     | NULL    |                |
| username    | varchar(32) | NO   |     | NULL    |                |
| password    | varchar(64) | NO   |     | NULL    |                |
| port        | varchar(8)  | NO   |     | NULL    |                |
| create_time | datetime    | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

(2.5).动态主机脚本;

#!/usr/bin/python
#-*- coding: UTF-8 -*-
from __future__ import print_function
import argparse
import json
from collections import defaultdict
from contextlib import contextmanager

from models import db   
from models import ansible_hosts


def to_json(in_dict):
    return json.dumps(in_dict, sort_keys=True, indent=2)




def parse_args():
    parser = argparse.ArgumentParser(description='OpenStack Inventory Module')
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--list', action='store_true', help='List active servers')
    group.add_argument('--host', help='List details about the specific host')

    return parser.parse_args()


def ansiblehostsSelect():
    import json
    from models import ansible_hosts
    queryhostData = ansible_hosts.query.filter_by(username='host').first()
    querygroupData =  ansible_hosts.query.filter_by(username='group').first()
    return Response(json.dumps({"code": 0, "total": len(queryData), "host": [i.to_dict() for i in queryhostData ],
    "group":[i.to_dict() for i in querygroupData]}),
    mimetype='application/json')
    
def main():
    parser = parse_args()

    if parser.list:
      hosts = list_all_hosts(conn)
      print(to_json(hosts))
    else:
      details = get_host_detail(conn, parser.host)
      print(to_json(details))

if __name__ == '__main__':
    main()
(3).flask init 初始化
from flask import Flask
from tools.config import MysqlConfig
def create_app():
    app = Flask(__name__)
    app.config.from_object(MysqlConfig)
    from models import db
    db.init_app(app)
    app.register_blueprint(opsapp,url_prefix='/opsapp')
    return app
(4).flask 启动配置;

    from __init__ import create_app
    app = create_app()
    if __name__ == '__main__':
        app.run(
            host="127.0.0.1",
            port=5000,
            debug=True,
        )


猜你喜欢

转载自blog.51cto.com/breaklinux/2384877