2017-01-25 1 views
2

Ich habe einen kleinen Stoff Skript, das die IP-Adresse eines Server ändert:Wie ändern Sie die IP-Adresse eines Computers mit Fabric, ohne zu hängen?

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) 

Leider, wenn die IP-Adresse geändert wird, mit der folgenden Ausgabe hängt Stoff.

[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): 

Ich möchte andere Aufgabe nach der Änderung IP-Task ausführen. Gibt es einen guten Weg, das zu beheben?

Antwort

0

Das folgende Skript schien den Trick zu tun:

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'") 

sie mit folgendem Befehl ausgeführt wird: fab -f fabfile.py change_ip test_task

und erzeugt die folgende Ausgabe:

[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: 
Verwandte Themen