Passing a Fabric env.hosts sting as a variable is not work in function
env, fabric, hosts, python
Solution
Here's my insight.
According to docs, if you're calling fabric tasks from python scripts - you should use fabric.tasks.execute.
Should be smth like this:
demo.py
from fabric.api import run
from fabric.tasks import execute
def deploy(hosts, command):
execute(execute_deploy, command=command, hosts=hosts)
def execute_deploy(command):
run(command)
main.py
from demo import deploy
hosts = ['localhost']
command = 'hostname'
deploy(hosts, command)
Then, just run `python main.py`. Hope that helps.
Problem
Passing a Fabric env.hosts sting as a variable is not work in function. demo.py ``` #!/usr/bin/env python from fabric.api import env, run def deploy(hosts, command): print hosts env.hosts = hosts run(command) ``` main.py ``` #!/usr/bin/env python from demo import deploy hosts = ['localhost'] command = 'hostname' deploy(hosts, command) ``` python main.py ``` ['localhost'] No hosts found. Please specify (single) host string for connection: ``` But env.host_string works! demo.py ``` #!/usr/bin/env python from fabric.api import env, run def deploy(host, command): print host env.host_string = host run(command) ``` main.py ``` #!/usr/bin/env python from demo import deploy host = 'localhost' command = 'hostname' deploy(host, command) ``` python main.py ``` localhost [localhost] run: hostname [localhost] out: heydevops-workspace ``` But the env.host_string is not enough for us, it's a single host. Maybe we can use env.host_string within a loop, but that's not good. Because we also want to set the concurrent tasks number and run them parallelly. Now in ddep(my deployment engine), I only use MySQLdb to get the parameters then execute the fab command like: ``` os.system("fab -f service/%s.py -H %s -P -z %s %s" % (project,host,number,task)) ``` This is a simple way but not good. Because if I use the fab command, I can't catch the exceptions and failures of the results in Python, to make my ddep can "retry" the failed hosts. If I use the "from demo import deploy", I can control and get them by some codes in Python. So now "env.host " is the trouble. Can somebody give me a solution? Thanks a lot.