linux中修改虚机IP的方法与问题

前段时间,实现这么一个功能,界面上提供修改虚机IP地址的操作,后台neutron用port update方法。
neutron client的port update接口和其他资源的update方法不太一样,参数没指定正确,会导致一个port上出现两个fixed ip。

接下来就是考虑floating ip的问题。

如果虚机绑定了浮动ip,修改虚机的fixed ip,在l3 namespace里还是会保存原来的iptables规则。因此,在port update之前要判断floating ip的存在关系,需要解绑和绑定的操作。

修改完成后,测试。发现api请求的时间居然快30s。port update会给每个计算节点发送cast的rpc消息,而在消息队列那边,同事改了代码,在cast消息中sleep了1s左右,因此到ml2 plugin的port update方法完成,耗费了很长的时间。

切回到内部环境测试后,使用neutron来看port的状态,确实已经更新。但是前端并没有及时的显示,也就是说nova那边并没有及时的获取这种状态。当时以为和rpc的sleep有关,就没仔细想这个问题。

后来老大问了这个问题,并且给出了nova的ExternalEventAPI。
ExternalEventAPI

我也赶紧看了下neutron这边的代码,在neutron的NeutronDbPluginV2类中,使用SQLAlchemy的事件监听来监听Port数据库的变化,然后给nova发送notifier。

 代码如下 复制代码
class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
                        CommonDbMixin):
    """V2 Neutron plugin interface implementation using SQLAlchemy models.
 
    Whenever a non-read call happens the plugin will call an event handler
    class method (e.g., network_created()).  The result is that this class
    can be sub-classed by other classes that add custom behaviors on certain
    events.
    """
 
 
    def __init__(self):
        db.configure_db()
        if cfg.CONF.notify_nova_on_port_status_changes:
            # NOTE(arosen) These event listners are here to hook into when
            # port status changes and notify nova about their change.
            self.nova_notifier = nova.Notifier()
            event.listen(models_v2.Port, 'after_insert',
                         self.nova_notifier.send_port_status)
            event.listen(models_v2.Port, 'after_update',
                         self.nova_notifier.send_port_status)
            event.listen(models_v2.Port.status, 'set',
                         self.nova_notifier.record_port_status_changed)

可见自己对代码还没有很熟悉,而且只关注自己这块,不注意和其他组件的交互。

接着和nova这边的同事一起调试,在neutron server的日志中有报错:

 代码如下 复制代码

2014-11-28 10:48:21.137 17163 DEBUG neutron.notifiers.nova [req-6b23770b-4f0d-4e85-ba21-1c47f191e136 None] Sending events: [{'status': 'completed', 'tag': u'ddc6cb03-1963-4f7e-bf07-e55acbada573', 'name': 'network-vif-plugged', 'server_uuid': u'fcb2531c-878c-4934-ac7b-9f792071756d'}] send_events /usr/lib/python2.6/site-packages/neutron/notifiers/nova.py:218
2014-11-28 10:48:21.138 17163 INFO requests.packages.urllib3.connectionpool [-] Resetting dropped connection: 10.100.100.10
2014-11-28 10:48:21.168 17163 DEBUG requests.packages.urllib3.connectionpool [-] "POST /v2/6d381a3f7609474d9cb9b5421cf89943/os-server-external-events HTTP/1.1" 403 131 _make_request /usr/lib/python2.6/site-packages/requests/packages/urllib3/connectionpool.py:362
2014-11-28 10:48:21.169 17163 ERROR neutron.notifiers.nova [req-6b23770b-4f0d-4e85-ba21-1c47f191e136 None] Failed to notify nova on events: [{'status': 'completed', 'tag': u'ddc6cb03-1963-4f7e-bf07-e55acbada573', 'name': 'network-vif-plugged', 'server_uuid': u'fcb2531c-878c-4934-ac7b-9f792071756d'}]
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova Traceback (most recent call last):
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/neutron/notifiers/nova.py", line 221, in send_events
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     batched_events)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/novaclient/v1_1/contrib/server_external_events.py", line 39, in create
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     return_raw=True)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/novaclient/base.py", line 152, in _create
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     _resp, body = self.api.client.post(url, body=body)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 286, in post
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     return self._cs_request(url, 'POST', **kwargs)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 260, in _cs_request
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     **kwargs)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 242, in _time_request
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     resp, body = self.request(url, method, **kwargs)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova   File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 236, in request
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova     raise exceptions.from_response(resp, body, url, method)
2014-11-28 10:48:21.169 17163 TRACE neutron.notifiers.nova Forbidden: Policy doesn't allow compute_extension:os-server-external-events:create to be performed. (HTTP 403) (Request-ID: req-054895f0-fda1-4628-b288-d39d292db381)
接下来同事调试,nova那边使用keystone v3的接口,在nova的policy文件中,对应os-server-external-events:create需要admin的api操作:
“compute_extension:os-server-external-events:create”: “rule:admin_api”,
“compute_extension:v3:os-server-external-events:create”: “rule:admin_api”,

对于admin的context,需要admin的角色和cloud_admin的角色。
context_is_admin”: “role:admin and role:cloud_admin”,

因此需要给neutron加入cloud_admin的角色。keystone v3这块的变化,需要去看看。

时间: 2024-12-11 03:00:15

linux中修改虚机IP的方法与问题的相关文章

Linux中修改环境变量及生效方法_Linux

在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是"永久的". 要让刚才的修改马上生效,需要执行以下代码 source /etc/profile 以上这篇Linux中修改环境变量及生效方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索

linux中postfix更换出口IP地址方法

说明: 自己的邮局服务器由于配置问题,被拿来群发大量垃圾邮件.现在就蛋疼了,给gmail或其它邮箱发邮件,会被退信或直接在垃圾箱里.一个一个申诉太麻烦了,直接换postfix的出口IP就行了. 实现:  代码如下 复制代码 # cp /etc/postfix/master.cf /etc/postfix/master.cf.bak.2013.10.29  //保存原始配置,出错也比较好恢复!!  代码如下 复制代码 # vim /etc/postfix/master.cf smtp      u

做一个自动修改本机IP和mac的bat文件

原文:做一个自动修改本机IP和mac的bat文件 1.ip bat修改理论探讨       前两天我突然萌生了一个念头:能不能做一个小程序来实现自动配置或修改IP和mac,达到一键搞定的目的,这样尤其适合那些带着笔记本到处跑的商务人员,于是我首先想到了bat处理.       查阅资料后发现修改iP有现成的命令,但是修改mac相对麻烦一些,需要智能地修改注册表. 修改ip命令如下: netsh interface ip set address name="本地连接" source=st

在 Linux 中修改 MySQL 或 MariaDB 的 Root 密码

如果你是第一次安装 MySQL 或 MariaDB,你可以执行 mysql_secure_installation 脚本来实现基本的安全设置. 其中的一个设置是数据库的 root 密码 -- 该密码必须保密,并且只在必要的时候使用.如果你需要修改它(例如,当数据库管理员换了人 -- 或者被解雇了!). 建议阅读:在 Linux 中恢复 MySQL 或 MariaDB 的 Root 密码 这篇文章迟早会派上用场的.我们讲说明怎样来在 Linux 中修改 MySQL 或 MariaDB 数据库服务器

Linux中修改/etc/profile或者$HOME/.profile文件后如何立即生效?

Linux中修改/etc/profile或者$HOME/.profile文件后如何立即生效? 当我们在管理/etc/profile文件时,进行了一些定制的修改,哪么如何才能立即生效呢? [root@localhost~]# vi /etc/profile# /etc/profile # System wide environment and startup programs, for login setup# Functions and aliases go in /etc/bashrc # I

Win8系怎么统查看与修改本机IP/DNS地址

  Win8系怎么统查看与修改本机IP/DNS地址          1.找到桌面右下角的如图所示的网络按钮. 2.右击->选择"打开网络和共享中心"一项. 3.找到"以太网",右击选择属性. 4.在如图所示的"网络"项目下,找到"Internet协议版本4(TCP/IPv4)",单击进入 5.选择"使用下面的IP地址(S)",然后在如图所示的红圈里填上你的IP地址.子网掩码和默认网关. 选择&quo

Linux中修改linux启动方式(文本方式或xwindow方式)?

Linux中修改linux启动方式(文本方式或xwindow方式)? vi /etc/inittab 找到id:x:initdefault:一行,x=3为文本方式 x=5为xwindow方式,重启机器即可生效

Linux有问必答:如何在Linux中修改环境变量PATH

Linux有问必答:如何在Linux中修改环境变量PATH 提问: 当我试着运行一个程序时,它提示"command not found". 但这个程序就在/usr/local/bin下.我该如何添加/usr/local/bin到我的PATH变量下,这样我就可以不用指定路径来运行这个命令了. 在Linux中,PATH环境变量保存了一系列的目录用于用户在输入的时候搜索命令.PATH变量的值由一系列的由冒号分隔的绝对路径组成.每个用户都有特定的PATH环境变量(由系统级的PATH变量初始化)

Android实现编程修改手机静态IP的方法_Android

本文实例讲述了Android实现编程修改手机静态IP的方法.分享给大家供大家参考.具体如下: 这里演示通过编程方式动态修改手机静态IP的方法,可以用于wifi接入点切换 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver cr = this.getContentResolver();