未找到主机的python结构必须手动设置';环境主机字符串';
有什么方法可以让它与env.hosts一起工作吗?而不是每当我有多台主机运行时就必须手动循环 我正在尝试使用fabric api,以避免使用非常不方便和笨拙的fabric命令行调用。我在一个模块/类中设置env.hosts变量,然后调用另一个类实例方法来运行fabric命令。在被调用的类实例中,我可以打印出env.hosts列表。然而,当我尝试运行一个命令时,它告诉我它找不到主机 如果我在env.hosts数组中循环并手动为env.hosts数组中的每个主机设置env.host变量,我就可以让run命令工作。奇怪的是,我还在调用类中设置了env.user变量,并将其拾取 e、 g.这项工作:未找到主机的python结构必须手动设置';环境主机字符串';,python,fabric,env,Python,Fabric,Env,有什么方法可以让它与env.hosts一起工作吗?而不是每当我有多台主机运行时就必须手动循环 我正在尝试使用fabric api,以避免使用非常不方便和笨拙的fabric命令行调用。我在一个模块/类中设置env.hosts变量,然后调用另一个类实例方法来运行fabric命令。在被调用的类实例中,我可以打印出env.hosts列表。然而,当我尝试运行一个命令时,它告诉我它找不到主机 如果我在env.hosts数组中循环并手动为env.hosts数组中的每个主机设置env.host变量,我就可以让r
def upTest(self):
print('env.hosts = ' + str(env.hosts))
for host in env.hosts:
env.host_string = host
print('env.host_string = ' + env.host_string)
run("uptime")
这项研究的结果:
env.hosts = ['ec2-....amazonaws.com']
env.host_string = ec2-....amazonaws.com
[ec2-....amazonaws.com] run: uptime
[ec2-....amazonaws.com] out: 18:21:15 up 2 days, 2:13, 1 user, load average: 0.00, 0.01, 0.05
[ec2-....amazonaws.com] out:
这不管用。。。但是如果你从一个“fab”文件运行它,它确实可以工作。。。对我来说毫无意义
def upTest(self):
print('env.hosts = ' + str(env.hosts))
run("uptime")
这是输出:
No hosts found. Please specify (single) host string for connection:
我确实尝试过在方法上添加一个@task decorator(并且删除了“self”引用,因为decorator不喜欢这样)。但是没有帮助
有什么方法可以让它与env.hosts一起工作吗?与有多台主机运行时必须手动循环不同?最后,我使用execute()和exec解决了这个问题。 main.py
#!/usr/bin/env python
from demo import FabricSupport
hosts = ['localhost']
myfab = FabricSupport()
myfab.execute("df",hosts)
demo.py
#!/usr/bin/env python
from fabric.api import env, run, execute
class FabricSupport:
def __init__(self):
pass
def hostname(self):
run("hostname")
def df(self):
run("df -h")
def execute(self,task,hosts):
get_task = "task = self.%s" % task
exec get_task
execute(task,hosts=hosts)
python main.py
[localhost] Executing task 'hostname'
[localhost] run: hostname
[localhost] out: heydevops-workspace
我发现最好不要在代码中设置
env.hosts
,而是根据配置文件定义角色,并使用fab工具指定角色。它对我有用
my_roles.json
{
"web": [ "user@web1.example.com", "user@web2.example.com" ],
"db": [ "user@db1.example.com", "user@db2.example.com" ]
}
fabfile.py
from fabric.api import env, run, task
import json
def load_roles():
with open('my_roles.json') as f:
env.roledefs = json.load(f)
load_roles()
@task
def my_task():
run("hostname")
CLI
fab-R web我的任务
对于web1
和web2
中的每一个,运行my_task
的输出如下所示