http://pan.baidu.com/s/1hqiWODm 



本文档旨在指导新手直接利用openstack juno的官方安装文档,一条条复制来安装openstack juno。会指出文档中


的一些容易混淆的地方。



keystone安装:



IDENTIFIED BY 'KEYSTONE_DBPASS';


密码KEYSTONE_DBPASS前面有个空格。




openstack 单机安装 openstack安装文档_ip地址



再次验证keystone:




openstack 单机安装 openstack安装文档_数据库_02



发现有报错,看keystone日志:



openstack 单机安装 openstack安装文档_DHCP_03



很明显这里面就是报keystone数据库表token字段不存在,说明数据库没有创建成功,再次创建数据库



openstack 单机安装 openstack安装文档_openstack安装脚本_04



发现再次失败:



openstack 单机安装 openstack安装文档_DHCP_05



看keystone日志:



openstack 单机安装 openstack安装文档_数据库_06




检查keystone配置文件:


vim /etc/keystone/keystone.conf



openstack 单机安装 openstack安装文档_数据库_07




openstack 单机安装 openstack安装文档_ip地址_08



此处输出的token值需要与keystone.conf文件的ADMIN_TOKEN一致。




openstack 单机安装 openstack安装文档_数据库_09



发现正常。



注意官方文档上面对OS_SERVICE_TOKEN进行了两次环境变量赋值(其实第二次是在举例用随机值):


目的就是保证环境变量的值与keystone.conf的值保持一致即可。



openstack 单机安装 openstack安装文档_数据库_10



提前:如果报数据库连接不上,则应该去排查下述配置是否正确:



openstack 单机安装 openstack安装文档_ip地址_11


若再次连接不上,需要考虑数据库的权限问题(如下图),最简单的办法就是用该账号手动登录数据库:


mysql -ukeystone -pKEYSTONE_DBPASS



openstack 单机安装 openstack安装文档_ip地址_12



openstack 单机安装 openstack安装文档_DHCP_13


第一次没成功,第二次成功了(第一次特意把keystone写成了ketone,当然不会成功,所以要尽量避免拼写错误)



openstack 单机安装 openstack安装文档_数据库_14




glance安装: 

没有太多将的,直接复制粘贴就可:


openstack 单机安装 openstack安装文档_openstack安装脚本_15



控制节点安装: 


注意此处用了硬编码ip地址:



openstack 单机安装 openstack安装文档_openstack安装脚本_16





systemctl start openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service




如果上述命名提示不存在:则请yum install 对应包



计算节点compute安装: 


本次试验中,采用all-in-one环境,因此controller和compute节点有些配置项会重复,请注意区分。




openstack 单机安装 openstack安装文档_数据库_17



此处my_ip填写管理网络的ip地址。此处all-in-one即本机地址。




下图说明:如果你openstack环境使用的是支持虚拟化的物理机virt_type=kvm,否则使用qemu



openstack 单机安装 openstack安装文档_DHCP_18




openstack 单机安装 openstack安装文档_数据库_19




网络节点neutron安装(配置相应控制节点及对应的计算节点): 


用户可以自行选择最新的neutron或者老版本的nova-network组件,本实验讲解neutron



下图复制有问题:



openstack 单机安装 openstack安装文档_ip地址_20


su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini   upgrade juno" neutron



openstack 单机安装 openstack安装文档_ip地址_21




根据报错,直接跟踪到对应地方,显然我们复制粘贴有问题,被分行了。



openstack 单机安装 openstack安装文档_openstack安装脚本_22

 



修改后:


openstack 单机安装 openstack安装文档_DHCP_23



再次执行数据库同步命令,一切正常



openstack 单机安装 openstack安装文档_openstack安装脚本_24




systemctl restart openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service




网络节点neutron安装(配置网络节点): 



 yum install openstack-neutron openstack-neutron-ml2 openstack-neutronopen-vswitch -y


openstack 单机安装 openstack安装文档_DHCP_25


上图设置的为隧道的ip地址,隧道是用来连接各计算节点进行通信(注:br-int是连接同一个计算节点上的各个vm之间通信)。


如果有单独配置隧道网卡,则该ip为该网卡ip。本实验中all-in-one共用eth0,因此此处使用eth0 ip地址192.168.10.12。



openstack 单机安装 openstack安装文档_DHCP_26


SERVICE_TENANT_ID修改为对应的id值~




注意此处用了固定死的ip地址:



openstack 单机安装 openstack安装文档_DHCP_27





openstack 单机安装 openstack安装文档_DHCP_28




openstack 单机安装 openstack安装文档_ip地址_29



Modular Layer 2 (ML2) plug-in 、Layer-3 (L3) agent、DHCP agent   具体干什么的?




The ML2 plug-in uses the Open vSwitch (OVS) mechanism (agent) to build the virtual networking framework for instances.

The Layer-3 (L3) agent provides routing services for virtual networks.


The DHCP agent provides DHCP services for virtual networks.

ML2使用open vSwich为虚拟机建立虚拟网络通信框架。


ML2创建的虚拟网络提供路由转发等服务。


Dynamic Host Configuration Protocol,动态主机配置协议,自动分配ip地址)




下图不能直接复制,直接复制要出错:



openstack 单机安装 openstack安装文档_DHCP_30



下图注意替换为正确的网卡名:




openstack 单机安装 openstack安装文档_数据库_31




下面操作会报错,因为,前面我们已经链接一次了:



openstack 单机安装 openstack安装文档_openstack安装脚本_32



openstack 单机安装 openstack安装文档_openstack安装脚本_33



systemctl enable neutron-openvswitch-agent.service neutron-l3-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service  neutron-ovs-cleanup.service 



systemctl start neutron-openvswitch-agent.service neutron-l3-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service



openstack 单机安装 openstack安装文档_openstack安装脚本_34




重启api服务,报错:systemctl restart openstack-nova-api.service


openstack 单机安装 openstack安装文档_数据库_35





openstack 单机安装 openstack安装文档_DHCP_36



看到启动api出错,第一个想到的肯定是api的日志:



openstack 单机安装 openstack安装文档_DHCP_37


此时发现日志目录下面还没有api.log日志文件。


那么接下来可以用前台直接启动api方式,查看错误:



openstack 单机安装 openstack安装文档_数据库_38



定位到nova.conf 17行:



openstack 单机安装 openstack安装文档_DHCP_39


从上很容易发现又是我们直接复制粘贴pdf换行符导致。(所以直接复制粘贴时候需要多注意下,本次演示主要是教大家如何盘查错误,所以会尽可能暴露一些错误出来)



发现还是启动不了:



openstack 单机安装 openstack安装文档_数据库_40


查看nova-api进程:



openstack 单机安装 openstack安装文档_ip地址_41



发现已经启动了好几个进程了,kill掉重启:



openstack 单机安装 openstack安装文档_ip地址_42


一切正常。




openstack 单机安装 openstack安装文档_DHCP_43


报已经存在,因为之前已添加过一次。




openstack 单机安装 openstack安装文档_openstack安装脚本_44




创建网络时候,如果不是特别清楚的,直接copy例子即可:



openstack 单机安装 openstack安装文档_ip地址_45





下图是教你如何配置nova-network,即你可以选择使用neutron或者nova-network两个组件之一。


如果上述配置了neutron则下面的nova-network不需要再配置。(推荐使用neutron)



openstack 单机安装 openstack安装文档_数据库_46



dashboard安装(配置horizon): 


跟着一路配置到底,然后访问:



openstack 单机安装 openstack安装文档_ip地址_47



出现不能访问。



openstack 单机安装 openstack安装文档_ip地址_48




openstack 单机安装 openstack安装文档_DHCP_49




openstack 单机安装 openstack安装文档_ip地址_50




openstack 单机安装 openstack安装文档_数据库_51




openstack 单机安装 openstack安装文档_DHCP_52



http://free.yes81.net/yes81/view-11396.html




openstack 单机安装 openstack安装文档_DHCP_53




openstack 单机安装 openstack安装文档_数据库_54




vim /etc/selinux/config



openstack 单机安装 openstack安装文档_数据库_55


然后重启机器。




结果还是不行。



openstack 单机安装 openstack安装文档_数据库_56




openstack 单机安装 openstack安装文档_DHCP_57



最后发现是centos7的防火墙规则变了。 firewall-cmd --add-service=http  



openstack 单机安装 openstack安装文档_ip地址_58




openstack 单机安装 openstack安装文档_ip地址_59


看到上图,总算是能访问了,报了500错误,看日志。



tailf /var/log/httpd/error_log




openstack 单机安装 openstack安装文档_ip地址_60



显示报的有语法错误。



openstack 单机安装 openstack安装文档_DHCP_61



汗,报的又是复制的错误。



openstack 单机安装 openstack安装文档_ip地址_62


修改正确,重启。



 systemctl restart httpd.service memcached.service




openstack 单机安装 openstack安装文档_数据库_63



至此openstack的基础组件安装完毕,大功告成,简单吧~~~~




第二部分:


接下来,我们登录下openstack系统,熟悉一下:


那么关于我们的登录用户名和密码在哪儿呢?


回到keystone章节:



openstack 单机安装 openstack安装文档_openstack安装脚本_64



admin 为用户名, ADMIN_PASS为密码。试验下:



openstack 单机安装 openstack安装文档_ip地址_65


成功登录。



注:创建虚拟机的前置条件为:1、有能用来创建虚拟机的镜像 2、有创建好的能分配给虚拟机的网络


上述两条其实在之前镜像配置及网络配置章节都用命名创建好了(当前也可以在dashboard上面直接创建新的),此处直接用就可以了。



openstack 单机安装 openstack安装文档_ip地址_66




openstack 单机安装 openstack安装文档_数据库_67





openstack 单机安装 openstack安装文档_ip地址_68




openstack 单机安装 openstack安装文档_ip地址_69



openstack 单机安装 openstack安装文档_openstack安装脚本_70





openstack 单机安装 openstack安装文档_DHCP_71



孵化时报错,(如果在调度之前报错很可能在控制部分(包含了调度代码)代码出错,如果在孵化中卡着,则很可能是计算节点compute代码出错)



此处很明白的知道是网络分配没有成功。查看日志:vim /var/log/nova/nova-compute.log 




openstack 单机安装 openstack安装文档_数据库_72


def _create_domain_and_network(self, context, xml, instance, network_info,

                                   block_device_info=None, power_on=True,

                                   reboot=False, vifs_already_plugged=False,

                                   disk_info=None):



        """Do required network setup and create domain."""

        block_device_mapping = driver.block_device_info_get_mapping(

            block_device_info)



        for vol in block_device_mapping:

            connection_info = vol['connection_info']

            info = blockinfo.get_info_from_bdm(

                   CONF.libvirt.virt_type, vol)

            conf = self._connect_volume(connection_info, info)



            # cache device_path in connection_info -- required by encryptors

            if 'data' in connection_info:

                connection_info['data']['device_path'] = conf.source_path

                vol['connection_info'] = connection_info

                vol.save(context)



            if (not reboot and 'data' in connection_info and

                    'volume_id' in connection_info['data']):

                volume_id = connection_info['data']['volume_id']

                encryption = encryptors.get_encryption_metadata(

                    context, self._volume_api, volume_id, connection_info)



                if encryption:

                    encryptor = self._get_volume_encryptor(connection_info,

                                                           encryption)

                    encryptor.attach_volume(context, **encryption)



        timeout = CONF.vif_plugging_timeout

        if (self._conn_supports_start_paused and

            utils.is_neutron() and not

            vifs_already_plugged and power_on and timeout):

            events = self._get_neutron_events(network_info)

        else:

            events = []



        launch_flags = events and libvirt.VIR_DOMAIN_START_PAUSED or 0

        domain = None

        try:

            with self.virtapi.wait_for_instance_event(

                    instance, events, deadline=timeout,

                    error_callback=self._neutron_failed_callback):

                self.plug_vifs(instance, network_info)

                self.firewall_driver.setup_basic_filtering(instance,

                                                           network_info)

                self.firewall_driver.prepare_instance_filter(instance,

                                                             network_info)

                with self._lxc_disk_handler(instance, block_device_info,

                                            disk_info):

                    domain = self._create_domain(

                        xml, instance=instance,

                        launch_flags=launch_flags,

                        power_on=power_on)



                self.firewall_driver.apply_instance_filter(instance,

                                                           network_info)

        except exception.VirtualInterfaceCreateException:

            # Neutron reported failure and we didn't swallow it, so

            # bail here

            with excutils.save_and_reraise_exception():

                if domain:

                    domain.destroy()

                self.cleanup(context, instance, network_info=network_info,

                             block_device_info=block_device_info)

        except eventlet.timeout.Timeout:

            # We never heard from Neutron

            LOG.warn(_LW('Timeout waiting for vif plugging callback for '

                         'instance %(uuid)s'), {'uuid': instance['uuid']})

            if CONF.vif_plugging_is_fatal:

                if domain:

                    domain.destroy()

                self.cleanup(context, instance, network_info=network_info,

                             block_device_info=block_device_info)

                       raise exception.VirtualInterfaceCreateException()



        # Resume only if domain has been paused

        if launch_flags & libvirt.VIR_DOMAIN_START_PAUSED:

            domain.resume()

        return domain



第一个怀疑的肯定是网络服务是不是没有启动呢?


检测下网络服务情况:


neutron agent-list



openstack 单机安装 openstack安装文档_DHCP_73



发现dhcp down掉了~查看下是什么原因导致的dhcp挂掉:


 grep -rn ERROR /var/log/neutron/



openstack 单机安装 openstack安装文档_DHCP_74




openstack 单机安装 openstack安装文档_ip地址_75


vim /etc/neutron/dhcp_agent.ini



openstack 单机安装 openstack安装文档_DHCP_76


发现上处粗心没有配置,配置打开,重启服务继续。


 systemctl restart neutron-dhcp-agent.service



openstack 单机安装 openstack安装文档_ip地址_77




openstack 单机安装 openstack安装文档_DHCP_78




openstack 单机安装 openstack安装文档_数据库_79




openstack 单机安装 openstack安装文档_openstack安装脚本_80





openstack 单机安装 openstack安装文档_数据库_81




生成虚拟机成功!