Python 结构设置问题()
运行Fabric的最新版本(1.11.1)(Paramiko(1.16.0)、Python(2.7.11))时,我遇到了一个最奇怪的错误,我做了一些概念验证来尝试它Python 结构设置问题(),python,fabric,Python,Fabric,运行Fabric的最新版本(1.11.1)(Paramiko(1.16.0)、Python(2.7.11))时,我遇到了一个最奇怪的错误,我做了一些概念验证来尝试它 from fabric.api import run, sudo, task from fabric.context_managers import settings @task def test(): print('regular run') run('whoami') print('regular
from fabric.api import run, sudo, task
from fabric.context_managers import settings
@task
def test():
print('regular run')
run('whoami')
print('regular sudo')
sudo('whoami')
print('sudo with user arg')
sudo('whoami', user='www-data')
with settings(user='www-data'):
print('run inside settings')
run('whoami')
输出:
$ fab -f test.py -H vagrant@127.0.0.1:2222 test
[vagrant@127.0.0.1:2222] Executing task 'test'
regular run
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: vagrant # <--- good
[vagrant@127.0.0.1:2222] out:
regular sudo
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: root # <--- good
[vagrant@127.0.0.1:2222] out:
sudo with user arg
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: www-data # <--- good
[vagrant@127.0.0.1:2222] out:
run inside settings
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: vagrant # <--- WHAT THE HECK!? this used to work
[vagrant@127.0.0.1:2222] out:
Done.
$ fab -f test.py -H vagrant@127.0.0.1:2222 test
[vagrant@127.0.0.1:2222] Executing task 'test'
regular run
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: vagrant # <--- good
[vagrant@127.0.0.1:2222] out:
regular sudo
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: root # <--- good
[vagrant@127.0.0.1:2222] out:
sudo with user arg
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: www-data # <--- good
[vagrant@127.0.0.1:2222] out:
run inside settings
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: www-data # <--- good
[vagrant@127.0.0.1:2222] out:
Done.
$fab-f test.py-Hvagrant@127.0.0.1:2222测试
[vagrant@127.0.0.1:2222]正在执行任务“测试”
常规跑步
[vagrant@127.0.0.1:2222]run:whoami
[vagrant@127.0.0.1:2222]out:vagrant#另一个织物问题,如果你做一些可爱的事情,比如:-Hvagrant@127.0.0.1:2222
在内部,它不会将其分解为您所期望的:env.user='vagrant';env.host='127.0.0.1';env.port='2222'
但它只是将其保存在主机字符串中。所以啊,这是世界上最丑的黑客:
这有助于保持代码相当“干净”,并且不会有一堆带有设置的(host_string='www-data@'+env.host_string.split('@')[1]):
到处都是,只有在定义fabric命令(如:fab.)时,它们才会断开--user=vagrant--host=127.0.0.1--port=2222
。此解决方案适用于以下情况:
fab-f test.py--user=vagrant--host=127.0.0.1--port=2222 test
fab-f test.py-Hvagrant@127.0.0.1:2222测试
老办法
输出:
$ fab -f test.py -H vagrant@127.0.0.1:2222 test
[vagrant@127.0.0.1:2222] Executing task 'test'
regular run
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: vagrant # <--- good
[vagrant@127.0.0.1:2222] out:
regular sudo
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: root # <--- good
[vagrant@127.0.0.1:2222] out:
sudo with user arg
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: www-data # <--- good
[vagrant@127.0.0.1:2222] out:
run inside settings
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: vagrant # <--- WHAT THE HECK!? this used to work
[vagrant@127.0.0.1:2222] out:
Done.
$ fab -f test.py -H vagrant@127.0.0.1:2222 test
[vagrant@127.0.0.1:2222] Executing task 'test'
regular run
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: vagrant # <--- good
[vagrant@127.0.0.1:2222] out:
regular sudo
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: root # <--- good
[vagrant@127.0.0.1:2222] out:
sudo with user arg
[vagrant@127.0.0.1:2222] sudo: whoami
[vagrant@127.0.0.1:2222] out: www-data # <--- good
[vagrant@127.0.0.1:2222] out:
run inside settings
[vagrant@127.0.0.1:2222] run: whoami
[vagrant@127.0.0.1:2222] out: www-data # <--- good
[vagrant@127.0.0.1:2222] out:
Done.
$fab-f test.py-Hvagrant@127.0.0.1:2222测试
[vagrant@127.0.0.1:2222]正在执行任务“测试”
常规跑步
[vagrant@127.0.0.1:2222]run:whoami
[vagrant@127.0.0.1:2222]外出:流浪汉#