OpenStack随笔(使用VMware搭建)(M版本)

第一章:OpenStack基本环境搭建

1: OpenStack环境拓扑图

在这里插入图片描述

2:环境基本描述及配置要求

创建两台虚拟机
环境要求:CentOS-7 及 XianDian-2.2
配置要求:一块硬盘(容量20G及以上),两块网卡,一块仅主机模式,一块NAT模式

3:重命名机器

改名规划
第一台虚拟机(控制节点):control
第二台虚拟机(实例节点):computer
控制节点(control)配置

hostnamectl set-hostname control

实例节点(computer)配置

hostnamectl set-hostname computer

改完名字后需要重启虚拟机

reboot

4:设置ip

IP配置规划
在这里插入图片描述

配置控制节点(control)IP
配置文件存放位置/etc/syconfig/network-scripts

cd /etc/syconfig/network-scripts

他会出现两个网卡配置文件

第一个eno16777736是仅主机模式
修改内容如下:

vi ifcfg-eno16777736

找到BOOTPROTO=dhcp改成BOOTPROTO=static
找到ONBOOT=no改成ONBOOT=yes

末尾追加

IPADDR=192.168.100.10
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=114.114.114.144

第二个eno33554984是NAT模式
修改内容如下:

vi ifcfg-eno33554984

找到BOOTPROTO=dhcp改成BOOTPROTO=static
找到ONBOOT=no改成ONBOOT=yes

末尾追加

IPADDR=192.168.128.10
NETMASK=255.255.255.0
GATEWAY=192.168.128.2
DNS1=114.114.114.144

配置完成后需要重启一下网卡

service network restart

在这里插入图片描述
实例节点IP配置

配置文件存放位置/etc/syconfig/network-scripts

cd /etc/syconfig/network-scripts

配置第一块网卡
第一个eno16777736是仅主机模式
修改内容如下:

vi ifcfg-eno16777736

找到BOOTPROTO=dhcp改成BOOTPROTO=static
找到ONBOOT=no改成ONBOOT=yes


末尾追加
IPADDR=192.168.100.20
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=114.114.114.144

第二个eno33554984是NAT模式
修改内容如下:

vi ifcfg-eno33554984

找到BOOTPROTO=dhcp改成BOOTPROTO=static
找到ONBOOT=no改成ONBOOT=yes

末尾追加
IPADDR=192.168.128.20
NETMASK=255.255.255.0
GATEWAY=192.168.128.2
DNS1=114.114.114.144

配置完成后需要重启一下网卡

service network restart

5:修改配置文件配置域名解析

控制节点(control)的域名解析配置
文件存放位置/etc/hosts

vi /etc/hosts

末尾追加以下内容
192.168.128.10     control
192.168.128.20     computer		

实例节点(computer)配置和控制节点(control)的配置一致

6:配置yum源(相当于手机的应用商店)

控制节点(computer)配置
配置文件存放位置/etc/yum.repos.d/

先上传ios文件 一个先电 一个CentOS
上传到/root 下

rm -rf /etc/yum.repos.d/*
我这里删除所有默认yum源在创建一个本地yum源
vi /etc/yum.repos.d/yum.repo 

添加以下内容

[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1

[openstack]
name=OpenStack
baseurl=file:///opt/iaas/iaas-repo
gpgcheck=0
enabled=1

创建挂载点文件

mkdir -p /opt/centos /opt/iaas/iaas-repo

挂载iOS镜像文件

echo "/root/CentOS-7-x86_64-DVD-1511.iso /opt/centos/ auto defaults 0 0
/root/XianDian-IaaS-v2.2.iso /opt/iaas/ auto defaults 0 0
" >> /etc/fstab

清理yum缓存

yum clean all 

创建新的yum源缓存

yum makecache				

实例节点(computer)的yum源配置配置同上

7:防火墙配置

控制节点(control)配置

关闭防火墙服务

systemctl stop firewalld

关闭防火墙开机自启

systemctl disable firewalld

实例节点(computer)的防火墙配置配置同上

关闭selinux
配置文件存放位置/etc/selinux/config

vi /etc/selinux/config
改SELINUX=enforcing为SELINUX=disabled

关闭selinux的原因:表示系统会收到警告信息,但是不会受到限制,作为selinux的debug模式用处

实例节点(computer)的selinux配置同上

8:磁盘分区

控制节点(control)配置
给机器添加一个新的磁盘(要先关机)
在这里插入图片描述
后面的选项默认即可(硬盘容量默认20G)
开机进行分区操作
使用fdisk命令查看新添加的硬盘
在这里插入图片描述
使用fdisk命令分区

[root@control ~]# fdisk /dev/sdb 

  
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xea6a6f15.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p

Partition number (1-4, default 1): 

First sector (2048-41943039, default 2048): 

Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G

Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): n

Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
   
Select (default p): 
Using default response p

Partition number (2-4, default 2): 

First sector (20973568-41943039, default 20973568): 
Using default value 20973568

Last sector, +sectors or +size{K,M,G} (20973568-41943039, default 41943039): 
Using default value 41943039

Partition 2 of type Linux and of size 10 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

格式化刚才分的两个区

[root@control ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=256    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@control ~]# mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2              isize=256    agcount=4, agsize=655296 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=2621184, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

实例节点的配置和上面的一样

9:安装软件

控制节点配置
下载文件包

yum install -y iaas-xiandian

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

##--------------------system Config--------------------##
##--------------------系统配置--------------------##

##控制器服务器管理器IP。示例:x.x.x.x
HOST_IP=192.168.128.10  #控制节点的NAT网卡IP地址

##控制器服务器主机名。示例:control
HOST_NAME=control		#控制节点主机名

##计算节点管理器IP。示例:x.x.x.x
HOST_IP_NODE=192.168.128.20  #实例节点NAT网卡IP地址

##计算节点主机名。示例:compute
HOST_NAME_NODE=computer		#实例节点主机名

##--------------------Rabbit Config ------------------##

##rabbit的用户。示例:openstack
RABBIT_USER=openstack

##rabbit用户的密码。示例:000000
RABBIT_PASS=000000

##--------------------MySQL Config---------------------##
##--------------------MySQL配置---------------------##
##MySQL根用户的密码.示例:000000
DB_PASS=000000

##--------------------Keystone Config------------------##
##--------------------密钥配置------------------##
##密钥库管理员用户的密码。示例:000000
DOMAIN_NAME=demo		#自定义(域)
ADMIN_PASS=000000		#用户密码
DEMO_PASS=000000

##Mysql密钥库用户的密码。示例:000000
KEYSTONE_DBPASS=000000

##--------------------Glance Config--------------------##
##--------------------浏览配置--------------------##
##Mysql glance用户的密码。 示例:000000
GLANCE_DBPASS=000000

##Keystore glance用户的密码。 示例:000000
GLANCE_PASS=000000

##--------------------Nova Config----------------------##
##Mysql nova 用户的密码 示例:000000
NOVA_DBPASS=000000

##Keystore nova 用户的密码。 示例:000000
NOVA_PASS=000000

##--------------------Neturon Config-------------------##
##--------------------Neturon配置-------------------##

##Mysql中子用户的密码。示例:000000
NEUTRON_DBPASS=000000

##密钥库中子用户的密码。示例:000000
NEUTRON_PASS=000000

##metadata secret for neutron. 示例:000000
METADATA_SECRET=000000

##外部网络接口。示例:eth1
INTERFACE_NAME=eno16777736		#仅主机模式的网卡名字

##Vlan网络的Vlan范围中的第一个Vlan ID。 示例:101
#minvlan=

##Vlan网络的Vlan范围中的最后一个Vlan ID。示例:200
#maxvlan=

##--------------------Cinder Config--------------------##
##Mysql cinder用户的密码。示例:000000
CINDER_DBPASS=000000

##Keystore cinder用户的密码。示例:000000
CINDER_PASS=000000

##Cinder Block Disk. example:md126p3
BLOCK_DISK=sdb1		#空白分区

##--------------------Trove Config--------------------##
##Mysql Trove 用户的密码。 示例:000000
TROVE_DBPASS=000000

##密钥存储库用户的密码。示例:000000
TROVE_PASS=000000

##--------------------Swift Config---------------------##
##--------------------Swift配置---------------------##

##密钥库swift用户的密码。 exmaple:000000
SWIFT_PASS=000000

##Swift的节点对象磁盘。示例:md126p4.
OBJECT_DISK=sdb2		#空白分区

##Swift存储网络的节点IP。示例.x.x.x.x
STORAGE_LOCAL_NET_IP=192.168.128.10		#控制节点的NAT网卡IP地址

##--------------------Heat Config----------------------##
##Mysql热用户的密码。示例:000000
HEAT_DBPASS=000000

##Keystore heat用户的密码。示例:000000
HEAT_PASS=000000

##--------------------Ceilometer Config----------------##
##Password for Mysql ceilometer user. exmaple:000000
CEILOMETER_DBPASS=000000

##Keystore ceilometer用户的密码。示例:000000
CEILOMETER_PASS=000000

##--------------------AODH Config----------------##
##--------------------AODH配置----------------##

##Mysql AODH用户的密码。示例:000000
AODH_DBPASS=000000

##密钥库AODH用户的密码。示例:000000
AODH_PASS=000000

10:部署脚本安装平台

初始化配置脚本,一定要执行,如果下面的执行脚本报错,从这一步重新开始
进入/usr/local/bin/执行脚本iaas-pre-host.sh

iaas-pre-host.sh

完成后重启两个设备

reboot

挂载iOS镜像文件(mount开机默认不挂载,需要手动挂载)

mount /root/CentOS-7-x86_64-DVD-1511.iso /opt/centos/
mount /root/XianDian-IaaS-v2.2.iso /opt/iaas/

下面的命令可以在家目录下执行

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

iaas-install-mysql.sh

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

iaas-install-keystone.sh

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

iaas-install-glance.sh

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

iaas-install-nova-controller.sh

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

iaas-install-nova-compute.sh

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

iaas-install-neutron-controller.sh

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

iaas-install-neutron-compute.sh		

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

iaas-install-neutron-controller-vlan.sh

我这里使用

iaas-install-neutron-controller-gre.sh

注意
这个文件有一个地方错误,最后一行需要更改

vim /usr/local/bin/iaas-install-neutron-controller-gre.sh
改systemctl enabled neutron-lbaas-agent为systemctl enable neutron-lbaas-agent

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

iaas-install-neutron-compute-vlan.sh

我这里使用

iaas-install-neutron-compute-gre.sh

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

iaas-install-dashboard.sh

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

iaas-install-cinder-controller.sh

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

iaas-install-cinder-compute.sh

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

iaas-install-swift-controller.sh

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

iaas-install-swift-compute.sh

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

iaas-install-heat.sh

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

iaas-install-ceilometer-controller.sh

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

iaas-install-ceilometer-compute.sh

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

iaas-install-alarm.sh

11:web管理登录

进入浏览器在地址栏输入 ip地址/dashboard
域:demo (在xiandian配置文件内配置)
账号:admin(默认)
密码:000000(在xiandian配置文件内配置)
在这里插入图片描述

在这里插入图片描述

第二章:认证服务(Keystone)

创建流程有两种方式,1:web浏览器图形化操作创建;2:命令行使用命令创建或使用脚本批量创建

一:命令解读

报错解决方案

如果在创建的时候出现下面的报错,请更新配置文件,执行下面的命令
在这里插入图片描述

source /etc/keystone/admin-openrc.sh

1:Keystone服务安装完毕,通过请求身份令牌验证服务

openstack  --os-project-name admin --os-domain-name demo --os-username admin --os-password 000000 --os-auth-url http://controller:35357/v3 token issue

2:创建用户

我这里创建一个名字叫alice的用户,密码是mypassword123,邮箱是123@163.com

openstack user create alice --password mypassword123 --email 123@163.com  --domain demo 

扩展:创建用户命令的格式

openstack user create [--domain <domain>]
[--password <password>]
[--email <email-address>]
[--enable | --disable]

3:创建角色

我这里创建一个名字叫compute-user的角色

openstack role create compute-user

扩展:创建角色命令格式

openstack role create <name>

4:创建项目

我这里创建一个名字叫acme的项目

openstack project create --domain demo acme

扩展:创建项目命令格式

openstack project create [--domain <domain>]
                              [--description <description>]
                              [--enable | --disable]
   								<project-name>

5:绑定用户和项目权限

我这里给用户“alice”分配“acme”项目下的“compute-user”角色

openstack role add --user alice  --project acme  compute-user

二:情景操作

如果本地没有脚本,请参考附录脚本,创建脚本并赋予执行权限
情景模拟:
在这里插入图片描述

1:创建项目

方法一:使用web界面创建一个名字叫RD_Dept的项目。
在这里插入图片描述
方法二:使用命令行创建一个名字叫BS_Dept的项目。

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

查看结果

openstack project show BS_Dept

方法三:使用脚本创建一个名字叫IT_Dept的项目

./Keystone-manage-project.sh

2:创建用户

方法一:使用web界面创建用户

在这里插入图片描述
方法二:使用命令行创建用户

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

方法三:使用脚本批量创建用户
通过执行Shell脚本Keystone-manage-user.sh为项目研发部创建用户rduser002~rduser050,密码为cloudpasswd。命令行内按提示输入用户名称、用户密码、电子邮件域名地址、用户角色(这里只能赋予一个角色)和用户所属部门

./Keystone-manage-user.sh

在这里插入图片描述

同理可通过执行Shell脚本为业务部创建用户bsuser001~bsuser045,密码为cloudpasswd

在这里插入图片描述
通过执行Shell脚本为IT工程部创建用户ituser001~ituser005,密码为cloudpasswd
在这里插入图片描述

3:绑定用户权限

方法一:使用web界面绑定
在这里插入图片描述
方法二:使用命令行绑定普通用户权限

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

查看执行结果

openstack role list --user rduser002 --project RD_Dept

方法三:使用脚本批量绑定普通用户和管理员用户权限

./Keystone-manage-add-role.sh

在这里插入图片描述

4:附录脚本内容

Keystone-manage-project.sh

Keystone-manage-project.sh

#!/bin/bash
if [  -f "/etc/keystone/admin-openrc.sh" ];then
        source /etc/keystone/admin-openrc.sh
else
env_path=`find / -name admin-openrc.sh`
        source $env_path
fi
    echo -e "\033[31mPlease Input new project name : eg (openstack)\033[0m "
        read New_Project_Name
if [ ! -n "$New_Project_Name" ];then
            echo -e "\033[31mProject Name Is Empty,Exit\033[0m "
            exit 1
        fi
    echo -e "\033[31mPlease Input project description : eg (openstack description)\033[0m "
        read New_Project_des
if [ ! -n "$New_Project_des" ];then
             echo -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_des
               echo -e "\033[31mKeystone All Project List\033[0m "
               openstack project list

Keystone-manage-user.sh
#!/bin/bash
if [  -f "/etc/keystone/admin-openrc.sh" ];then
        source /etc/keystone/admin-openrc.sh
else
env_path=`find / -name admin-openrc.sh`
        source $env_path
fi
        echo -e "\033[31mPlease Input New User Name : eg (username)\033[0m "
        read New_User_Name
if [ ! -n "$New_User_Name" ];then
                         echo -e "\033[31mUser Name Is Empty,Exit\033[0m "
                         exit 1
 fi
        echo -e "\033[31mPlease Input User Password: eg (000000)\033[0m "
        read New_User_Pw
if [ ! -n "$New_User_Pw" ];then
                 echo -e "\033[31mPasswd Is Empty,Exit\033[0m "
                 exit 1
           fi
        echo -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" ];then
                 echo -e "\033[31mEmail Address Is Empty,Exit\033[0m "
                 exit 1
           fi
    echo -e "\033[31mPlease Input User   Beginning And End  Number: eg (001-002)\033[0m "
        read New_User_Range
if [ ! -n "$New_User_Range" ];then
                    echo -e "\033[31mNumber Is Empty,Exit\033[0m "
                    exit 1
                else
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;do
                            for (( 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 ];then
                                        echo -e "\033[31mUser $New_User_Name$real_username_number is exists\033[0m "
                                        exit 1
                                    fi
done
                        done   
            fi
        echo -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 ; then
                           echo "exists" >> /dev/null
                   else
                          echo -e "\033[31mRole $New_User_Role not exists\033[0m "
                          exit 1
                  fi
          fi

    echo -e "\033[31mPlease Input User belong Project Name: eg (projectname)\033[0m "
        read New_User_Project
if [ ! -n "$New_User_Project" ];then
                         echo -e "\033[31mProject Name Is Empty,Exit\033[0m "
                         exit 1
            else
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 ; then
                           echo "exists" >> /dev/null
                   else
                          echo -e "\033[31mProject $New_User_Project not exists\033[0m "
                          exit 1
                  fi
             fi
                            for (( 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_Email
                                openstack role add --user $New_User_Name$real_username_number --project  $New_User_Project $New_User_Role 
                            done
                                echo -e "\033[31mKeystone All User List\033[0m "
                                openstack user list

Keystone-manage-add-role.sh

Keystone-manage-add-role.sh

#!/bin/bash
# 1st keystone 
if [  -f "/etc/keystone/admin-openrc.sh" ];then
        source /etc/keystone/admin-openrc.sh
else
env_path=`find / -name admin-openrc.sh`
        source $env_path
fi
        echo -e "\033[31mPlease Enter The User Name\033[0m "
        read Add_Role_Username
        echo -e "\033[31mPlease Input User  Beginning And End  Number: eg (001-002)\033[0m "
        read Add_User_Range
                if [ ! -n "$Add_User_Range" ];then
                    Add_User_Range=$Add_User_Range
                else
                    A_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]
                fi
        echo -e "\033[31mPlease Enter the Project Name\033[0m "
        read Add_Role_Tenant
            IF_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 ; then
                echo "exists" >> /dev/null
            else
                echo -e "\033[31mProject $Add_Role_Tenant not exists\033[0m "
                exit 1
            fi
        echo -e "\033[31mPlease Enter the  Role Name\033[0m "
         read Add_Role_New_Role
            IF_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 ; then
                 echo "exists" >> /dev/null
            else    
                 echo -e "\033[31mRole $Add_Role_New_Role not exists\033[0m "
                 exit 1
            fi
        for (( username_number=$A_R_Start;username_number<$A_R_End1;username_number++ ));do
                real_username_number=`printf "%03d\n" $username_number`
                openstack role add --project $Add_Role_Tenant --user $Add_Role_Username$real_username_number $Add_Role_New_Role
                echo -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

第三章:基础控制服务

1:基本环境部署

查看Glance服务

glance-control all status

查询glance-control版本

glance-control --version

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

systemctl start openstack-glance-api
systemctl start openstack-glance-registry
systemctl enable openstack-glance-api
systemctl enable openstack-glance-registry

2:下载CirrOS镜像文件

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

3:创建镜像

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

如果出现这个报错,请执行
在这里插入图片描述

 source /etc/keystone/admin-openrc.sh

出现这个表示创建镜像成功
在这里插入图片描述

4:查看平台上面的所有镜像

glance image-list

在这里插入图片描述

查看镜像的详细信息
后面加查看的镜像ID

glance image-show db5c8e85-57bd-4639-acd2-9fa38bcedf30

在这里插入图片描述

5:更改镜像信息

使用glance image-update更新镜像信息

glance image-update --min-disk=1 db5c8e85-57bd-4639-acd2-9fa38bcedf30

通过命令删除镜像cirros-0.3.2-x86_64

glance image-delete  b5c8e85-57bd-4639-acd2-9fa38bcedf30

计算服务

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消息队列服务。(已配置)

vi /etc/nova/nova.conf

配置如下所示内容

[DEFAULT]
rpc_backend = rabbit
Nova服务的数据存储在MySQL

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查看

#openstack user create --domain demo --password=NOVA_PASS --email=NOVA_EMAIL nova
+------------+-----------------------------------+
| Field       | Value                                   |
+------------+-----------------------------------+
| domain_id
| email
| enabled
| id
| name	| 93b9ddbc5e7d45bfa181bbd17cf08869
| NOVA_EMAIL
| True
| f3c7cd5a9dbb4893ba7db1e3f6695071
| nova	|
|
|
|
|
+------------+-----------------------------------+

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

# openstack role add --user=nova --project=service admin
# openstack service create --name=nova compute --description="OpenStack Compute" 

+-------------+-----------------------------------+
| Field        | Value                                   |
+-------------+-----------------------------------+
| description
| enabled
| id
| name
| type	| OpenStack Compute
| True
| 3b4d35a228654bd48a39b9cf0d00f646
| nova
| compute	|
|
|
|
|
+-------------+----------------------------------+

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

openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1/%\(tenant_id\)s
openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1/%\(tenant_id\)s
openstack 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管理安全组规则。
安全组,翻译成英文是security group。安全组是一些规则的集合,用来对虚拟机的访问流量加以限制,这反映到底层,就是使用iptables,给虚拟机所在的宿主机添加iptables规则。可以定义n个安全组,每个安全组可以有n个规则,可以给每个实例绑定n个安全组,Nova中总是有一个default安全组,这个是不能被删除的。创建实例的时候,如果不指定安全组,会默认使用这个default安全组。现在Nova中安全组应该会移到Neutron中,并且会增加对虚拟机外出流量的控制。现在Nova中的安全组只是对进入虚拟机的流量加以控制,对虚拟机外出流量没有加以限制。
常用的安全组命令如下。

nova secgroup-create

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

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

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starry-sea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值