preface

KVM 是openstack虚拟化的基础, 再介绍了kvm虚拟化技术之后,我们介绍下openstack和如何搭建。

Openstack组件

openstack架构图如下所示

image

那么我们就拆开上面的图,分别说说下面组件:
每个组件都是有特定功能,可谓缺一不可。
那么我们就从这些组件娓娓道来:

  1. keystone(服务名:认证服务): 为访问openstack各组件提供认证和授权功能,认证通过后,提供一个服务列表(存放你有权访问的服务),可以通过该列表访问各个组件。
  2. Horizon(服务名:Dashboard): web方式管理云平台,如建立云主机,分配网络,配安全组等
  3. Nova(服务名:计算): 负责响应虚拟机的创建请求,调度,销毁云主机
  4. Neutron(服务名:网络):实现SDN(software define network),提供一整套API,用户可以基于该API实现自己定义专属的网络,不同的厂商可以基于此API实现自己的产品
  5. swift(服务名:对象存储): REST 的接口和扁平的数据组织结构。RESTful , HTTP, API来保存和访问任意非结构化数据,ring环的方式实现数据自动复制和高度可以扩展架构,保证数据的高度容错和可靠性。
  6. Cinder(服务名:块存储):提供持久化块存储,即为云主机提供附加云盘。
  7. Glance(服务名:镜像服务):为云主机安装操作系统提供不同的镜像选择。
  8. Ceilometer(服务名: 计费服务):收集云平台资源使用数据,用来计费或者性能监控。
  9. Heat(服务名:编排服务):自动化部署应用,自动化管理应用的整个生命周期,主要用于pass

上面9个组件的关系图如下
image

那就借助上图说说流程吧:

  1. 首先我们如果要登陆到Horizon上面,此时Horzion会拿着用户登陆的username和password以及token去keystone里面认证,认证成功后根据用户信息划分对应的权限,然后返回给Horizon,实现登陆。
  2. 然后登陆上一看啥都没有,那就创建一个虚拟机吧,创建虚拟机由Nova提供服务,需要注意的是Nova只提供虚拟机的虚拟化,其他网络设备虚拟机由Neutron提供。Nova首先向Glance请求,要求给对应的系统镜像,拿到镜像后开始向Neutron请求,请求相对应的虚拟网络设备(如虚拟交换机,虚拟路由器),网络设备就绪后,最后向块存储设备组件Cinder请求磁盘空间,需要注意的是,Cinder块存储是建立在Swift对象存储之上的。
  3. 最终,所有服务就绪后,Nova开始创建虚拟机,虚拟机创建成功后,向Horizon返回创建成功的消息,前台展现出来创建的虚拟机。
keystone内部的知识再次补充

keystone内部组件:

  • user: openstack service的用户,可以是人,服务,系统,但凡是使用了Openstack service的对象都可以称为User。
  • Role: 用户划分权限,可以通过User指定Role,使User获得了Role对应的操作权限,Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role。系统默认使用管理Role admin和成员Role member
  • Policy:OPenstack对User的验证除了 op的身份验证外,还需要鉴别User对某个service是否有访问权限。Policy机制就是用来控制User对Tenant中的资源(包括service)的操作权限。对于keystone service来说,Policy就是一个json文件默认是/etc/keystone/policy.json。通过配置这个文件,Keystone Service实现了对User基于Role的权限管理。
  • Token:是一个字符串表示,作为访问资源的令牌。Token包含了在 指定范围和有效时间内 可以被访问的资源。EG. 在Nova中一个tenant可以是一些虚拟机,在Swift和Glance中一个tenant可以是一些镜像存储,在Network中一个tenant可以是一些网络资源。Token一般被User持有。
  • Gredentials: 用户确认用户身份的凭证
  • Authentication: 确定用户身份的进程
  • Service: Openstack service,即Openstack 中运行的组件服务。
  • EndPoint: 一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL。比如,当Nova需要访问Glance服务去获取image 时,Nova通过访问Keystone拿到Glance的endpoint,然后通过访问该endpoint去获取Glance服务。我们可以通过Endpoint的region属性去定义多个region。Endpoint 该使用对象分为三类:
    1.admin url –> 给admin用户使用,Post:35357 2.internal url –> OpenStack内部服务使用来跟别的服务通信,Port:5000 3.public url –> 其它用户可以访问的地址,Post:5000

创建完service后创建API EndPoint. 在openstack中,每一个service都有三种end points. Admin, public, internal。 Admin是用作管理用途的,如它能够修改user/tenant(project)。 public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。internal是openstack内部调用的。三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放internal通常只能对安装有openstack对服务的机器开放

keystone内部工作流程。

image

  1. 用户alice登录keystone系统(password 或者 token的方式),获取一个临时的token和catalog服务目录(v3版本登录时,如果没有指定scope,project或者domain,获取的临时token没有任何权限,不能查询project或者catalog)
  2. alice通过临时的token获取自己的所有project列表,
  3. alice选定一个project,然后在指定的project重新登陆,获取一个正式的token,同时获得服务列表的endpoint,用户选定一个endpoint,在http头部消息头中携带token,然后发送请求(如果用户指定projectname或者project id 则可以直接登陆了)。
  4. 消息到达endpoint之后,由服务器端(nova)的keystone中间件了,向keystone发送一个验证token的请求。
  5. keystone 验证token成功之后,将token对应用户的详细信息,例如:role,username,userid等返回给客户端(nova)。
  6. 服务端(nova)完成请求,例如创建虚拟机。
  7. 服务器返回请求结果给alice

动手安装

说了那么多,开始动手安装Openstack了,这里我们安装的Newton
参考官网的文档:http://docs.openstack.org/newton/install-guide-rdo/environment-packages.html

服务器信息还是原来的,我这里就在罗列下吧:

IP hostname
192.168.56.11 linux-node1.example.com
192.168.56.12 linux-node2.example.com
  1. 以上系统都是CentOs 7的系统,内核版本是3.10.0-123.el7.x86_64
  2. 所有hosts文件都能够互相解析对方的主机名
  3. 关闭selinux和防火墙,确保服务器时间都同步。
  4. 我这里使用的是VMware,使用时必须开启cpu虚拟化功能。
  5. 网卡命名为eth0,都是单张网卡。
  6. 如果是在实验环境,那么linux-node1 内存配置建议4G以上,最好是6G,不然的话,越往后越卡的。CPU最好是双核。linux-node2 内存3G足以,CPU最好是双核。两台机器的硬盘最好是大于等于50G。

两台服务器同时安装Openstack库
首先安装 OpenStack 仓库的RPM包

[root@linux-node2 ~]# yum -y install centos-release-openstack-newton
[root@linux-node1 ~]# yum -y upgrade

如果更新了一个新内核,重启主机来使用新内核。
下面安装 OpenStack 客户端:

[root@linux-node1 ~]# yum -y install python-openstackclient
[root@linux-node1 ~]# yum -y install openstack-selinux   # 如果关闭了selinux,就不需要安装它了。

下面操作都是linux-node1上操作,控制节点

安装数据库

由于Openstack服务在控制节点上使用SQL数据库来存储信息,所以需要在控制节点上安装python2-pyMysql,模块。

[root@linux-node1 ~]# yum -y install mariadb mariadb-server python2-PyMySQL

安装完以后配置 配置文件

[root@linux-node1 my.cnf.d]# cat /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 192.168.56.11   # 绑定当前的IP

default-storage-engine = innodb   # 使用Innodb存储引擎
innodb_file_per_table   # 每一个表使用一个文件
max_connections = 4096    # 最大连接数
collation-server = utf8_general_ci  
character-set-server = utf8  

启动数据库服务并且初始化:

[root@linux-node1 my.cnf.d]# systemctl enable mariadb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@linux-node1 my.cnf.d]# systemctl start mariadb.service
[root@linux-node1 my.cnf.d]# mysql_secure_installation

安装消息队列

OpenStack 使用 message queue 协调操作和各服务的状态信息。消息队列服务一般运行在控制节点上。OpenStack支持好几种消息队列服务包括 RabbitMQ, Qpid, 和 ZeroMQ。
如果生产环境比较大且对数据安全要求高,那么rabbitmq也需要做集群。

[root@linux-node1 ~]# yum -y install rabbitmq-server

启动服务并设置为开机自启动:

[root@linux-node1 my.cnf.d]# systemctl enable rabbitmq-server.service
[root@linux-node1 my.cnf.d]# systemctl start rabbitmq-server.service

此时服务启动的时候我这边报了这样一个错误:

[root@linux-node1 rabbitmq]# systemctl status rabbitmq-server.service   
1月 27 20:39:24 linux-node1.example.com rabbitmqctl[5344]: attempted to contact: [\'rabbit@linux-node1\']   # 注意这个linux-node1 主机名
1月 27 20:39:24 linux-node1.example.com rabbitmqctl[5344]: rabbit@linux-node1:
1月 27 20:39:24 linux-node1.example.com rabbitmqctl[5344]: * unable to connect to epmd (port 4369) on linux-node1: address (cannot connect to host/port)

找了半天的原因,发现是主机名解析的问题,我们在/etc/hosts下面写下上面报错的主机名(@符后面的)

[root@linux-node1 rabbitmq]# cat /etc/hosts
192.168.56.11    linux-node1.example.com linux-node1   # linux-node1 添加上这个
192.168.56.12    linux-node2.example.com

这样启动成功了

添加 openstack 用户,因为rabbitmq连接需要用户认证:

[root@linux-node1 my.cnf.d]# rabbitmqctl add_user openstack openstack

配置读写权限:

[root@linux-node1 my.cnf.d]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"   # 所有域,所有读写权限
Setting permissions for user "openstack" in vhost "/" ...

rabbitmq默认情况下有一个web界面监控的插件,我们可以通过rabbitmq-plugins命令查看:

[root@linux-node1 my.cnf.d]# rabbitmq-plugins list
 rabbitmq_management    #这个模块就是管理模块。
[root@linux-node1 my.cnf.d]# rabbitmq-plugins enable rabbitmq_management   # 启用这个模块

[root@linux-node1 my.cnf.d]# lsof -i :5672      # 查看这个模块是否启动成功了
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 31056 rabbitmq   52u  IPv6 142556      0t0  TCP *:amqp (LISTEN)

此时,我们可以通过web界面来访问rabbitmqweb界面了。访问地址:http://192.168.56.11:15672/,默认用户名和密码是guest/guest

Memcached

各类服务的身份认证机制使用Memcached缓存令牌。缓存服务memecached通常运行在控制节点。所以需要安装Memcache。
安装它

[root@linux-node1 ~]# yum -y install memcached python-memcached

编辑配置文件:

[root@linux-node1 keystone]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"    # 内存使用,单位为M
OPTIONS="-l 192.168.56.11,::1"    # 这里改为本地IP,不然只监听127.0.0.1 

启动服务:

[root@linux-node1 keystone]# systemctl enable memcached.service
[root@linux-node1 keystone]# systemctl start memcached.service

检测端口是否存活:

[root@linux-node1 keystone]# netstat -lntp |grep 11211
tcp        0      0 192.168.56.11:11211     0.0.0.0:*               LISTEN      35087/memcached

安装keystone服务

keystone有2个重要功能:

  1. 用户认证
  2. 服务目录(api,端口)

用户认证四个概念:

  1. User(用户) 即用户,用一个ID代表Openstack云服务的一个人,系统或服务。
  2. project(项目)
  3. tenant(租户) 通俗来说一个用户组,严谨点它就是各个服务中的一些资源可以访问的资源集合或者叫资源组。它是一个容器,用于组织和隔离资源,或标识对象
  4. Token(令牌) 用户认证成功后,keystone发一个令牌给请求者,请求者在这个令牌有效期内可以不在请求keystone了。
  5. Role(角色) 也就是权限,在一个项目里的权限,

user可以任意添加一个全局的或者项目内的角色。在全局的role中,用户的role权限作用于所有的租户,即可以对所有哦的租户执行role规定的权限;在租户内的role中,用户仅能在当前用户内执行role规定的权限。

租户和用户的关系:
  1. 一个租户可以有多个用户
  2. 一个用户可以属于一个多个租户
  3. 用户对租户和操作权限由用户在租户中担任的角色来决定。

服务目录2个概念

  1. Service(服务) 比如Nova,glance都是服务,在keystone创建一个服务,需要申明是什么服务,什么类型的服务。老的Openstack版本是这样的:创建一个服务后获取这个服务ID去创建endpoint,现在版本是创建一个服务自动创建一个endpoint,所以创建一个服务不能多,不能少,不能错,不然就出错。一个服务可以确认当前用户是否具有访问其资源的权限。但是一个user尝试访问其租户内的service时,他必须知道这个service是否存在以及如何访问这个servic。
  2. Endpoint(端点) 我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint。endpoint的每个URL都对应这个服务实例的访问地址,并且具有public,priavte和admin这三种权限。public rul可以完全被全局访问,private url只能被局域网访问,admin url被从常规的访问中分离。

创建数据库信息和授权用户,提前把所有数据库给创建好来,避免待会又得创建:

[root@linux-node1 my.cnf.d]# mysql -uroot -p   # 登陆数据库

# 先创建库
MariaDB [(none)]> CREATE DATABASE keystone;
MariaDB [(none)]> CREATE DATABASE glance;
MariaDB [(none)]> CREATE DATABASE nova;
MariaDB [(none)]> CREATE DATABASE nova_api;
MariaDB [(none)]> CREATE DATABASE neutron;
MariaDB [(none)]> CREATE DATABASE cinder;
# 授权用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO \'keystone\'@\'localhost\'  IDENTIFIED BY \'keystone\' ;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO \'keystone\'@\'%\'    IDENTIFIED BY \'keystone\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO \'glance\'@\'%\'    IDENTIFIED BY \'glance\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO \'glance\'@\'localhost\'    IDENTIFIED BY \'glance\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO \'nova\'@\'localhost\'    IDENTIFIED BY \'nova\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO \'nova\'@\'%\'    IDENTIFIED BY \'nova\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO \'nova\'@\'%\'    IDENTIFIED BY \'nova\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO \'nova\'@\'localhost\'    IDENTIFIED BY \'nova\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO \'neutron\'@\'localhost\'    IDENTIFIED BY \'neutron\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO \'neutron\'@\'%\'    IDENTIFIED BY \'neutron\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO \'cinder\'@\'%\'    IDENTIFIED BY \'cinder\';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO \'cinder\'@\'localhost\'    IDENTIFIED BY \'cinder\';
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| cinder             |
| glance             |
| information_schema |
| keystone           |
| mysql              |
| neutron            |
| nova               |
| nova_api           |
| performance_schema |
+--------------------+

此时需要安装keystone服务了在控制节点上

[root@linux-node1 ~]# yum install openstack-keystone httpd mod_wsgi

编辑配置文件/etc/keystone/keystone.conf,修改数据库部分,在[database]下面配置:

[root@linux-node1 keystone]# grep ^connection /etc/keystone/keystone.conf  
[database]
connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone

配置完数据库后,那么就初始化数据库,
一定要切换成keystone用户,如果不切换,那么keystone服务启动时会有问题,比如日志会写不了,因为你用root初始化数据库,日志最初有root创建,启用程序的时候使用keystone启动,那么keystone会因为权限的问题无法写入。

[root@linux-node1 keystone]# su -s /bin/sh -c "keystone-manage db_sync" keystone    
[root@linux-node1 keystone]# mysql -h 192.168.56.11 -ukeystone -pkeystone -e "use keystone;show tables;"    # 检查下是否有这么多个表
+------------------------+ 
| Tables_in_keystone     |
+------------------------+
| access_token           |
| assignment             |
| config_register        |
| consumer               |
| credential             |
| endpoint               |
| endpoint_group         |
| federated_user         |
| federation_protocol    |
| group                  |
| id_mapping             |
| identity_provider      |
| idp_remote_ids         |
| implied_role           |
| local_user             |
| mapping                |
| migrate_version        |
| nonlocal_user          |
| password               |
| policy                 |
| policy_association     |
| project                |
| project_endpoint       |
| project_endpoint_group |
| region                 |
| request_token          |
| revocation_event       |
| role                   |
| sensitive_config       |
| service                |
| service_provider       |
| token                  |
| trust                  |
| trust_role             |
| user                   |
| user_group_membership  |
| whitelisted_config     |
+------------------------+
[root@linux-node1 keystone]# mysql -h 192.168.56.11 -ukeystone -pkeystone -e "use keystone;show tables;" |wc -l   # 共38行
38 

继续在/etc/keystone/keystone.conf 下配置
[token]部分,配置Fernet UUID令牌的提供者

provider = fernet   # 在2657 行附近,一定要在token部分下面
driver = memcache  # 在2668 行附近,也要在token下面,这里表示token放在Memcache中。所以下面也需要配置memccache

配置Memcache,,在[memcache]下面配置

[root@linux-node1 keystone]# grep ^server /etc/keystone/keystone.conf
servers = 192.168.56.11:11211    
初始化Fernet key

下面两条命令执行完以后没有任何显示。

[root@linux-node1 keystone]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@linux-node1 keystone]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

初始化身份认证,创建admin用户,以及endpoint分配等等:

[root@linux-node1 keystone]# keystone-manage bootstrap --bootstrap-password admin \
>   --bootstrap-admin-url http://192.168.56.11:35357/v3/ \
>   --bootstrap-internal-url http://192.168.56.11:35357/v3/ \
>   --bootstrap-public-url http://192.168.56.11:5000/v3/ \
>   --bootstrap-region-id RegionOne

可以在数据库mysql里面看看:

MariaDB [(none)]> use keystone;
MariaDB [keystone]> select * from user;
MariaDB [keystone]> select * from role
MariaDB [keystone]> select * from endpoint;

配置并启动apache

[root@linux-node1 keystone]# vim /etc/httpd/conf/httpd.conf
ServerName 192.168.56.11:80   #配置``ServerName`` 选项为控制节点:
[root@linux-node1 keystone]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/    #创建一个链接到``/usr/share/keystone/wsgi-keystone.conf``文件

启动 Apache HTTP 服务并配置其随系统启动:

[root@linux-node1 keystone]#systemctl enable httpd.service
[root@linux-node1 keystone]#systemctl start httpd.service

apache启动完成后,不需要启动keystone,因为我们可以看到配置文件/usr/share/keystone/wsgi-keystone.conf,这里就开启了5000和35357端口,两个端口都是keystone所占用的。

配置环境变量:
为什么要创建环境变量:如果没有环境变量,我们无法使用Openstack这些命令查询信息,因为这些Openstack的命令会去系统环境变量上获取参数。等价与我们使用Openstack添加了这些参数一样

[root@linux-node1 keystone]# export OS_USERNAME=admin
[root@linux-node1 keystone]# export OS_PASSWORD=admin
[root@linux-node1 keystone]# export OS_PROJECT_NAME=admin
[root@linux-node1 keystone]# export OS_USER_DOMAIN_NAME=default   #相当于公有云的分区
[root@linux-node1 keystone]# export OS_PROJECT_DOMAIN_NAME=default
[root@linux-node1 keystone]# export OS_AUTH_URL=http://192.168.56.11:35357/v3
[root@linux-node1 keystone]# export OS_IDENTITY_API_VERSION=3   # keystone验证版本
[root@linux-node1 keystone]# openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 54f2e8a7f28b42178692ae39f7ed9b37 | admin |
+----------------------------------+-------+

###
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=default   #相当于公有云的分区
export OS_PROJECT_DOMAIN_NAME=default
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3   # keystone验证版本
###

创建域、项目、用户和角色

创建domain和服务。
创建一个default domain 和 service
创建一个default domain 和 demo

[root@linux-node1 keystone]# openstack project create --domain default   --description "Service Project" service
openstack project create --domain default \
>   --description "Demo Project" demo

创建用户:

[root@linux-node1 keystone]# openstack user create --domain default \
>   --password-prompt demo

创建角色:

[root@linux-node1 keystone]# openstack role create user

添加 user角色到 demo 项目和用户:

[root@linux-node1 keystone]# openstack role add --project demo --user demo user

上面的命令是说把demo用户添加到demo项目里,并赋予user角色。

现在为了后续的方便,先把所有用户一次性创建完成:

#添加glance用户
[root@linux-node1 keystone]# openstack user create --domain default   --password-prompt glance   # 密码为glance
[root@linux-node1 keystone]# openstack role add --project service --user glance  admin  # 把glance用户添加到service项目里并赋予admin权限

# 添加nova用户
[root@linux-node1 keystone]# openstack user create --domain default   --password-prompt nova
[root@linux-node1 keystone]# openstack role add --project service --user nova admin

# 添加neutron

[root@linux-node1 keystone]# openstack user create --domain default   --password-prompt neutron
[root@linux-node1 keystone]# openstack role add --project service --user neutron admin


# 添加cinder
[root@linux-node1 keystone]# openstack user create --domain default --password-prompt cinder
[root@linux-node1 keystone]# openstack role add --project service --user cinder admin

#创建完后查看下状态:
[root@linux-node1 keystone]# openstack user list
+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 00f8c9ca79f542d7b4a8e0582f2351b7 | glance  |
| 1077bb04680840a688b62e10b0d58a7e | neutron |
| 1b24326bb39249bb9bec94f6fa63a12f | cinder  |
| 54f2e8a7f28b42178692ae39f7ed9b37 | admin   |
| 6895ff530fd24df08e289810fbce482b | demo    |
| 8e4927503d1340a6aa3ca23bd91b08bf | nova    |
+----------------------------------+---------+
[root@linux-node1 keystone]# openstack project list
+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 56e47b93480d4d169bca387817d99e43 | demo    |
| 6197e636277d41ce8b0a835fbca4f87a | admin   |
| e145c7d7baa249e9b8fde5865ff50fee | service |
+----------------------------------+---------+
[root@linux-node1 keystone]# openstack role list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 2d8454e77ffb405c9a489d67ae700a20 | admin |
| c0fa2079f4924a6da71ef6b4b9df042e | user  |
+----------------------------------+-------+

验证操作

因为安全性的原因,关闭临时认证令牌机制,同时取消刚才设置的系统变量
首先使用admin用户去访问

[root@linux-node1 keystone]# unset OS_AUTH_URL OS_PASSWORD
[root@linux-node1 keystone]#  openstack --os-auth-url http://192.168.56.11:35357/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name admin --os-username admin token issue
Password:     # 输入admin用户的密码
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                             |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2017-01-02 15:22:14+00:00                                                                                                                                         |
| id         | gAAAAABYamIWfdkN_RjuV9E-EOQo2Yk-ZYtmktRjluyF3Iohv86um-                                                                                                            |
|            | Q94JrG2nOQOTr3L6VlGyHBez0GqxrkxHobJ_IKNhiN3pdNsBBzZbRi6DLEfcwZoTKluF3ae6BvVz2wOJ7Ohn2piZ3yVjv50Hzgg2ls92RuEun4zTO7HeIt-lfJ6Hxs5Lo                                 |
| project_id | 6197e636277d41ce8b0a835fbca4f87a                                                                                                                                  |
| user_id    | 54f2e8a7f28b42178692ae39f7ed9b37                                                                                                                                  |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

返回结果说明正常,如果返回是401错误,那是说明身份验证出错。

再次使用demo普通用户访问,普通用户通过5000端口访问 :

[root@linux-node1 keystone]# openstack --os-auth-url http://192.168.56.11:5000/v3 \
>   --os-project-domain-name default --os-user-domain-name default \
>   --os-project-name demo --os-username demo token issue
Password:
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                               |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2017-01-02 15:26:28+00:00                                                                                                                                           |
| id         | gAAAAABYamMVII_t9wUcBbXd3YLntYveGOALj6SOtY3Zx5ogGuSbUbmZp5I_4D1fl0cm_Yd6rX9QZuuK5xY3GtRpBNO8ktYUpMz1amTPJUc7C6ftFhSQnMPl7py9ZGL5p-bz0VTtKwi58D6EKaWMbpDSBXwCR-      |
|            | KjKXn6qg9CHBWXb22pyYDt7ms                                                                                                                                           |
| project_id | 56e47b93480d4d169bca387817d99e43                                                                                                                                    |
| user_id    | 6895ff530fd24df08e289810fbce482b                                                                                                                                    |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------

返回结果说明正常。

创建Openstack客户端环境脚本:

为了简化我们输入命令的长度,我们可以把刚才那些参数写入脚本里面,这样在执行的时候直接source下脚本,然后执行命令openstack token issue就可以获取token了。如下所示:
先看脚本内容:

[root@linux-node1 ~]# cat admin_openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

[root@linux-node1 ~]# cat demo_openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL=http://192.168.56.11:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

再看在这脚本基础之上执行命令openstack token issue

[root@linux-node1 ~]# source admin_openrc
[root@linux-node1 ~]# openstack token issue
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                               |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2017-01-02 15:34:11+00:00                                                                                                                                           |
| id         | gAAAAABYamTjl0Tsh0EtftGIZ4Kuq-Ui46k-OyX-X0kYk2NoGZ5HDVfxLFs-O_7gS-                                                                                                  |
|            | 28cZgfA_5PIeAY2YgganfFpaM7i3XP0I1RwBdfixZb_0oT4rx78yqtcGnzAaQmx9KzwdrvOzEUtdd7LC3-Ld3MKfVQbe3WyNuIUMOhYWRnZuYF4bqm6Dk                                               |
| project_id | 6197e636277d41ce8b0a835fbca4f87a                                                                                                                                    |
| user_id    | 54f2e8a7f28b42178692ae39f7ed9b37                                                                                                                                    |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
[root@linux-node1 ~]# source demo_openrc
[root@linux-node1 ~]# openstack token issue
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                               |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2017-01-02 15:34:25+00:00                                                                                                                                           |
| id         | gAAAAABYamTxyaA0Kv0JbmFPEp7Am0k2kZk5Bxchu63JBmbIGfRX7LOQXksnqWdHAhbt2TwMxvq2QSlNWT_eJbsEQ0lrDWuPFpY6EOHRy42Cd0lU5tYOD0ocm2f1Pq1Fu9DmoL1Rr6t31lx2lhsdvB84js2jUFFSPAd |
|            | uaCLPYTzFDSNM37okCm4                                                                                                                                                |
| project_id | 56e47b93480d4d169bca387817d99e43                                                                                                                                    |
| user_id    | 6895ff530fd24df08e289810fbce482b                                                                                                                                    |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+