【问题标题】:python fabric no host found must manually set 'env.host_string'python fabric找不到主机必须手动设置'env.host_string'
【发布时间】:2023-03-28 01:50:01
【问题描述】:

有没有办法让它与 env.hosts 一起工作?而不是在我有多个主机运行它时必须手动循环?

我正在尝试使用fabric api,而不必使用非常不方便和kludgey 的fabric 命令行调用。我在一个模块/类中设置了 env.hosts 变量,然后调用另一个类实例方法来运行结构命令。在被调用的类实例中,我可以打印出 env.hosts 列表。然而,当我尝试运行命令时,它告诉我找不到主机。

如果我循环遍历 env.hosts 数组并为 env.hosts 数组中的每个主机手动设置 env.host 变量,我可以让运行命令工作。奇怪的是,我还在调用类中设置了 env.user 变量,并且它拾取了。

例如这行得通:

    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 装饰器(并删除'self'引用,因为装饰器不喜欢那样)。但无济于事。

有没有办法让它与 env.hosts 一起工作?而不是在我有多个主机运行它时必须手动循环?

【问题讨论】:

    标签: python fabric env


    【解决方案1】:

    最后,我通过使用 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
    

    【讨论】:

      【解决方案2】:

      我发现最好不要在代码中设置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")
      

      命令行界面

      fab -R web my_task

      web1web2 运行my_task 的输出在这里

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 2022-10-31
        • 2016-01-23
        • 2022-08-06
        • 1970-01-01
        相关资源
        最近更新 更多