RemoteIPRoute¶
Caveats¶
Warning
The class implies a serious performance penalty. Please consider other options if you expect high loads of the netlink traffic.
Warning
The class requires the mitogen library that should be installed separately: https://mitogen.readthedocs.io/en/latest/
Warning
The object of this class implicitly spawn child processes. Beware.
Here are some reasons why this class is not used as a general class instead of specific IPRoute for local RTNL, and NetNS for local netns management:
The performance of the Python parser for the binary netlink protocol is not so good, but using such proxies makes it even worse.
Local IPRoute and NetNS access is the core functionality and must work with no additional libraries installed.
Introduction¶
It is possible to run IPRoute instances remotely using the mitogen library. The remote node must have same python version installed, but no additional libraries are required there: all the code will be imported from the host where you start your script.
The simplest case, run IPRoute on a remote Linux host via ssh (assume the keys are deployed):
from pyroute2 import RemoteIPRoute
rip = RemoteIPRoute(protocol='ssh',
hostname='test01',
username='ci')
rip.get_links()
# ...
Indirect access¶
Building mitogen proxy chains you can access nodes indirectly:
import mitogen.master
from pyroute2 import RemoteIPRoute
broker = mitogen.master.Broker()
router = mitogen.master.Router(broker)
# login to the gateway
gw = router.ssh(hostname='test-gateway',
username='ci')
# login from the gateway to the target node
host = router.ssh(via=gw,
hostname='test01',
username='ci')
rip = RemoteIPRoute(router=router, context=host)
rip.get_links()
# ...
Run with privileges¶
It requires the mitogen sudo proxy to run IPRoute with root permissions:
import mitogen.master
from pyroute2 import RemoteIPRoute
broker = mitogen.master.Broker()
router = mitogen.master.Router(broker)
host = router.ssh(hostname='test01', username='ci')
sudo = router.sudo(via=host, username='root')
rip = RemoteIPRoute(router=router, context=sudo)
rip.link('add', ifname='br0', kind='bridge')
# ...
Remote network namespaces¶
You also can access remote network namespaces with the same RemoteIPRoute object:
import mitogen.master
from pyroute2 import RemoteIPRoute
broker = mitogen.master.Broker()
router = mitogen.master.Router(broker)
host = router.ssh(hostname='test01', username='ci')
sudo = router.sudo(via=host, username='root')
rip = RemoteIPRoute(router=router, context=sudo, netns='test-netns')
rip.link('add', ifname='br0', kind='bridge')
# ...