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, )