openstack–etcd、keystone

etcd:OpenStack服务可以使用Etcd分布式可靠的分布式键值存储键锁定,存储配置,跟踪服务live-ness和其他场景。

一、安装etcd

yum install etcd

二、编辑配置文件

vim /etc/etcd/etcd.conf

#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://192.168.1.122:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.1.122:2379" ETCD_NAME="controller" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.122:2380" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.122:2379" ETCD_INITIAL_CLUSTER="controller122=http://192.168.1.122:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01" ETCD_INITIAL_CLUSTER_STATE="new"

三、启动etcd

systemctl enable etcd
systemctl start etcd

keystone:OpenStack 框架中负责管理身份验证、服务规则和服务令牌功能的模块。

一、登录数据库

mysql -u root -p

二、创建keystone数据库

MariaDB [(none)]> create database keystone;

三、适当的访问keystone数据库

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';

四、安装和配置组件

1.安装包

# yum install openstack-keystone httpd mod_wsgi

2.编辑/etc/keystone/keystone.conf

 [database]节中,配置数据库访问:

[database]# ...connection=mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

**取代 KEYSTONE_DBPASS与您选择的密码数据库。

 [token]节中,配置Fernet令牌供应商:

[token]# ...provider=fernet

3.填充身份服务数据库

# su -s /bin/sh -c "keystone-manage db_sync" keystone
  1. 初始化Fernet密钥存储库:

    # keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    # keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
    
  2. 引导标识服务:

    # keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
      --bootstrap-admin-url http://controller:35357/v3/ \
      --bootstrap-internal-url http://controller:5000/v3/ \
      --bootstrap-public-url http://controller:5000/v3/ \
      --bootstrap-region-id RegionOne
    

    取代 ADMIN_PASS用一个合适的密码管理用户。

五、配置Apache HTTP服务器

  1. 编辑 /etc/httpd/conf/httpd.conf文件和配置 ServerName选择参考控制器节点:

    ServerName controller
    
  2. 创建一个链接 /usr/share/keystone/wsgi-keystone.conf文件:

    # ln -s /usr/share/keystone/wsgi-
    keystone.conf /etc/httpd/conf.d/
    

    六、完成安装

  1. 启动Apache HTTP服务和配置在系统启动时启动:

    # systemctl enable httpd.service
    # systemctl start httpd.service
    
  2. 配置管理账户

    创建admin.env,添加一下数据

    $exportOS_USERNAME=admin
    $exportOS_PASSWORD=ADMIN_PASS
    $exportOS_PROJECT_NAME=admin
    $exportOS_USER_DOMAIN_NAME=Default
    $exportOS_PROJECT_DOMAIN_NAME=Default
    $exportOS_AUTH_URL=http://controller:35357/v3
    $exportOS_IDENTITY_API_VERSION=3

 

html–bootstrap、emmet

Bootstrap:

是最受欢迎的HTML、CSS、JS框架,用于开发响应式布局、移动设备优先的WEB项目。

一、如何自动生成html模板脚本

1.cd .vim

2.mkdir template

3.vim simple.html

 

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title></title>
</head>

<body>
<script>
</script> 
</body>

后期只要编辑.html后缀的脚本就能自动生成html格式的文件

Emmet:

使用于编写HTML/XML和CSS代码的前端开发人员,可以设置CSS形式的能够动态被解析的表达式,根据你所输入的缩写来得到相应的内容。

使用方式:

vim test.html  #打开.html后缀的文件
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title></title>
</head>

<body>
<script>
Hhh

Xxx
</script>
</body>

V选中Hhh、Xxx按住ctrl + y +逗号(,)

需要什么样的格式在tag后面输入即可!

eg:

 

openstack包

一、安装并配置组件

安装数据库

#yum install mariadb mariadb-server python2-PyMySQL

创建并配置/etc/my.cnf.d/openstack.cnf

[mysql]

bind-adress = 192.168.1.122 
#IP为操作主机的IP
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

启动并设置自动启动

#systemctl enable maridb.server
#systemctl start mariadb.server
#mysql_secure_installation

运行该脚本,*注意:数据库的root用户密码设置一个适当的密码。

二、消息队列

#yum install rabbitmq-server
#systemctl enable rabbitmq-server.service
#systemctl start rabbitmq-server.service

添加openstack用户 RABBIT_PASS为密码,这里你可以改成自己想要的密码

#rabbitmqctl add_user openstack RABBIT_PASS

给openstack用户配置读和写的权限

#rabbitmqctl set_primission openstack ".*" ".*" ".*"

验证:

管理组件启动

#rabbitmq-pligins enable rabbitmq_management

#curl 127.0.0.1:15672

*注意:如何检验rabbitmq时有问题(即rabbitmq-pligins enable rabbitmq_management)出现报错。

1.检查 /etc/selinux/config配置文件是否有下面的内容

SELINUX=disabled

2.检查防火墙是否关闭

systemctl status firewall

 

openstack的搭建

一台contorller(192.168.1.122)

系统:centos7 、CPU:两个、  网卡:一个插槽两个内核、 虚拟磁盘大小:30G 、Tiny provision 精简配置

一台computer(192.168.1.162)

系统:centos7、CPU:两个、网卡:一个插槽两个内核、虚拟磁盘大小:30G、Tiny provision精简配置

一、配置网络

nmtui #配置网络图形界面
vim /etc/sysconfig/network-scrip/ifcfc-xx #命令行界面 xxx为网卡名
添加static(静态)IP、IP、网关、DNS、子网掩码

二、修改主机名

hostnamectl set-hostname colltorller #设置主机名为contorller
hostname set-hostname computer       #设置主机名computer
hostnamectl                          #查看主机名

三、修改selinux并添加域名跟IP的对应关系

vim /etc/selinux/config
SELINUX = disbaled

四、修改/etc/hosts文件

vim /etc/hosts

192.168.1.122 contorller #contorller这台电脑和IP的对应关系
 
192.168.1.162 computer #computer这台电脑和IP的对应关系

五、设置时间为亚洲-上海

timedatectl list-timezones | grep A            #查看A打头的所有时间

timedatectl set-timezone Asia/Shanghai   #设置时间为亚洲上海

date                                                                  #查看时间日期

六、设置时间同步服务

yum install chronyd       #下载chronyd(时间同步服务)

(此步骤在contorller主机上完成)
1.vim /etc/chrony.conf 
#找到下面的内容
server 0.centos.pool.ntp.org iburst 
server 1.centos.pool.ntp.org iburst 
server 2.centos.pool.ntp.org iburst 
server 3.centos.pool.ntp.org iburst
#修改为
server ntp5.aliyun.com iburst
2.systemctl restart chronyd #重启chronyd服务
(次步骤在computer主机上完成)
1.vim /etc/chrony.conf
server 192.168.1.122 iburst   #此IP为contorller主机的IP
2.systemctl restart chronyd   #重启chronyd服务

七、修改yum源

vim /etc /yum.repos.d

修改结果如下

#mirrorlist                                                  #注释mirrorlist这行

baseurl=https://mirrors.aliyun.com     #把baseurl改成阿里云的镜像源

*注意mirror  改为mirrors
>>yum clean call
>>yum repolist
即可

 

flask–migrate

一、介绍:

因为采用‘db.craete_all’在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后从新运行‘db.create_all’才会重新映射,这样不符合我们的请求。因为flask-migrate就是为了解决这个问题。她可以在每次修改模型后。可以将修改的东西映射到数据库中。

二、安装flask-migrate

Sudo pip insta ll flask-migrate

使用’flask-migrate’必须借助’flask_scrtipts’。这个包的‘MigrateCommand’中包含了所有和数据库相关的命令。

三、‘flask_migrate’相关的命令:

模型–>迁移文件–>表

*’pyhton manage.py db init’:初始化一个迁移脚本的环境。只需要执行一次

*‘python manage.py db migrater’:将模型生成迁移的文件,只要模型更改了,就只需要执行一遍这个命令。

*‘pyhton manage.py db upgrade’:将迁移文件真正的映射到数据库中。每次运行了‘migrate’的命令后,就只记得要运行这个命令。

注意点:

*需要将你想要映射到数据库中的模型,都要导入到’manage.py ‘文件中。如果没有导入进去,就不会映射到数据库中。

demo.py,存放主APP的文件

from flask import Flask 
from exst import db
import config

app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)

@app.route('/')
    return 'hello world'

if __name__ == '__main__':
    app.run(debug=True)

exst.py,存放db的文件

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

models.py,存放数据表

from exst import db

class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title= db.Column(db.String(100),nullable=False)

manage.py,存放flask-migrate和flask-script

from flask_script import Manager
from demo import app
from esxt import db
from models import Article
from flask_migrate import Migrate,MigrateCommand

manager = Manager(app)
migrate = Migrate(app,db)
manager.app_command('db',MigrateCommand)



if __name__ == '__main__':
    manager.run()

第一次在终端输入:

>pyhton manage.py db init

>python manage.py db migrate

>python manage.py db upgrade

下次再添加属性的时候,直接运行:

>pyhton manage.py db migrate

>python manage.py db upgrade

 

flask-models的解决循环的作用

###放开‘models’以及解决循坏引用:

  • 分开models的目的:为了让代码更加方便的管理。
  • 如何解决循坏引用:把‘db’放在一个单独的文件中,切断循环引用的线条就可以了。

#model_set.py文件,APP文件

末班from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world'

if __name__ == '__main__':

    app.run(debug=True)

#exst.py文件,存放db

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

#models.py文件,存放数据表

from exst import db

class Article(db.Model):
    __tablename__ == 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.Srting(100),nullable=T=False)
    content = db.Column(db.eText,nullable=False)

#config.py ,建立数据库的文件

#连接数据库的格式
# dialect+driver://username:password@host:port/database
USERNAME = "root"
PASSWORD = "admin"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "db_demo3" 
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True

#注意:创建数据库之前必须登入数据库,创建一个DATABASE=‘xxx’xxx这个文件

结果:

 

 

flask-script–子命令的文件

当有数据库的时候

#demo.py文件

from flask import Flask
app = Flask(__name__)
@app.route('/')

def index():
    return 'hello world!'

if __name__ == '__main__':
    app.run(debug=True)

#namager.py文件

from flask_script import Manager

from dbmo.py import app
from demo_sql.py import DBmanager

manager = Manager(app)


#和数据库相关的操作,我都放在demo_sql.py文件中

@manager.command

def runserver():

     return '服务器跑起来了!'

if __name__ == '__main__':

    app.run(debug=True)

#demo_sql.py

from flask_script import Manager

DBmanager = Manager

@DBmanager.command

def init():

    print ('数据库初始化成功')

def migrate():

    print ('数据库迁移成功')

最后结果:

>python manager.py db init

>python manager.py migrate

 

 

Flask-script安装及简介

1.作用:通过命令行的形式来操作flask。例如:通过命令行跑一个开发版本服务器、设置数据库、定时任务等

2.安装:首先进入虚拟环境中,然后pip install flask-script来进行安装

3.如果直接在主’manager.py‘中写命令,那么在终端就值需要’pyhton manage.py command_name‘j就可以了。

4.如果把一些命令集中在一个文件中,那么在终端就只需要输入一个父命令,比如’python manager.py db init(函数名)‘。

例子:

#demo.py文件

demo.pyfrom flask imopr Flask
app = Flask(__name__)
@app.route('/')
def index():
     return 'Hello world!'

if __name__ == '__main__':
    app.run(debug=True)

#manager.py

from falsk_script import Manager
from demo import app
manager = Manager(app)
@Manager.command
def runserver():
    print ('服务器跑起来了')

if __name__ == '__main__':
    manager.run()

结果:

>python manager.py runserver

flask-外键及其关系

1.外键:

1).方便与主键建立关系

2).外键总是关联唯一的键字段

3).为关联字段创建外键

from flask import Flask

from flask_sqlalchemy import SQLAlchemy

import config

name = Flask(__name__)

app = config.from_object(config)

db = SQLAlchemy(app)
#创建一个user表
class User(db.Domel):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(100),nullable=False)
class Article(db.Domel):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(100),nullable=False)
    content = db.Column(db.Text,nullable=False)
    #author_id创建为外键
    author_id = db.Column(db.Integer,db.foreignKey('user.id'))
    #建立反向关系    
    author = db.relationship('User',backref=db.backref('articles'))
db.areate_all()
@app.route('/')

def index():
    #给user表添加信息
    user = User(username='bingo')
    db.session.add(user)
    db.session.commit()
    #给article表添加两条信息
    article1 = Article(title='aaa',content='bbb')
    article1.author = User.query.filter(User.id == 1).first() 
#因为articles表中有author_id这个属性,并且它与user表建立了外键关系所以这里是使author_id的键==user.id的键。
    db.session.add(article1)
    db.session.commit()
    article2 = Article(title='ddd',content='eee')
    article2.author = User.query.filter(User.id == 1).first()
    db.session.add(article2)
    db.session.commit()
    #找到文章标题为aaa的用户(title='aaa')
    article = Article.query.filter(Article.title=='aaa').first()
    print (article.user)
    #找到用户为bingo的所有文章
    user = User.query.filter(User.username=='bingo').first()
    result = user.articles
    for article in result:
        print (('*') * 10)
        print (article.title)
    return 'hello world'

if __name__ == '__main__':

    app.run(debug=True)