[英]How do you change a computers IP address with Fabric without hanging?
我有一個小的結構腳本,可以更改服務器的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):
我想在更改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_ip test_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:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.