项目二

理论知识

1.项目需求分析

1.基本概念
需求分析是指理解用户需求,就用户的功能需求与客户达成一致,并需要估计项目风险和评估项目代价,最终形成开发计划的一个复杂过程。在这个过程中,用户是处在主导地位的,需求分析工程师和项目经理要负责整理用户需求,为之后的项目设计打下基础。
从广义上理解:需求分析包括需求的获取、分析、规格说明、变更、验证、管理等一系列需求工程。狭义上理解:需求分析指需求的分析、定义过程。
需求分析阶段结束后应该得到相应的需求分析报告。

(2)分析内容
需要分析的内容可以包含:公司应用需求、技术资金投入与生产效益、行业技术发展趋势,国家政策支持等。

(3)分析过程
需求分析阶段的工作,可以分为4个方面:问题识别、分析与综合、制订规格说明、评审。

(4)需求分析的方法有很多。如原型化方法、结构化方法和动态分析法等。

2.系统架构设计
一个项目的系统架构设计一般是由系统架构设计师来负责完成的。对于系统架构设计师来说,其主要职责有如下4条。

(1)确认需求
在项目开发过程中,架构师是在需求规格说明书完成后介入的,需求规格说明书必须得到架构师的认可。架构师需要和分析人员反复交流,以保证自己完整并准确地理解用户需求。

(2)系统分解
依据用户需求,架构师将系统整体分解为更小的子系统和组件,从而形成不同的逻辑层或服务。随后,架构师会确定各层的接口,层与层相互之间的关系。架构师不仅要对整个系统分层,进行“纵向”分解,还要对同一逻辑层分块,进行“横向”分解。

(3)技术选型
通过对系统的一系列的分解,架构师最终形成项目的整体架构。技术选择主要取决于项目架构。
架构师对产品和技术的选型仅仅限于评估,没有决定权,最终的决定权归项目经理。架构师提出的技术方案为项目经理提供了重要的参考信息,项目经理会对项目预算、人力资源和时间进度等实际情况进行权衡,最终进行确认。

(4)制定技术规格说明
在项目开发过程中,架构师是技术权威。他需要协调所有的开发人员,与开发人员一直保持沟通,始终保证开发者依照他的架构意图去实现各项功能。
架构师不仅要保持与开发者的沟通,也需要与项目经理、需求分析员,甚至最终用户保持沟通。所以,对于架构师来讲,不仅有技术方面的要求,还有人际交流方面的要求。

3.环境说明
① 若教学环境有足够的可供学生使用的服务器,则每组分配2台服务器进行练习。
② 若教学环境没有服务器,可使用PC代替,每组分配2台PC进行练习(每台PC支持CPU虚拟化,双网卡,最低4GB内存,最低100GB硬盘)。
③ 若教学环境可供学生使用的服务器数量不够,可将所有服务器组建一个云平台,每组学生分配2台虚拟机进行练习(每台虚拟机配置双网卡,最低4GB内存,最低100GB硬盘)。

1.节点主机名及IP规划

2.各个节点要求

(1)主机要求为双网卡内存为4G以上系统要求处理器2核以上。

(2)操作系统为centos-7-x86_64DVD-1511.iso)

3.配置主机名

controller 控制节点
computer实列节点
1.控制节点配置如下

2.实列节点配置如下

3.改完主机名需要重启reboot才能生效。

4.配置域名解析。
在全部节点的/etc/hosts文件中添加域名解析。
在控制节点修改配置文件/etc/hosts,内容如下。
172.24.2.10 controller
172.24.2.20 compute

在实例节点修改配置文件/etc/hosts,内容如下。
172.24.2.10 controller
172.24.2.20 compute

5.关闭防火墙配置
控制节点配置如下
1.关闭firewalld防火墙服务和开机自启动,实列节点和此节点一样。

4.配置yum源

(1)安装源子目录
将本书提供的光盘镜像文件XianDian-IaaS-v2.2.iso和CentOS-7-x86_64-DVD-1511.iso上传到两个节点服务器自己指定的子目录中(如子目录/var中)并解压。创建子目录software,如图2-6所示。将子目录iaas-repo移至/var/software子目录中;创建子目录centos 7,将子目录Packages和repodata移至子目录centos 7中,可以删除拷贝在var下的原解压文档。如果是用VMware创建的虚拟机来搭建IaaS平台,可以通过挂载镜像文档来拷贝上述软件包。


(2)建立FTP服务
进入图2-6的子目录,用rpm命令安装FTP服务器,修改FTP默认的文件服务路径为/var/software,即指向存放yum源路径,需在/etc/vsftpd下修改vsftpd.conf配置文件,添加如下配置项。

anon_root=/opt

(3)yum源备份

mv /etc/yum.repos.d/*/opt

(4)创建repo文件

[centos]
name=centos                                        //设置此yum的资源描述名称
baseurl=file:///opt/centos7                //设置yum源的访问地址及路径
gpgcheck=0                                     //不使用gpg检查gpgkey
enabled=1                                      //启动此yum源
[openstack]
name=OpenStack
baseurl=file:///opt/iaas-repo
gpgcheck=0
enabled=1

做好上述配置后建议进行FTP服务器和yum命令的测试,如用yum命令安装简单的服务等。
在实例节点的/etc/yum.repos.d/ 路径下创建local.repo 文件,与上述类似,仅需修改FTP服务器的IP地址为172.24.2.10,也可以用控制节点的FTP服务器作为yum源的资源包。

5.配置IP

配置临时IP,方便运行安装脚本,修改服务器eno16777736端口地址。
控制节点
配置文件位置如下目录/etc/sysconfig/orkscripts/ifcfgeno16777736

TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=17b1974f-49b3-45cf-b2e5-e2133c6c0420
DEVICE=eno16777736
ONBOOT=yes
IPADDR=172.24.2.10
PREFIX=24
GATEWAY=172.24.2.1

对配置文件/etc/sysconfig/network-scripts/ifcfg-eno33554960只需要修改以上就可以了。

TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno33554960
UUID=40da3afe-717e-492b-a8f6-4a0c63737dfe
DEVICE=eno33554960
ONBOOT=yes
IPADDR=172.24.3.10
PREFIX=24

删除GATEWAY配置项。
修改完成后需要重启网络才能生效,代码如下。

 systemctl restart network.service

实列节点
修改配置文件/etc/sysconfig/network-scripts/ifcfg-eno16777736如下。

TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yesIPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=05460aae-7e95-41da-8c46-59fa59f59e1c
DEVICE=eno16777736
ONBOOT=yes
IPADDR=172.24.2.20
PREFIX=24
GATEWAY=172.24.2.1

对配置文件/etc/sysconfig/network-scripts/ifcfg-eno33554992进行修改,只需将上述的内容修改。

TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno33554992
UUID=4d15964b-633b-4bcd-8cb7-047655ff0699
DEVICE=eno33554992
ONBOOT=yes
IPADDR=172.24.3.20
PREFIX=24

删除GATEWAY配置项修改完成,重启网络服务。

systemctl restart network.service

6.控制节点和实列节点安装包

控制节点和实列节点都要下载下面这个包。

 yum install iaas-xiandian -y

编辑文件/etc/xiandian/openrc.sh(配置环境变量)

HOST_IP=172.24.2.10
HOST_NAME=controllerHOST_IP_NODE=172.24.2.20
HOST_NAME_NODE=compute
RABBIT_USER=openstack
RABBIT_PASS=000000
DB_PASS=000000
DOMAIN_NAME=demo(自定义)
ADMIN_PASS=000000
DEMO_PASS=000000
KEYSTONE_DBPASS=000000
GLANCE_DBPASS=000000
GLANCE_PASS=000000
NOVA_DBPASS=000000
NOVA_PASS=000000
NEUTRON_DBPASS=000000
NEUTRON_PASS=000000
METADATA_SECRET=000000
INTERFACE_NAME=eno33554960(外网网卡名)
CINDER_DBPASS=000000
CINDER_PASS=000000
TROVE_DBPASS=000000
TROVE_PASS=000000
BLOCK_DISK=sda3(空白分区名)
SWIFT_PASS=000000
OBJECT_DISK=sda4(空白分区名)
STORAGE_LOCAL_NET_IP=172.24.2.20
HEAT_DBPASS=000000
HEAT_PASS=000000
CEILOMETER_DBPASS=000000
CEILOMETER_PASS=000000
AODH_DBPASS=000000
AODH_PASS=000000

7. 控制节点和实例节点

执行脚本iaas-pre-host.sh进行安装

iaas-pre-host.sh

8. 重启设备

完成配置后,同时重启两个节点服务器。

reboot

9.部署脚本安装平台

10.部署脚本安装平台

①在控制节点执行脚本iaas-install-mysql.sh进行数据库及消息列表服务安装。

iaas-install-mysql.sh

②在控制节点执行脚本iaas-install-keystone.sh进行keystone认证服务安装。

iaas-install-keystone.sh

③在控制节点执行脚本iaas-install-glance.sh进行glance镜像服务安装。

iaas-install-glance.sh

④在控制节点执行脚本iaas-install-nova-controller.sh进行nova计算服务安装。

iaas-install-nova-controller.sh

在实例节点执行脚本iaas-install-nova-compute.sh进行nova计算服务安装。

iaas-install-nova-compute.sh

⑤在控制节点执行脚本iaas-install-neutron-controller.sh进行neutron网络服务安装。

iaas-install-neutron-controller.sh

在实例节点执行脚本iaas-install-neutron -compute.sh进行neutron网络服务安装。

iaas-install-neutron-compute.sh

⑧这里控制节点和实列节点执行的vlan网络安全是错误的所以我们用下面这个。

⑧在控制节点执行脚本iaas-install-neutron-controller-vlan.sh进行vlan网络安装配置。

iaas-install-neutron-controller-vlan.sh

在实例节点执行脚本iaas-install-neutron-compute-vlan.sh进行vlan网络安装配置。

iaas-install-neutron-compute-gre.sh

⑨在控制节点执行脚本iaas-install-dashboard.sh进行dashboard服务安装。

iaas-install-dshabord.sh

⑩在控制节点执行脚本iaas-install-cinder-controller.sh进行cinder块存储服务安装。

iaas-install-cinder-controller.sh

在实例节点执行脚本iaas-install-cinder-compute.sh进行cinder块存储服务安装。

iaas-install-cinder-compute.sh

⑪在控制节点执行脚本iaas-install-swift-controller.sh进行swift对象存储服务安装。

iaas-install-swift-controller.sh

在实例节点执行脚本iaas-install-swift-compute.sh进行swift对象存储服务安装。

iaas-install-swift-compute.sh

⑫在控制节点执行脚本iaas-install-heat.sh进行heat编配服务安装。

iaas-install-heat.sh

⑬在控制节点执行脚本iaas-install-ceilometer-controller.sh进行ceilometer监控服务安装。

iaas-install-ceilometer-controller.sh

在实例节点执行脚本 iaas-install-ceilometer-compute.sh进行ceilometer监控服务安装。

iaas-install-ceilometer-compute.sh

⑭在控制节点执行脚本iaas-install-alarm.sh进行alarm告警服务安装。

iaas-install-alarm.sh

验证安装基础工作完成
上述操作完成后,打开网页 http://172.24.2.10/dashboard进行验证服务,若看到dashboard登录界面,以及管理员账号和密码登录后,看到 dashboard管理界面,表示安装基础工作正确完成。


项目三认证服务

1.相关概念
(1)认证(Authentication)
认证是确认允许一个用户访问的进程。为了确认请求,OpenStack Identity 会为访问用 户提供证书,起初这些证书是用户名和密码,或用户名和 API key。当 OpenStack Identity认证体系接受了用户的请求之后,它会发布一个认证令牌(Token),用户在随后的请求中 使用这个令牌去访问资源中其他的应用。
(2)证书(Credentials)。
用于确认用户身份的数据。例如,用户名、密码或者 API key,或认证服务提供的认证 令牌。
(3)令牌(Token)。
通常指的是一串比特值或者字符串,用来作为访问资源的记号。Token(令牌统一用词)中含有可访问资源的范围和有效时间,一个令牌是一个任意比特的文本,用于与其他OpenStack服务来共享信息,Keystone以此来提供一个centrallocation,以验证访问OpenStack服务的用户。令牌的有效期是有限的,可以随时被撤回。
(4)项目(project)。
project即项目,早期版本又称为project,它是各个服务中的一些可以访问的资源集合。例如,通过nova创建虚拟机时要指定到某个项目中,在cinder创建卷也要指定到某个项目中,用户访问项目的资源前,必须与该项目关联,并且指定该用户在该项目下的角色。平台构建完毕会产生admin、service和demo三个项目。在这些项目中,admin项目代表管理组,拥有平台的最高权限,可以更新、删除和修改系统的任何数据。service代表平台内所有服务的总集合,平台安装的所有服务默认会被加入到此项目中,为后期的统一管理提供帮助,此项目可以修改当前项目下所有服务的配置信息,提交项目的内容以及修改。demo则是一个演示测试项目,没有什么实际的用处。
(5)用户(User)。
使用服务的用户,可以是人、服务或系统使用OpenStack相关服务的一个组织。例如,一个项目映射到一个Nova的“project-id”,在对象存储中,一个项目可以有多个容器。根据不同的安装方式,一个项目可以代表一个客户、账号、组织或项目。用户通过KeystoneIdentity认证登录系统并调用资源。用户可以被分配到特定项目并执行项目相关操作。需要特别指出的是,OpenStack通过注册相关服务用户来管理服务,例如Nova服务注册nova用户来管理相应的服务。对于管理员来说,需要通过Keystone来注册管理用户。
(6)角色(Role)。
Role即角色,Role代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像。Users可以被添加到任意一个全局的role或项目内的role中。在全局的role中,用户的role权限作用于所有的项目,即可以对所有的项目执行role规定的权限。在项目内的role中,用户仅能在当前项目内执行role规定的权限。使用云服务的用户不局限于人,也可以是系统或者服务。用户可以通过指定的令牌登录系统并调用资源。用户可以被分配到特定项目并执行项目相关操作。

2.认证服务流程
用户请求云主机的流程涉及认证Keystone服务、计算Nova服务、镜像Glance服务,在服务流程中,令牌(Token)作为流程认证传递,具体服务申请认证机制流程,如图所示。

1.配置Keystone应用环境

实际操作过程

在做实验时报错可以使用下面这个命令来更新文件来解决报错问题。

# source /etc/keystone/admin-openrc.sh       //更新配置文件

Keystone服务安装完毕,可以通过请求身份令牌来验证服务,具体命令如下。

openstack--os-project-nameadmin--os-domain-namedemo--os-usernameadmin--os-password000000--os-auth-urlhttp://controller:35357/v3tokenissue//以admin用户访问http://controller:35357/v3地址获取token值

(1)创建用户
创建一个名称为“zhangsan”账户,密码为“没有password23”,邮箱为“lisi@3481968803.com。”命令如下。

openstack usercreate--passwordmypassword123--emailzhangsan@example.com--domai ndemo zhangsan

具体执行如下

(2)创建项目
一个项目就是一个项目、团队或组织,当请求 OpenStack 服务时,你必须定义一个项 目。例如,查询计算服务正在运行的云主机实例列表。
创建一个名为“lisi”项目

 openstack project create -domain demo lisi

具体执行如下

(3)创建角色
角色限定了用户的操作权限。例如,创建一个角色“ermazi”

openstack role create ermazi

具体执行如下

4)绑定用户和项目权限。
添加的用户需要分配一定的权限,这就需要把用户关联绑定到对应的项目和角色。例 如,给用户“zhangsan”分配“lisi”项目下的“ermazi”角色,命令如下。

openstack role add --user zhangsan --project lisi ermazi

(5)图形化界面操作
以管理员身份登录到 dashboard,进入“身份管理/项目”,可以看到项目列表。

单击项目中的管理成员按钮,进入“zhangsna”项目中。在这个界面中,可以 查看刚加入的用户“lisi”,把该用户分配给用户对应的角色“ermazi”后,完成该操作后,用户zhangsan就可以用zhangsan用户名和对应密码“mypassword123”登 录云平台了。

(6)创建项目、用户并绑定用户权限
根据企业人员部门分配,现构建 3 个项目,100 个用户,管理人员拥有管理员权限,其余人员拥有普通用户权限。

1.创建项目

创建项目研发部(research and development department)名为 RD_Dept 的项目、业务部
(business department)名为 BS_Dept 的项目、IT 工程部(engineering department)名为 IT_Dept
的项目。
1.使用web界面创建项目


2.通过shell界面为业务部创建一个名为BS_Dept 的项目。

openstack project create "BS_Dept" --domain demo --description 业务部门

执行结果如下

3.通 过 脚 本 为 工 程 部 创 建 一个 名 为 IT_Dept 的 项 目

具体执行命令如下。

./Keystone-manage-project.sh

执行结果如下

4.创建用户账号

为项目研发部创建 50 个用户,分别名为 rduser001~rduser050,密码为 cloudpasswd;为业务部创建 45 个用户,分别名为 bsuser001~bsuser045,密码为 cloudpasswd;为 IT 工程部创建 5 个用户,分别名为 ituser001~ituser005,密码为 cloudpasswd。可使用 GUI 和
CLI 界面,辅助使用 Shell。

通过 Shell 命令行为项目研发部创建用户 rduser002,密码为 cloudpasswd。

执行命令如下

# openstack user create rduser002 --password cloudpasswd --domain demo
--email rduser002@example.com

执行结果如下

通过执行 Shell 脚本 Keystone-manage-user.sh 为项目研发部创建用户 rduser003~
rduser050,密码为 cloudpasswd。(具体脚本参见附录五 Keystone-manage-user.sh)
在命令行内输入# ./Keystone-manage-user.sh,执行该脚本。命令行内按提示输入用户名
称、用户密码、电子邮件域名地址、用户角色(这里只能赋予一个角色)和用户所属部门。
执行命令后结果如下所示。


通过执行 Shell 脚本为 IT 工程部创建用户 ituser001~ituser005,密码为 cloudpasswd。
执行过程和结果如下所示

**5…通 过 脚 本 为 工 程 部 创 建 一个 名 为 IT_Dept 的 项 目需要脚本来执行脚本如下。
Keystone-manage-project.sh

#!/bin/bash
if [  -f "/etc/keystone/admin-openrc.sh" ];thensource /etc/keystone/admin-openrc.sh
else
env_path=`find / -name admin-openrc.sh`source $env_path
fiecho -e "\033[31mPlease Input new project name : eg (openstack)\033[0m "read New_Project_Name
if [ ! -n "$New_Project_Name" ];thenecho -e "\033[31mProject Name Is Empty,Exit\033[0m "exit 1fiecho -e "\033[31mPlease Input project description : eg (openstack description)\033[0m "read New_Project_des
if [ ! -n "$New_Project_des" ];thenecho -e "\033[31mProject  Description  Is Empty,Exit\033[0m "exit 1
fi
T_Start=`echo $New_Project_Range |awk -F- '{ print $1}'| awk '{print $0+0}'`
N_Start=`printf "%03d\n" $T_Start`
T_End=`echo $New_Project_Range |awk -F- '{ print $2}' | awk '{print $0+0}'`
N_End=`printf "%03d\n" $T_End`T_End1=$[$T_End+1]openstack project create  $New_Project_Name --domain demo --description $New_Project_desecho -e "\033[31mKeystone All Project List\033[0m "openstack project list

Keystone-manage-user.sh

#!/bin/bash
if [  -f "/etc/keystone/admin-openrc.sh" ];thensource /etc/keystone/admin-openrc.sh
else
env_path=`find / -name admin-openrc.sh`source $env_path
fiecho -e "\033[31mPlease Input New User Name : eg (username)\033[0m "read New_User_Name
if [ ! -n "$New_User_Name" ];thenecho -e "\033[31mUser Name Is Empty,Exit\033[0m "exit 1fiecho -e "\033[31mPlease Input User Password: eg (000000)\033[0m "read New_User_Pw
if [ ! -n "$New_User_Pw" ];thenecho -e "\033[31mPasswd Is Empty,Exit\033[0m "exit 1fiecho -e "\033[31mPlease Input User Email Address,If don't need  press enter: eg (openstack.com)\033[0m "read New_User_Email
if [ ! -n "$New_User_Email" ];thenecho -e "\033[31mEmail Address Is Empty,Exit\033[0m "exit 1fiecho -e "\033[31mPlease Input User   Beginning And End  Number: eg (001-002)\033[0m "read New_User_Range
if [ ! -n "$New_User_Range" ];thenecho -e "\033[31mNumber Is Empty,Exit\033[0m "exit 1else
U_Start=`echo $New_User_Range |awk -F- '{ print $1}'| awk '{print $0+0}'`
N_U_Start=`printf "%03d\n" $U_Start`
U_End=`echo $New_User_Range |awk -F- '{ print $2}' | awk '{print $0+0}'`
N_U_End=`printf "%03d\n" $U_End`U_End1=$[$U_End+1]
IF_username_exists=`openstack user list | sed '1,3d'|sed '$d'|awk '{print $4}'`for username_exists in $IF_username_exists;dofor (( username_number = $U_Start;username_number< $U_End1;username_number++ ));do
real_username_number=`printf "%03d\n" $username_number`if [ $New_User_Name$real_username_number == $username_exists ];thenecho -e "\033[31mUser $New_User_Name$real_username_number is exists\033[0m "exit 1fi
donedone   fiecho -e "\033[31mPlease enter the User belong Roles Name, Press enter for '_member_' role by default: eg (admin)\033[0m "read New_User_Role
if [ ! -n "$New_User_Role" ];then
New_User_Role=_member_else
IF_Role_Exists=`openstack role list |sed '1,3d' |sed '$d' |awk '{print $4}'`if  echo "${IF_Role_Exists[@]}" | grep -w "$New_User_Role" >> /dev/null ; thenecho "exists" >> /dev/nullelseecho -e "\033[31mRole $New_User_Role not exists\033[0m "exit 1fifiecho -e "\033[31mPlease Input User belong Project Name: eg (projectname)\033[0m "read New_User_Project
if [ ! -n "$New_User_Project" ];thenecho -e "\033[31mProject Name Is Empty,Exit\033[0m "exit 1else
IF_Project_Exists=`openstack project list |sed '1,3d' |sed '$d' |awk '{print $4}'`if  echo "${IF_Project_Exists[@]}" | grep -w "$New_User_Project" >> /dev/null ; thenecho "exists" >> /dev/nullelseecho -e "\033[31mProject $New_User_Project not exists\033[0m "exit 1fififor (( username_number = $U_Start;username_number< $U_End1;username_number++ ));do
real_username_number=`printf "%03d\n" $username_number`openstack user create  $New_User_Name$real_username_number --password $New_User_Pw --domain demo --email $New_User_Name$real_username_number@$New_User_Emailopenstack role add --user $New_User_Name$real_username_number --project  $New_User_Project $New_User_Role doneecho -e "\033[31mKeystone All User List\033[0m "openstack user list

Keystone-manage-add-role.sh

#!/bin/bash
# 1st keystone
if [  -f "/etc/keystone/admin-openrc.sh" ];thensource /etc/keystone/admin-openrc.sh
else
env_path=`find / -name admin-openrc.sh`source $env_path
fiecho -e "\033[31mPlease Enter The User Name\033[0m "read Add_Role_Usernameecho -e "\033[31mPlease Input User  Beginning And End  Number: eg (001-002)\033[0m "read Add_User_Rangeif [ ! -n "$Add_User_Range" ];thenAdd_User_Range=$Add_User_RangeelseA_R_Start=`echo $Add_User_Range |awk -F- '{ print $1}'| awk '{print $0+0}'`A_R_U_Start=`printf "%03d\n" $A_R_Start`A_R_End=`echo $Add_User_Range |awk -F- '{ print $2}' | awk '{print $0+0}'`A_R_U_End=`printf "%03d\n" $A_R_End`A_R_End1=$[$A_R_End+1]fiecho -e "\033[31mPlease Enter the Project Name\033[0m "read Add_Role_TenantIF_Tenant_Exists=`openstack project list |sed '1,3d' |sed '$d' |awk '{print $4}'`if  echo "${IF_Tenant_Exists[@]}" | grep -w "$Add_Role_Tenant" >> /dev/null ; thenecho "exists" >> /dev/nullelseecho -e "\033[31mProject $Add_Role_Tenant not exists\033[0m "exit 1fiecho -e "\033[31mPlease Enter the  Role Name\033[0m "read Add_Role_New_RoleIF_Role_Exists=`openstack role list |sed '1,3d' |sed '$d' |awk '{print $4}'`if  echo "${IF_Role_Exists[@]}" | grep -w "$Add_Role_New_Role" >> /dev/null ; thenecho "exists" >> /dev/nullelse    echo -e "\033[31mRole $Add_Role_New_Role not exists\033[0m "exit 1fifor (( username_number=$A_R_Start;username_number<$A_R_End1;username_number++ ));doreal_username_number=`printf "%03d\n" $username_number`openstack role add --project $Add_Role_Tenant --user $Add_Role_Username$real_username_number $Add_Role_New_Roleecho -e "\033[31mKeystone user $Add_Role_Username$real_username_number Project $Add_Role_Tenant role list\033[0m "openstack role assignment list --user $Add_Role_Username$real_username_number --project $Add_Role_Tenant done

5.绑定用户权限
将项目研发部、业务部的用户绑定普通用户权限;将 IT 工程部的用户绑定管理员和普通用户权限。
使用web界面绑定如下。

通过 Shell 命令行将项目研发部用户 rduser002 绑定普通用户权限

openstack role add --user rduser002 --project RD_Dept _member_

查看执行结果

openstack role list --user rduser002 --project RD_Dept

使用脚本绑定普通用户和管理员权限执行结果如下。

项目四:基础控制服务

任务一消息队列服务
1.消息队列
AMQP是一种标准化的消息中间件协议,全称为高级消息队列协议(advancedmessagequeuingprotocol)。可以让不同语言、不同系统的应用互相通信,并提供一个简单统一的模型和编程接口。这样,就可以采用各种语言和平台来实现自身的应用,当需要和其他系统通信时,只要承认AMQP协议即可。

2.Rabbitmq消息服务RabbitMQ是一个基于AMQP协议的高级消息中间件,它主要的技术特点是可用性,安全性,集群,多协议支持,可视化的客户端,活跃的社区。

3.了解消息队列AMQP
消息队列AMQP服务架构,如图4-1所示。AMQP中有3个重要的角色,如图所示。
Publisher:消息的发出者。
Exchange:消息的传递者。
Consumer:消息的接收者。
用户可以模拟写信作为其工作的方式来说明。为了传递给收件人,首先需要用信封把信的内容装起来,然后在信封上写好收件人的信息,再把信放到邮筒里;后面邮局会拿到信然后根据信封上的收件人信息来看最终把信给谁。写信的人就是那个Publisher,邮局就是Exchange,收件人就是Consumer。不同的Consumer会创建不同的Queue(消息队列),然后将对应的Exchange绑定到Queue上。在消息的传递过程中,Publisher不会直接的把Message放到Queue中,也不管Message如何分发。Publisher只管准备好消息,然后交给Exchange,而Exchange做的事情也很简单,一手从Publisher拿到消息,然后就把消息放入Queue中。对于Exchange,是放到某一个Queue中,还是放到多个Queue?实际上,在Publisher发出消息的时候会附加一个条件,Exchange会根据这个条件来决定发送的方法,这个条件就是routingkey。

                 AMQP消息传递示意图

4.了解Rabbitmq消息服务

Rabbitmq架构图,如图所示。

通过上面这张应用相结合的结构图既能够清晰的看清楚整体的sendMessage到ReceiveMessage的一个大致的流程。

首先Rabbitmq有如下几种命令行工具。

①rabbitmqctl:用来管理RabbitMQ中间件的命令行工具.它通过连接中间件节点来执行所有操作。

②rabbitmq-plugins:rabbitmq-plugins是管理RabbitMQbroker插件的命令行。

5.OpenStack的消息服务

OpenStack采用AMQP作为它的消息传递技术。AMQP的控制端(Broker),不管是RabbitMQ或者Qpid,它的作用是允许任何两个相同组件以松散耦合的方式进行交流。更准确地说,OpenStack的组件均可以使用远程呼叫机制(RPC)进行彼此沟通。然而,这种范式是建立在“publish/subscribe模式”(订阅/发布模式,订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态)。如图所示。这样做的好处如下。
(1)客户端和服务端之间的解耦(如客户端不需要知道服务引用)。
(2)客户机和服务之间不需要同时使用消息调用,只需要其中一端发送消息调用指令。
(3)随机平衡的远程调用会随机将运行的指令发送到一个节点。

下面以计算服务Nova为例,讲解OpenStack组件使用消息服务的原理和机制。Nova中的每个组件都会连接消息服务器,一个组件可能是一个消息发送者(如API、Scheduler),也可能是一个消息接收者(如compute、volume、network)。发送消息有2种方式:同步调用rpc.call和异步调用rpc.cast。Nova实现了RPC(包括请求+响应的rpc.call和只有请求的rpc.cast),Nova通过AMQP提供一个代理类,这个类提供了函数调用的消息数据编码和数据解码,每个Nova服务(如计算)在初始化时创建两个队列,一个接受消息路由的关键节点类型产生对应的节点编号”(例如compute.hostname),另一个接受消息路由键返回的节点类型编号生成通用的“节点类型”(例如计算)。前者是专门用来当Nova-API需要重定向命令像terminate(终止)一个实例的在特定的节点,在这种情况下,只有主机的计算节点的虚拟机监控程才能杀死序正在运行的虚拟机实例。API作为消费者当RPC调用请求/响应,否则只是充当发布,如图4-5所示。

6.NovaRPC映射

当一个实例在OpenStack云部署和共享,每个组件在Nova连接到messagebroker,根据其个性,如计算节点或网络节点,可以使用队列作为调用者(如API或调度器)或一个运行组件(如计算或网络)。调用器和组件不实际存在于Nova对象模型,但是在这个例子中使用它们作为一个抽象对象。一个调用程序是一个组件,使用rpc发送消息队列系统,接收消息的队列系统,并相应地回复rpc调用操作,如图所示。

                  Nova 消息传递

              OpenStack rpc 调用机制

下面介绍几个OpenStack在消息传递过程中常用的对象。

(1)TopicPublisher:该对象在进行rpc.call或rpc.cast调用时创建,每个对象都会连接同一个topic类型的交换器,消息发送完毕后对象被回收。

(2)DirectPublisher:该对象在进行rpc.call调用时创建,用于向消息发送者返回响应。该对象会根据接收到的消息属性连接一个direct类型的交换器

(3)DirectConsumer:该对象在进行rpc.call调用时创建,用于接收响应消息。每一个对象都会通过一个队列连接一个direct类型的交换器(队列和交换器以UUID命名)。

(4)TopicConsumer:该对象在内部服务初始化时创建,在服务过程中一直存在。用于从队列中接收消息,调用消息属性中指定的函数。该对象通过一个共享队列或一个私有队列连接一个topic类型的交换器。每一个内部服务都有两个topicconsumer,一个用于rpc.cast调用(此时连接的是binding-key为“topic”的共享队列)。另一个用于rpc.call调用(此时连接的是binding-key为“topic.host”的私有队列)

(5)TopicExchange:topic类型交换器,每一个消息代理节点只有一个topic类型的交换器。

(6)DirectExchange:direct类型的交换器,存在于rpc.call调用过程中,对于每一个rpc.call的调用,都会产生该对象的一个实例。

(7)QueueElement:消息队列。可以共享也可以私有。routing-key为“topic”的队列会在相同类型的服务中共享(如多个compute节点共享一个routing-key为“topic”的队列)。
任务二 学习镜像服务
1.概述
Glance镜像服务实现发现、注册、获取虚拟机镜像和镜像元数据,镜像数据支持存储多种的存储系统,可以是简单文件系统、对象存储系统等。
2.Glance服务架构Glance镜像服务是典型的C/S架构,Glance架构包括glance-CLIent、Glance和GlanceStore。Glance主要包括RESTAPI、数据库抽象层(DAL)、域控制器(glancedomaincontroller)和注册层(registrylayer),Glance使用集中数据库(GlanceDB)在Glance各组件间直接共享数据。所有的镜像文件操作都通过glance_store库完成,glance_store库提供了通用接口,对接后端外部不同存储。

(1)客户端(CLient):外部用于同Glance服务的交互和操作。

(2)glance-api:Glance对外的REST接口。

(3)数据库抽闲层(DAL):Glance和数据库直接交互的编程接口。

(4)Glance域控制器:中间件实现Glance的认证、通知、策略和数据链接等主要功能。

(5)注册层:可选层,用于管理域控制和数据库DAL层之间的安全通信。

(6)GlanceDB:存储镜像的元数据,根据需要可以选择不同类型的数据库,目前采用Mysql。

(7)GlanceStore:Glance对接不同数据存储的抽象层。

8)后端存储:实际接入的存储系统。可以接入简单文件系统、Swift、Ceph和S3云存储等。当前框架选择存储在本地,目录在控制节点:/var/lib/glance/images/。


Glance服务自带两个配置文件,在使用Glance镜像服务时需要配置glance-api.conf和glance-registry.conf两个服务模块。在添加镜像到Glance时,需要指定虚拟镜像的磁盘格式(diskformat)和容器格式(containerformat)。

镜像服务运行两个后台服务进程Demon,如下。

(1)glance-api:对外接受并发布镜像、获取和存储的请求调用。

(2)glance-registry:存储、处理和获取镜像元数据,内部服务只有Glance内部使用,不暴露给用户。

(3)glance-all:是对前两个进程的通用封装,操作方式和结果一直。

3.镜像文件格式
虚拟机镜像需要指定磁盘格式和容器格式。虚拟设备供应商将不同的格式布局的信息存在一个虚拟机磁盘映像,虚拟机的磁盘镜像的格式基本有如下几种。

(1)raw:非结构化磁盘镜像格式。

(2)qcow2:QEMU模拟器支持的可动态扩展、写时复制的磁盘格式,是kvm虚拟机默认使用的磁盘文件格式。

(3)AMI/AKI/ARI:AmazonEC2最初支持的镜像格式。

(4)UECtarball:ubuntuenterprisecloudtarball是一个gzip压缩后的tar文件,包含有AMI、AKI和ARI三种类型的文件。

(5)VHD:microsoftvirtualharddiskformat(微软虚拟磁盘文件)的简称。

(6)VDI:VirtualBox使用VDI(virtualdiskimage)的镜像格式,OpenStack没有提供直接的支持,需要进行格式转换。

(7)VMDK:VMWarevirtualmachinediskformat是虚拟机VMware创建的虚拟机格式。

(8)OVF:openvirtualizationformat,开放虚拟化格式,OVF文件是一种开源的文件规范,可用于虚拟机文件的打包。

容器格式是可以理解成虚拟机镜像添加元数据后重新打包的格式,目前有以下几种容器格式。

(1)Bare:指定没有容器和元数据封装在镜像中,如果Glance和OpenStack的其他服务没有使用容器格式的字符串,为了安全,建议设置bare。

(2)ovf:ovf的容器模式ThisistheOVFcontainerformat。

(3)aki:存储在Glance中的是Amazon的内核镜像。

(4)ari:存储在Glance中的是Amazon的ramdisk镜像。

(5)ami:存储在Glance中的是Amazon的machine镜像。

(6)ova:存储在Glance中的是OVA的tar归档文件。

4.镜像状态
由于镜像文件都比较大,镜像从创建到成功上传到Glance文件系统中,是通过异步任务的方式一步步完成的,状态包括Queued(排队)、Saving(保存中)、Acive(有效)、deactivated(无效)、Killed(错误)、Deleted(被删除)和Pending_delete(等待删除),如图所示。


(1)Queued排队:镜像ID已经创建和注册,但是镜像数据还没有上传。

(2)Saving保存中:镜像数据在上传中

(3)Active有效:镜像成功创建,状态有效可用。

(4)Deactivated不活的:镜像成功创建,镜像对非管理员用户不可用。

(5)Killed错误:上传镜像数据出错目前不可读取。

(6)Deleted被删除:镜像不可用,将被自动删除。

(7)Pending_delete等待删除:镜像不可用,等待将被自动删除。

1.镜像服务基本操作
CirrOS是一个极小的云操作系统,下面的基础操作使用这个小系统来演示。

查询Glance服务状态命令如下

glance-controlallstatus

查询结果如下所示。

glance-api(pid2633)isrunning...glance-registry(pid2654)isrunning...glance_scrubberisstoped

查询glance-control版本命令如下。

glance-control--version

该命令查询结果如下。

12.0.0

启动相关服务,并设置为开机自启动。

systemctlstartopenstack-glance-api
systemctlstartopenstack-glance-registry
systemctlenableopenstack-glance-api
systemctlenableopenstack-glance-registry

在Dashboard中以admin账户登录,查看镜像。下面,通过上传本地镜像文件和从网站下载镜像文件的方式进行创建、查询、删除和修改镜像如图所示。


(1)下载CirrOS镜像文件

mkdir /tmp/images
cd /tmp/images/
wget http://download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img

执行结果如下所示。

--2016-10-1201:14:05--  http://download.cirros-cloud.net/0.3.2/cirros-0. 3.2-x86_64-disk.img
Resolving download.cirros-cloud.net... 64.90.42.85, 2607:f298:6:a036:: bd6:a72a
Connecting to download.cirros-cloud.net|64.90.42.85|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13167616 (13M) [text/plain]
Saving to: “cirros-0.3.2-x86_64-disk.img”
100%[========================================>] 13,167,616   104K/s   in 5m 42s
2016-10-12 01:19:47 (37.6 KB/s) - “cirros-0.3.2-x86_64-disk.img” saved [13167616/13167616]

下载完成后,查看文件信息,命令如下。

file cirros-0.3.2-x86_64-disk.img

该命令执行结果如下所示。

cirros-0.3.2-x86_64-disk.img: QEMU QCOW Image (v2), 41126400 bytes

(2)使用命令行创建镜像

glance image-create --name "cirros-0.3.2-x86_64" --disk-format qcow2 --container-format bare --progress < cirros-0.3.2-x86_64-disk.img

执行结果如下所示。

创建成功后,可以登录界面,查看镜像信息,如图所示。

(3)通过Dashboard创建镜像
通过界面,选择从互联网直接下载,创建镜像。
镜像采用0.3.4版本,地址如下。
http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img,镜像名称为“cirros-0.3.4-x86_64”,格式选择“QCOW2-QEMU模拟器”,如图所示。

选择“创建镜像”按钮,可以看到新镜像“cirros-0.3.4-x86_64”被创建,状态从“排队中”开始,成功后变为“运行中”,创建结果如图所示。

(4)查看镜像信息
下面通过命令方式,查看镜像的基本信息。
使用命令:glance image-list
先查看镜像列表,

+--------------------------------------+---------------------+
| ID                                          | Name                   |
+--------------------------------------+---------------------+
| e14b5e35-5e04-4da2-823d-b5f6e3283ebd | centos                 |
| 6aec74a2-eb83-45b6-99df-5f4ce025640c | cirros-0.3.2-x86_64 |
| d2af35dc-8eb3-431c-8450-d2ee5a72c93b | cirros-0.3.4-x86_64 |
+--------------------------------------+---------------------+

然后通过glance image-show命令查看镜像的详细信息,其中参数可以是镜像id或者镜像名称,如下所示。

glance image-show e14b5e35-5e04-4da2-823d-b5f6e3283ebd

查询结果如下所示.

(5)更改镜像
可以使用glance image-update更新镜像信息,可以使用glance image-delete删除镜像信息。
如果需要改变镜像启动硬盘最低要求值(min-disk)时,min-disk默认单位为GG。
使用glance image-update更新镜像信息操作如下。

glance image-update --min-disk=1 6aec74a2-eb83-45b6-99df-5f4ce025640c

查询结果如下所示。

通过命令删除镜像cirros-0.3.2-x86_64操作如下,执行结果如下所示。

glance image-delete  6aec74a2-eb83-45b6-99df-5f4ce025640c
# glance image-list
+--------------------------------------+---------------------+
| ID                                          | Name                   |
+--------------------------------------+---------------------+
| e14b5e35-5e04-4da2-823d-b5f6e3283ebd | centos                 |
| d2af35dc-8eb3-431c-8450-d2ee5a72c93b | cirros-0.3.4-x86_64 |
+--------------------------------------+---------------------+

学习计算服务

1.概述
计算服务(Nova)表示云平台的工作负载的核心。如果有些云服务的工作中不包括计算,那么它们充其量只代表静态存储,所有动态活动都会涉及一些计算元素。OpenStackCompute这个名称指的是一个特定的项目,该项目也被称为Nova,OpenStack的其他组件依托Nova,与Nova协同工作,组成了整个OpenStack云平台。
Nova,是OpenStack计算的弹性控制器。Nova可以说是整个云平台最重要的组件,其功能包括运行虚拟机实例,管理网络以及通过用户和项目来控制对云的访问。OpenStack最基础的开源项目名字称为Nova,它提供的软件可以控制基础设施即服务(IaaS)云计算平台,与AmazonEC2和Rackspace云服务器有一定程度的相似。OpenStackCompute没有包含任何的虚拟化软件,相反,它定义和运行在主机操作系统上的虚拟化机制交互的驱动程序,并通过基于Web的程序应用接口(API)来提供功能的使用。
2.架构介绍
Nova服务包含了7个子组件,分别为:NovaAPI、NovaCert、NovaCompute、NovaConductor和NovaScheduler、NovaConsoleauth以及NovaVncproxy,如图所示。

(1)NovaAPI
NovaAPI这是一个HTTP服务,用于接收和处理客户端发送的HTTP请求;API是整个Nova组件的入口。它接受用户请求,将指令发送至消息队列(Queue),并由Nova服务的子服务执行相应的操作。
(2)NovaCert
用于管理证书认证,提供兼容性保障,保证所有的应用程序都能在云上运行。
(3)NovaCompute
NovaCompute是Nova核心子组件,通过与NovaClient进行交互,实现了虚拟机管理的功能。负责在计算节点上对虚拟机实例进行一系列操作,包括迁移、安全组策略和快照管理等功能。
(4)NovaConductor
NovaConductor是OpenStack中的一个RPC服务,主要提供对数据库的查询和权限分配操作。
(5)NovaScheduler
完成Nova的核心调度,包括虚拟机硬件资源调度、节点调度等。同时,NovaScheduler决定了虚拟机创建的具体位置。
(6)NovaConsoleauth
实现对Nova控制台(VNC)的认证操作。
(7)NovaVncproxy
Nova的控制台组件,实现客户端与虚拟机实例的通信,在虚拟桌面领域运用较广泛。
可以通过一个Nova实例的启动过程来了解一下内部的数据和请求的运行情况。首先用户会通过Web界面或者CLI界面发送一个启动实例的请求,首先需要通过认证服务的Keystone的请求,进行身份的验证,通过之后将拿到的token向nova-api发送请求,在通过Glance镜像服务检查镜像image和类型flavor时候存在。通过上述验证后将启动实例的请求发送给计算服务的schedule调度节点,调度节点随机将此请求发送给一个compute节点,让其启动实例,计算节点接受请求之后会到Glance存在的计算节点开始下载镜像并启动实例,计算节点启动虚拟机的时候会通过Neutron的DHCP获取一个对应的IP等网络资源,再次在OVS网桥获取相应的端口,绑定虚拟机的虚拟网卡接口。至此实例的启动已经完成。
Nova集合了多个服务进程,每个进程扮演着不同的角色。用户通过RESTAPI接口访问,Nova的内部服务通过RPC消息服务通信。API服务产生数据读写的REST请求,然后产生REST应答。内部服务通信通过oslo.messaging库的RPC消息实现消息的通信。大部分共用一个中心数据库。也可以把中心数据放到对象层,实现不同OpenStack发布版本的兼容性,如图所示。

3.调度机制(scheduler)
Scheduler模块在OpenStack中的作用就是决策虚拟机创建在哪个主机上,目前(截至Essex版本),调度仅支持计算节点。

(1)主机过滤
如图4-15所示,FilterScheduler首先得到未经过滤的主机列表,然后根据过滤属性,选择主机创建指定数目的虚拟机。
目前,OpenStack默认支持几种过滤策略,开发者也可以根据需要实现自己的过滤策略。在nova.scheduler.filters包中的过滤器有以下几种。
① AllHostsFilter:不做任何过滤,直接返回所有可用的主机列表。
② AvailabilityZoneFilter:返回创建虚拟机参数指定的集群内的主机。
③ ComputeFilter:根据创建虚拟机规格属性选择主机。
④ CoreFilter:根据CPU数过滤主机。
⑤ IsolatedHostsFilter:根据“image_isolated”和“host_isolated”标志选择主机。
⑥ JsonFilter:根据简单的JSON字符串指定的规则选择主机。
⑦ RamFilter:根据指定的RAM值选择资源足够的主机。
⑧ SimpleCIDRAffinityFilter:选择在同一IP段内的主机。
⑨ DifferentHostFilter:选择与一组虚拟机不同位置的主机。
⑩ SameHostFilter:选择与一组虚拟机相同位置的主机。

(2)权值计算
经过主机过滤后,需要对主机进行权值的计算。根据策略选择相应的某一台主机(对于每一个要创建的虚拟机而言)。尝试在一台不适合的主机上创建虚拟机的代价比在一台合适主机上创建的代价要高,例如,在一台高性能主机上创建一台功能简单的普通虚拟机的代价是高的。OpenStack对权值的计算需要一个或多个(Weight值代价函数)的组合,然后对每一个经过过滤的主机调用代价函数进行计算,将得到的值与Weight值相乘,得到最终的权值。OpenStack将在权值最小的主机上创建一台虚拟机,如图所示。


(3)配置文件讲解
Nova的安装与Glance组件的部署流程类似,Nova的子服务更多,把nova-compute单独部署在计算节点,Nova的其他服务部署在控制节点。
为了实现计算节点的Nova-compute服务与控制节点上Nova其他的子服务通信,需要在配置文件中配置Rabbit消息队列服务。(已配置)

[root@controller ~]# vi /etc/nova/nova.conf

配置如下所示内容。

[DEFAULT]
rpc_backend = rabbit

Nova服务的数据存储在MySQL数据库中,需要在数据库中创建Nova数据库并给予一定的权限,在Nova的配置文件中配置数据库连接,指向MySQL中的Nova数据库。
配置如下所示内容。

[api_database]
connection = mysql+pymysql://nova:000000@controller/nova_api#mysql -uroot -p

执行如下所示的命令,赋予数据库权限。(已授予 可直接查看 show grants for nova)

mysql> CREATE DATABASE nova;
mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIEDBY 'NOVA_DBPASS';
mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIEDBY
'NOVA_DBPASS';
同步数据库:
# su -s /bin/sh -c "nova-manage db sync" nova

跟Glance组件一样,需要在Keystone创建nova用户,执行的命令和结果如下所示。
可通过 openstack user list 查看是否有nova用户
可通过openstack role list --user nova --project service查看nova的权限或者通过dashboard查看


赋予nova用户admin权限,并把nova用户规划到service租户下,同时在Keystone中注册Nova服务,服务类型为compute。执行的命令和结果如下所示。

在Keystone中创建Nova计算服务的端点。执行的命令和结果如下所示。
可通过 openstack endpoint list查看

  openstack endpoint create --region RegionOne compute public
http://controller:8774/v2.1/%\(tenant_id\)sopenstack endpoint create --region RegionOne compute internal
http://controller:8774/v2.1/%\(tenant_id\)sopenstack endpoint create --region RegionOne compute admin
http://controller:8774/v2.1/%\(tenant_id\)s

为了实现Nova服务调用其他服务,需要在Nova的配置文件中配置其通过Keystone的认证。在/etc/nova/nova.conf中插入配置信息。

#openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis  osapi_compute,metadata
openstack-config --set /etc/nova/nova.conf DEFAULT rpc_backend  rabbit
openstack-config --set /etc/nova/nova.conf DEFAULT auth_strategy   keystone
openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 20.0.0.10
openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True
openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
openstack-config --set /etc/nova/nova.conf DEFAULT metadata_listen 0.0.0.0
openstack-config --set /etc/nova/nova.conf DEFAULT metadata_listen_port 8775
openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_host controller
openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_userid openstack
openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit  rabbit_password  000000
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_uri http://controller:5000
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:35357
openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name default
openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name default
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service
openstack-config --set /etc/nova/nova.conf keystone_authtoken username  nova
openstack-config --set /etc/nova/nova.conf keystone_authtoken password
000000
openstack-config --set /etc/nova/nova.conf vnc vncserver_listen 20.0.0.10
openstack-config --set /etc/nova/nova.conf vnc vncserver_proxyclient_address 20.0.0.10
openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292
openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp

为了实现对平台虚拟机的访问,OpenStack提供了VNC的接入方式,需要在Nova的配置文件中配置vnc接入。(老版本)

[DEFAULT]
#rpc_backend = qpid
#qpid_hostname = controller
my_ip = 172.24.2.10
vncserver_listen = 172.24.2.10
vncserver_proxyclient_address = 172.24.2.10

(4)Nova的主要操作命令
Nova作为OpenStack的核心组件,拥有强大的功能、权限,可以对整个平台的资源(镜像、网络和存储等)进行管理,下面来看一下Nova的主要操作命令。
① Nova对镜像进行管理。
nova image-create
功能:通过快照创建镜像。
格式:

nova image-create [--show] [--poll] <server><name>

固定参数说明。
:做快照的实例的名字或者ID。
:快照名字。
可选参数说明。
[–show] :打印出镜像信息。
[–poll]:显示进度。
nova image-show
功能:获取镜像的详细信息。
格式:nova image-show
参数说明。
:所要查询的镜像的名字或者ID。

nova image-list

执行结果如下所示。

nova image-show f7cac855-e4a1-4690-bd1b-f8d79f90286f

具体执行结果如下所示。

② Nova管理安全组规则。
安全组,翻译成英文是security group。安全组是一些规则的集合,用来对虚拟机的访问流量加以限制,这反映到底层,就是使用iptables,给虚拟机所在的宿主机添加iptables规则。可以定义n个安全组,每个安全组可以有n个规则,可以给每个实例绑定n个安全组,Nova中总是有一个default安全组,这个是不能被删除的。创建实例的时候,如果不指定安全组,会默认使用这个default安全组。现在Nova中安全组应该会移到Neutron中,并且会增加对虚拟机外出流量的控制。现在Nova中的安全组只是对进入虚拟机的流量加以控制,对虚拟机外出流量没有加以限制。
常用的安全组命令如下。

nova secgroup-create

功能:创建安全组。
格式:

usage: nova secgroup-create <name><description>

参数说明。
:安全组名字。
:安全组描述。
举例:

nova secgroup-create test 'test the nova command about the rules'

nova secgroup-add-rule

功能:给安全组添加规则。
格式:

usage: nova secgroup-add-rule <secgroup><ip-proto><from-port><to-port>
<cidr>

5.kolla ansible搭建OpenStack

基础环境配置

服务器基础配置
系统:centos8.3
内存:16G 最小8G
硬盘:100G 最小40G
网卡:双网卡 最少双网卡
cpu:16核

实际操作

关闭防火墙

[root@localhost ~]# vi /etc/selinux/config# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted#临时关闭selinux
[root@localhost ~]# setenforce 0#关闭防火墙并设置开机不自启
[root@localhost ~]# systemctl disable firewalld && systemctl stop firewalld

修改主机名并配置hosts文件

#设置主机名为openstack
[root@localhost ~]#hostnamectl set-hostname openstak#设置本地映射
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.245.80 openstack

修改IP地址

[root@openstak ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens192
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens192
UUID=ea9f53c4-29dd-481d-a636-eed43df2f53c
DEVICE=ens192
ONBOOT=yes
IPADDR=192.168.245.80
NETMASK=255.255.255.0
GATEWAY=192.168.245.254
DNS1=114.114.114.114
DNS2=223.5.5.5#重启网卡使配置生效
[root@openstak ~]# ifdown ens192 && ifup ens192
Connection 'ens192' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)

更新epel

yum -y install epel-release

配置yum源

[root@localhost ~]#vi /etc/yum.repos.d/wangyi.repo
[wangyi]
name=wangyi
baseurl=http://mirrors.163.com/centos/8.3.2011/BaseOS/x86_64/os/
enbaled=1
gpgcheck=0

配置pip源

[root@openstak ~]# mkdir ~/.pip
[root@openstak ~]# cat > ~/.pip/pip.conf << EOF
> [global]
> trusted-host=mirrors.aliyun.com
> index-url=https://mirrors.aliyun.com/pypi/simple/
> EOF
[root@openstak ~]# cat  ~/.pip/pip.conf
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/

卸载libvirt

#本地的libvirt会导致异常
[root@openstak kolla]# yum remove -y libvirt*

安装
安装基础软件

#centos8中默认的自动安装程序dnf,yum的升级版本,yum依旧可以使用
[root@openstak ~]#dnf install python3-devel libffi-devel gcc openssl-devel python3-libselinux -y #安装python3-pip
[root@openstak ~]# dnf install python3-pip -y #更新pip版本
[root@openstak ~]# pip3 install -U pip#安装Kolla Ansible,至少需要Ansible2.9并最多支持2.10。
[root@openstak ~]# dnf install ansible -y#安装kolla-ansible及其依赖项pip。
[root@openstak ~]# pip3 install kolla-ansible
#遇到错误
ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
#忽略已经按照的PyYAML,重新按照PyYAML
[root@openstak ~]# pip3 install PyYAML --ignore-installed PyYAML
#重新安装
[root@openstak ~]# pip3 install kolla-ansible  #安装docker
#1、需要CentOS7或者8的维护版本
#2、需要卸载原来安装的:
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
#3、安装yum-tuils,一个管理repository及扩展包
yum install -y yum-utils
#4、添加repo仓库文件
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo #默认国外镜像源,可以选择国内的。yum-config-manager     --add-repo     https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#5、安装docker ce社区版本,ee企业版本,官方推荐社区版本。
yum install -y docker-ce docker-ce-cli containerd.io#如果遇到错误
[root@openstak kolla]# dnf install -y docker-ce docker-ce-cli containerd.io
Last metadata expiration check: 0:00:56 ago on Tue 18 May 2021 10:54:55 AM EDT.
Error: Problem 1: problem with installed package podman-2.0.5-5.module_el8.3.0+512+b3b58dca.x86_64- package podman-2.0.5-5.module_el8.3.0+512+b3b58dca.x86_64 requires runc >= 1.0.0-57, but none of the providers can be installed
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
#执行以下命令,一路选择y
[root@openstak kolla]# yum erase podman buildah
#然后在重现之前的安装命令#6、启动docker服务
systemctl start docker
#7、验证是否安装成功
docker --version
docker info#配置docker加速
#1.创建一个目录
mkdir -p /etc/docker
#2.编写配置文件
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://m6bpldf6.mirror.aliyuncs.com"]
}
EOF
#3.重启服务
systemctl daemon-reload
systemctl restart docker

配置

#创建目录并更改属主
[root@openstak ~]# mkdir -p /etc/kolla
[root@openstak ~]# chown $USER:$USER /etc/kolla#复制文件到创建的目录
[root@openstak ~]# cp -r /usr/local/share/kolla-ansible/etc_examples/kolla/* /etc/kolla#复制规划文件到创建的目录
[root@openstak ~]# cp /usr/local/share/kolla-ansible/ansible/inventory/* /etc/kolla/#配置Ansible
[root@openstak ~]# vim /etc/ansible/ansible.cfg
[root@openstak ~]# cat /etc/ansible/ansible.cfg
[defaults]
host_key_checking=False
pipelining=True
forks=100#配置配置----克拉(Kolla)Ansible自带all-in-one(单机)和multinode(集群)例子清单文件
[root@openstak ~]# vim /etc/kolla/all-in-one
# These initial groups are the only groups required to be modified. The
# additional groups are for more control of the environment.
[control]openstack[network]openstack[compute]openstack[storage]openstack[monitoring]openstack[deployment]openstack
#其他保持不变#配置shh无密码访问
[root@openstak kolla]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #回车
Enter passphrase (empty for no passphrase): #回车
Enter same passphrase again: #回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nyuj8ux2DOgNj3Ve5kv4brBqizINhHSVBy0WvGE3mBI root@openstak
The key's randomart image is:
+---[RSA 3072]----+
|   E++B          |
| . o X =         |
|... + * .        |
|. .  .           |
| .   .  S        |
|  . o o ooo.     |
|   + * =.*+      |
|  o =o= Boo.     |
|   o.*B= ==.     |
+----[SHA256]-----+
[root@openstak kolla]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@openstack
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@openstack's password: #输入服务器密码Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'root@openstack'"
and check to make sure that only the key(s) you wanted were added.#检查配置文件是否正确
[root@openstak kolla]# cd /etc/kolla/
[root@openstak kolla]# ansible -i all-in-one all -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
openstack | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}#配置密码
[root@openstak kolla]# kolla-genpwd
#方便后续horizon登录,修改密码
[root@openstak kolla]# vim /etc/kolla/passwords.yml
keystone_admin_password: 000000#kolla核心配置文件,globals.yml是Kolla Ansible的主要配置文件。部署Kolla Ansible需要一些选项
[root@openstak kolla]# vim /etc/kolla/globals.yml
[root@openstak kolla]# cat /etc/kolla/globals.yml #kolla镜像基于不同linux发型版构建
kolla_base_distro: "centos"#kolla镜像基于binary二进制和source源码两种类型构建
kolla_install_type: "source"#openstack版本可自定义,会从dockerhub拉取对应版本的镜像
penstack_release: "train"#OpenStack内部管理网络地址,通过该IP访问OpenStack Web页面进行管理。
kolla_internal_vip_address: "192.168.245.80"#OpenStack内部管理网络地址的网卡接口
network_interface: "ens192"#OpenStack外部(或公共)网络的网卡接口
neutron_external_interface: "ens224"#关闭高可用
enable_haproxy: "no"#指定nova-compute守护进程使用的虚拟化技术
nova_compute_virt_type: "qemu"# Docker options# docker_registry: 默认从dockerhub拉取镜像,这里使用阿里云镜像仓库,也可以本地搭建仓库,提前推送镜像上去。
docker_registry: "registry.cn-hangzhou.aliyuncs.com"#阿里云kolla镜像仓库所在的命名空间,dockerhub官网默认是kolla。
docker_namespace: "kollaimg"

部署

安装bootstrap-servers部署OpenStack所需的依赖包。该包由kolla-ansible提供,包含docker

[root@openstak kolla]# kolla-ansible -i /etc/kolla/all-in-one bootstrap-servers
#对当前主机进行预部署(检测),直接看最后的统计即可。如果检测报错,可以查看前面的TASK:[precheck ...]部分,可以快速定位到错误
[root@openstak kolla]# kolla-ansible -i /etc/kolla/all-in-one prechecks

拉取镜像(可以不做,在部署的时候会自动拉取)

[root@openstak kolla]# kolla-ansible -i /etc/kolla/all-in-one pull

拉取完成,查看镜像

[root@openstak kolla]# docker images
REPOSITORY                                      TAG        IMAGE ID       CREATED      SIZE
kolla/centos-source-nova-compute                victoria   df01b9bb08d8   2 days ago   2.12GB
kolla/centos-source-neutron-server              victoria   e6aa3769f30a   2 days ago   1.18GB
kolla/centos-source-nova-libvirt                victoria   5b7a773c1e40   2 days ago   1.41GB
kolla/centos-source-mariadb-server              victoria   558e44d63b79   2 days ago   625MB
kolla/centos-source-kolla-toolbox               victoria   157a600fe9d3   2 days ago   970MB
kolla/centos-source-mariadb-clustercheck        victoria   1511a20029cc   2 days ago   583MB
kolla/centos-source-openvswitch-db-server       victoria   7c35fba69416   2 days ago   507MB
kolla/centos-source-openvswitch-vswitchd        victoria   5f0dc8964039   2 days ago   507MB
kolla/centos-source-fluentd                     victoria   7eb541de5475   2 days ago   600MB
kolla/centos-source-cron                        victoria   0963323b4d39   2 days ago   384MB
kolla/centos-source-chrony                      victoria   609e197f5642   2 days ago   385MB
kolla/centos-source-rabbitmq                    victoria   dfaa91fa4bae   2 days ago   440MB
kolla/centos-source-memcached                   victoria   6036dde9f320   2 days ago   404MB
kolla/centos-source-nova-novncproxy             victoria   31432c2417c3   9 days ago   1.27GB
kolla/centos-source-nova-ssh                    victoria   f95d3fea6ebe   9 days ago   1.22GB
kolla/centos-source-nova-conductor              victoria   e21e9943e8d1   9 days ago   1.18GB
kolla/centos-source-nova-api                    victoria   c244dc5b4bd4   9 days ago   1.18GB
kolla/centos-source-nova-scheduler              victoria   d77816a60046   9 days ago   1.18GB
kolla/centos-source-heat-api-cfn                victoria   b3047eff6c79   9 days ago   926MB
kolla/centos-source-heat-api                    victoria   c7cd8a618aee   9 days ago   926MB
kolla/centos-source-heat-engine                 victoria   f3bc59c56ff2   9 days ago   926MB
kolla/centos-source-neutron-l3-agent            victoria   e19a3344310d   9 days ago   1.21GB
kolla/centos-source-neutron-openvswitch-agent   victoria   2db3342e0693   9 days ago   1.16GB
kolla/centos-source-neutron-metadata-agent      victoria   e5890cefe2cd   9 days ago   1.16GB
kolla/centos-source-neutron-dhcp-agent          victoria   391de01664cb   9 days ago   1.16GB
kolla/centos-source-keystone                    victoria   446bd76574e6   9 days ago   1GB
kolla/centos-source-keystone-ssh                victoria   f2f01ac07ca4   9 days ago   1.01GB
kolla/centos-source-keystone-fernet             victoria   df09ece0edfc   9 days ago   1GB
kolla/centos-source-glance-api                  victoria   cd7119d229c4   9 days ago   997MB
kolla/centos-source-placement-api               victoria   81e88b5a2e2d   9 days ago   937MB
kolla/centos-source-horizon                     victoria   1915627e5579   9 days ago   1.07GB

部署

[root@openstak ~]# kolla-ansible -i /etc/kolla/all-in-one deploy
#部署成功可以登录查询
http://192.168.245.80

生成admin-openrc.sh文件

[root@openstak ~]# kolla-ansible -i /etc/kolla/all-in-one post-deploy

部署完成使用浏览器访问http://192.168.245.80出现如下界面。

OpenStack搭建过程(随笔搭建)相关推荐

  1. Openstack云平台的搭建与部署(具体实验过程截图评论拿)

    目录 Openstack云平台的搭建与部署................................... 3 Keywords:Openstack.Cloud Computing.Iaas.. ...

  2. 先电iaas云平台搭建(openstack)————搭建过程

    写在前面: 1,在上一篇博客中具体记录了创建controller和compute这两个节点的过程 2,此片博客继续上一篇博客内容 3,使用的远程连接工具为CRT 4,搭建过程两个节点有重复步骤,均以c ...

  3. 【云计算OpenStack-OpenStack Queens版本】基于OpenStack的云计算环境搭建

    基于OpenStack的云计算环境搭建 一.基础环境 1.基本环境信息回顾 2.基本环境网络测试 二.实现过程 1.配置阿里yum源(所有节点) 2.安装NTP时钟服务(所有节点) 3.opensta ...

  4. 一套基础自动化部署搭建过程

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:LoyaltyLu segmentfault.com/a/1 ...

  5. python3.6安装opencv-python3.6、opencv安装环境搭建过程(图文教程)

    我需要使用tesseract-OCR的模块,vs的配置有点麻烦,所以采用py的环境,搭建. 1.在python.org网站下载python3.6版本 我下载的3.6.8的python的安装 选存放的路 ...

  6. JAVA项目实训struts2_Java Web项目搭建过程记录(struts2)

    开发工具:eclipse 搭建环境:jdk1.7   tomcat 8.0 基础的java开发环境搭建过程不再赘述,下面从打开eclipse 之后的操作开始 第一步: 创建项目,File -> ...

  7. java开发环境安装原理,java开发环境搭建 java开发环境的完整搭建过程

    想了解java开发环境的完整搭建过程的相关内容吗,Rosalh在本文为您仔细讲解java开发环境搭建的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:java开发环境搭建步骤,java开发环 ...

  8. hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程

    安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx.x.x ...

  9. spark集群详细搭建过程及遇到的问题解决(四)

    在spark集群详细搭建过程及遇到的问题解决(三)中,我们将讲述了hadoop的安装过程,在本文中将主要讲述spark的安装配置过程. spark@master:~/spark$ cd hadoop ...

  10. disconf mysql_Docker搭建disconf环境,三部曲之三:细说搭建过程

    Docker下的disconf实战全文链接 细说搭建过程 在前两章中,我们利用远程或本地的镜像,快速体验了本地启动disconf的过程,本章我们一起来分析和梳理整个定制和搭建过程,了解这些后,我们就能 ...

最新文章

  1. 笔记本html外接显示器,笔记本
  2. CSS实现某元素hover时 所有兄弟节点样式改变
  3. Android超时退出功能解决方案
  4. JZOJ 3742. 【TJOI2014】上升子序列
  5. JavaScript及jQuery选择器(二)
  6. Codeforces Round #632 (Div. 2)巧用小技巧
  7. HTTP协议之HTTP的结构
  8. SpringBoot连接Redis服务出现DENIED Redis is running in protected mode because protected mode is enabled
  9. 动图妙解高内聚与低耦合,觉得让你秒懂
  10. Word文档打印又出新方法!Spire.Doc全新代码让文档更清晰
  11. win10 双开微信实操
  12. Java四大元注解介绍
  13. 项目【QT5.13频谱分析软件】(一)——开篇介绍
  14. 父级fixed_position:fixed相对父级元素定位而不是浏览器
  15. (bat)检查今天星期几,并执行程序
  16. android6.0 cta认证,手机cta认证要求有哪些?
  17. 【c++篇】c++常见容器中list的模拟实现
  18. 对于有关串口通信的clk的解释
  19. SQL 面试题:WHERE 和 HAVING、ON 有什么区别?
  20. 移动流量转赠给好友_中国移动流量流量如何转赠给别人

热门文章

  1. Android 简单图片浏览器
  2. Docker容器 Dead 状态分析
  3. kso经验记录 --spring.net的应用以及配置
  4. 利用log4j写日志
  5. iphone摄像头发抖_为什么我的iPhone 7 Plus有两个摄像头?
  6. word文档开头首字母取消自动检查大写
  7. 考研日语线上笔记(八):完型易混易考知识点梳理篇
  8. 基于qt与mupdf库的pdf阅读器开发
  9. 滴滴云GPU云服务器搭建深度学习环境
  10. 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...