Python 如何使用Fabric更改计算机IP地址而不挂起?

Python 如何使用Fabric更改计算机IP地址而不挂起?,python,ip-address,fabric,devops,sysadmin,Python,Ip Address,Fabric,Devops,Sysadmin,我有一个更改服务器IP的小结构脚本: from cStringIO import StringIO import os import fabric import fabric.api import jinja2 fabric.state.env['hosts'] = '10.1.0.4' def render(tpl_path, context): path, filename = os.path.split(tpl_path) template_stream = jinj

我有一个更改服务器IP的小结构脚本:

from cStringIO import StringIO
import os

import fabric
import fabric.api
import jinja2

fabric.state.env['hosts'] = '10.1.0.4'

def render(tpl_path, context):
    path, filename = os.path.split(tpl_path)
    template_stream = jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')).get_template(filename).stream(context)
    output_stream = StringIO()
    for chunk in template_stream:
        output_stream.write(chunk)
    return output_stream

def change_ip():
    ifcfg_ens192 = render("ifcfg.j2", {
        "device": "ens192",
        "ip_address": "10.1.0.20",
        "prefix": "24"
    })

    fabric.operations.put(ifcfg_ens192, "/etc/sysconfig/network-scripts/ifcfg-ens192", use_sudo=True, mirror_local_mode=True)

    fabric.operations.sudo("service network restart")

fabric.tasks.execute(change_ip)
不幸的是,当IP地址更改时,结构将挂起并显示以下输出

[10.1.0.4] Executing task 'change_ip'
[10.1.0.4] Login password for 'root':
[10.1.0.4] put: <file obj> -> /etc/sysconfig/network-scripts/ifcfg-ens192
[10.1.0.4] sudo: service network restart
[10.1.0.4] out: Restarting network (via systemctl):
[10.1.0.4]执行任务“更改ip”
[10.1.0.4]root用户的登录密码:
[10.1.0.4]put:->/etc/sysconfig/network scripts/ifcfg-ens192
[10.1.0.4]sudo:服务网络重启
[10.1.0.4]输出:重新启动网络(通过systemctl):

我想在更改IP任务后执行其他任务。有什么好办法可以解决这个问题吗?

下面的脚本似乎可以解决这个问题:

from cStringIO import StringIO
import os

import fabric
import fabric.api
import jinja2

change_host = '10.1.0.4'
change_to = '10.1.0.20'

fabric.state.env['hosts'] = [change_host]
fabric.state.env['user'] = 'user'

def render(tpl_path, context):
    path, filename = os.path.split(tpl_path)
    template_stream = jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')).get_template(filename).stream(context)
    output_stream = StringIO()
    for chunk in template_stream:
        output_stream.write(chunk)
    return output_stream

def change_ip():
    ifcfg_ens192 = render("ifcfg.j2", {
        "device": "ens192",
        "ip_address": change_to,
        "prefix": "24"
    })

    fabric.operations.put(ifcfg_ens192, "/etc/sysconfig/network-scripts/ifcfg-ens192", use_sudo=True, mirror_local_mode=True)

    try:
        fabric.operations.sudo("service network restart", timeout=0.5)
    except fabric.exceptions.CommandTimeout:
        pass

    fabric.state.env['hosts'] = [change_to]

def test_task():
    fabric.operations.run("echo 'hi'")
它使用以下命令运行:
fab-f fabfile.py change\u ip test\u task

并生成以下输出:

[10.1.0.4] Executing task 'change_ip'
[10.1.0.4] Login password for 'user':
[10.1.0.4] put: <file obj> -> /etc/sysconfig/network-scripts/ifcfg-ens192
[10.1.0.4] sudo: service network restart
[10.1.0.4] out: sudo password:
[10.1.0.4] out: Restarting network (via systemctl):  [10.1.0.20] Executing task 'test_task'
[10.1.0.20] run: echo 'hi'
[10.1.0.20] out: hi
[10.1.0.20] out:
[10.1.0.4]执行任务“更改ip”
[10.1.0.4]用户的登录密码:
[10.1.0.4]put:->/etc/sysconfig/network scripts/ifcfg-ens192
[10.1.0.4]sudo:服务网络重启
[10.1.0.4]输出:sudo密码:
[10.1.0.4]输出:重新启动网络(通过systemctl):[10.1.0.20]执行任务“测试任务”
[10.1.0.20]跑步:回音“嗨”
[10.1.0.20]出:嗨
[10.1.0.20]输出: