正常机器
ironic 控制节点
停掉ironic conductor
过一段时间后
on_missing_entrypoints_callback=missing_callback)) 165198 2020-06-03 19:08:57.959 29088 ERROR oslo_service.service File "/usr/lib/python2.7/site-packages/ stevedore/named.py", line 85, in __init__ 165199 2020-06-03 19:08:57.959 29088 ERROR oslo_service.service on_missing_entrypoints_callback(self. _missing_names) 165200 2020-06-03 19:08:57.959 29088 ERROR oslo_service.service File "/usr/lib/python2.7/site-packages/ironic/ common/driver_factory.py", line 518, in missing_callback 165201 2020-06-03 19:08:57.959 29088 ERROR oslo_service.service names=names, entrypoint=cls._entrypoint_name) 165202 2020-06-03 19:08:57.959 29088 ERROR oslo_service.service DriverNotFoundInEntrypoint: Could not find the following items in the 'ironic.drivers' entrypoint: pxe_ipmitool. 165203 2020-06-03 19:08:57.959 29088 ERROR oslo_service.service 165204 2020-06-03 19:08:57.967 29088 INFO ironic.common.rpc_service [-] Stopped RPC server for service ironic. conductor_manager on host bogon. 165205 2020-06-03 19:08:57.968 29088 DEBUG oslo_concurrency.lockutils [-] Acquired lock "singleton_lock" lock / usr/lib/python2.7/site-packages/oslo_concurrency/lockutils.py:265 165206 2020-06-03 19:08:57.968 29088 DEBUG oslo_concurrency.lockutils [-] Releasing lock "singleton_lock" lock / usr/lib/python2.7/site-packages/oslo_concurrency/lockutils.py:281 ironic-conductor.log
[root@bogon ironic]# ironic driver-list The "ironic" CLI is deprecated and will be removed in the S* release. Please use the "openstack baremetal" CLI instead. +---------------------+----------------+ | Supported driver(s) | Active host(s) | +---------------------+----------------+ +---------------------+----------------+ [root@bogon ironic]#
he following hardware types and classic drivers use IPMItool for power and management: hardware types: ipmi classic drivers: agent_ipmitool pxe_ipmitool agent_ipmitool_socat pxe_ipmitool_socat
38 pxe_agent_cimc = ironic.drivers.agent:AgentAndCIMCDriver 39 pxe_drac = ironic.drivers.drac:PXEDracDriver 40 pxe_drac_inspector = ironic.drivers.drac:PXEDracInspectorDriver 41 pxe_ilo = ironic.drivers.pxe:PXEAndIloDriver 42 pxe_ipmitool = ironic.drivers.ipmi:PXEAndIPMIToolDriver 43 pxe_ipmitool_socat = ironic.drivers.ipmi:PXEAndIPMIToolAndSocatDriver 44 pxe_irmc = ironic.drivers.pxe:PXEAndIRMCDriver 45 pxe_iscsi_cimc = ironic.drivers.pxe:PXEAndCIMCDriver 46 pxe_snmp = ironic.drivers.pxe:PXEAndSNMPDriver 47 pxe_ucs = ironic.drivers.pxe:PXEAndUcsDriver
ironic-10.1.10-py2.7.egg-info/entry_points.txt:42:pxe_ipmitool = ironic.drivers.ipmi:PXEAndIPMIToolDriver ironic-10.1.10-py2.7.egg-info/entry_points.txt:43:pxe_ipmitool_socat = ironic.drivers.ipmi:PXEAndIPMIToolAndSocatDriver
yum install openstack-ironic-*
运行
裸机服务将实际的硬件管理委托给驱动来处理。从 Ocata 版本开始支持两种类型的驱动: classic drivers (例如: pxe_ipmitool, agent_ilo 等) hardware types (例如通用的 redfish 和 ipmi 或者厂商相关的 ilo 和 irmc)。 Driver 反过来说是由许多 hardware interfaces 构成的,每个 hardware interface 用来处理特定厂商裸机的某些配置。Classic driver 把所有的 hardware interface 都硬编码到了一起,而 hardware types 只申明了兼容哪些 hardware interface. 举个例子,pxe_ipmitool 是一个 classis driver,在你创建驱动的时候, 使用的 power, boot, console, management, deploy, raid 等模块都是固定好了, 例如: class PXEAndIPMIToolDriver(base.BaseDriver): def __init__(self): self.power = ipmitool.IPMIPower() self.console = ipmitool.IPMIShellinaboxConsole() self.boot = pxe.PXEBoot() self.deploy = iscsi_deploy.ISCSIDeploy() self.management = ipmitool.IPMIManagement() self.inspect = inspector.Inspector.create_if_enabled( 'PXEAndIPMIToolDriver') self.vendor = ipmitool.VendorPassthru() self.raid = agent.AgentRAID() ipmi 驱动是一个 hardware types, 该驱动每个模块会定义支持哪些 hardware interface class IPMIHardWare(generic.GenericHardware): @property def supported_console_interfaces(self): return [ipmitool.IPMISocatSonsole, ipmitool.IPMIShellinaboxConsole, noop.NoConsole] 简单的说就是 hardware types 可以让你自由组合使用 hardware interface, 更加灵活。 从用户角度看,hardware types 和 Classic driver 都是对应 node 表的 driver 字段。 但是这两种方式的配置是不同的。
ExecStart={ path=/usr/bin/ironic-conductor ; argv[]=/usr/bin/ironic-conductor ; ignore_errors=no ; start_time=[n/a Slice=system.slice MemoryCurrent=18446744073709551615 TasksCurrent=18446744073709551615 Delegate=no [root@bogon ~]# ls -al /usr/bin/python lrwxrwxrwx 1 root root 18 Jun 3 16:16 /usr/bin/python -> /usr/bin/python2.7 [root@bogon ~]# /usr/bin/python -m pdb /usr/bin/ironic-conductor > /usr/bin/ironic-conductor(4)<module>() -> import sys (Pdb) b /usr/lib/python2.7/site-packages/ironic/common/driver_factory.py:521 Breakpoint 1 at /usr/lib/python2.7/site-packages/ironic/common/driver_factory.py:521 (Pdb) c
[root@bogon site-packages]# rpm -qa | grep ironic openstack-ironic-common-10.1.10-1.el7.noarch openstack-ironic-inspector-7.2.4-1.el7.noarch openstack-ironic-staging-drivers-doc-0.9.1-1.el7.noarch openstack-ironic-staging-drivers-0.9.1-1.el7.noarch openstack-ironic-conductor-10.1.10-1.el7.noarch openstack-ironic-python-agent-3.2.4-1.el7.noarch python2-ironic-python-agent-3.2.4-1.el7.noarch python2-ironicclient-2.2.2-1.el7.noarch python2-ironic-neutron-agent-1.0.0-1.el7.noarch openstack-ironic-ui-doc-3.1.3-1.el7.noarch openstack-ironic-api-10.1.10-1.el7.noarch python-ironic-lib-2.12.4-1.el7.noarch openstack-ironic-inspector-doc-7.2.4-1.el7.noarch python-ironic-inspector-client-3.1.2-1.el7.noarch openstack-ironic-ui-3.1.3-1.el7.noarch [root@bogon site-packages]# rpm -e openstack-ironic-common error: Failed dependencies: openstack-ironic-common = 1:10.1.10-1.el7 is needed by (installed) openstack-ironic-api-1:10.1.10-1.el7.noarch openstack-ironic-common = 1:10.1.10-1.el7 is needed by (installed) openstack-ironic-conductor-1:10.1.10-1.el7.noarch [root@bogon site-packages]# rpm -e openstack-ironic-common --nodeps
[root@bogon site-packages]# yum -y install openstack-ironic-common Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * centos-qemu-ev: mirror-hk.koddos.net Resolving Dependencies --> Running transaction check ---> Package openstack-ironic-common.noarch 1:10.1.10-1.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================== Package Arch Version Repository Size ================================================================================================================== Installing: openstack-ironic-common noarch 1:10.1.10-1.el7 centos-openstack-queens 1.0 M Transaction Summary ================================================================================================================== Install 1 Package Total download size: 1.0 M Installed size: 4.6 M Downloading packages: openstack-ironic-common-10.1.10-1.el7.noar 0% [
[root@bogon yum.repos.d]# cat CentOS-OpenStack-queens.repo # CentOS-OpenStack-queens.repo # # Please see http://wiki.centos.org/SpecialInterestGroup/Cloud for more # information [centos-openstack-queens] name=CentOS-7 - OpenStack queens baseurl=http://mirror.centos.org/$contentdir/$releasever/cloud/$basearch/openstack-queens/ gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud exclude=sip,PyQt4 [centos-openstack-queens-test] name=CentOS-7 - OpenStack queens Testing baseurl=https://buildlogs.centos.org/centos/7/cloud/$basearch/openstack-queens/ gpgcheck=0 enabled=0 exclude=sip,PyQt4 [centos-openstack-queens-debuginfo] name=CentOS-7 - OpenStack queens - Debug baseurl=http://debuginfo.centos.org/centos/7/cloud/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud exclude=sip,PyQt4 [centos-openstack-queens-source] name=CentOS-7 - OpenStack queens - Source baseurl=http://vault.centos.org/centos/7/cloud/Source/openstack-queens/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud exclude=sip,PyQt4 [rdo-trunk-queens-tested] name=OpenStack queens Trunk Tested baseurl=https://trunk.rdoproject.org/centos7-queens/current-passed-ci/ gpgcheck=0 enabled=0 [root@bogon yum.repos.d]#
由于 OpenStack 的所有项目都是采用 Python 开发,所以调试 OpenStack 的本质就是调试 Python,Python 的调试通常有以下两种。 Log:方便简单,适用简单的调试 Pdb:类似 C 语言的 gdb,支持交互调试源码,功能强大 Log OpenStack logging 模块是在 python logging 基础之上做了封装,使用简单,以 nova 为例,首先需要导入相关代码文件,获取日志句柄后,即可往该句柄写入日志信息。 from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) LOG.debug("Print log.") 如果文件中已经导入日志模块和获取日志句柄,直接使用该句柄即可。 OpenStack logging 模块提供了丰富的和日志相关的配置项,详情请见 logging config options。 PDB Pdb 是 python 自带的库,它支持设置断点、单步调试源码、查看当前代码、查看 stack 片段和动态修改变量的值等功能,常用命令如下: +----------+--------------+ | commands | Description | +----------+--------------+ | b | 设断点 | | c | 继续执行程序 | | l | 查看当前片段 | | n | 执行下行代码 | | p | 打印变量的值 | | q | 结束调试程序 | +----------+--------------+ pdb.set_trace 使用该方法时,需在断点处加入以下代码: import pdb; pdb.set_trace() 以调试 nova 创建虚拟机为例,在 API 入口处加入上行代码: @wsgi.response(202) @wsgi.serializers(xml=FullServerTemplate) @wsgi.deserializers(xml=CreateDeserializer) def create(self, req, body): """Creates a new server for a given user.""" # 加入此行代码 import pdb; pdb.set_trace() if not self.is_valid_body(body, 'server'): raise exc.HTTPUnprocessableEntity() context = req.environ['nova.context'] server_dict = body['server'] password = self._get_server_admin_password(server_dict) ...... 之后在 shell 中执行以下命令,nova-api 收到创建虚拟机请求时,便会进入该断点: $ /usr/bin/python /usr/bin/nova-api python -m pdb debug_file.py 无论是日志还是 pdb.set_trace 方法,均需要修改源代码,有没有一种方法不需要改动文件呢?答案是肯定的,pdb 还提供了另外一种调试模式: $ python -m pdb debug_file.py 依旧以调试 nova 创建虚拟机为例,步骤如下: $ /usr/bin/python -m pdb /usr/bin/nova-api # 设置断点 b file_name.py:line (pdb) b /usr/lib/python2.6/site-packages/nova/api/openstack/compute/servers.py:781 # 按 c 运行程序,当收到创建虚拟机请求时,便会进入断点 (pdb) c
yum install openstack-ironic-api openstack-ironic-conductor python-ironicclient -y