Python 3.8.2, Fabric 2.5.0, Paramiko 2.7.2, Invoke 1.4.1

Hello,

I have a fabfile which needs to handle hosts passed at the command-line
(using `-H`) and hosts defined in the fabfile if `-H` was not passed.
Here's an example of the issue I'm facing:

```python
target_group = None

@task
def prod(ctx):
    _env_handler(ctx, "prod")

def _env_handler(ctx, env_name):
    global target_group

    if not hasattr(ctx, 'host'):
        target_group = Group("somehost1.tld", "somehost2.tld")

@task(hosts=target_group)
def test(ctx):
    print(ctx)
```

If I run `fab prod test`:

```
<Context: <Config: {'run': {'asynch ...
```

If I run `fab -H 1,2 test`:

```
<Connection host=1>
<Connection host=2>
```

So, passing hosts using the `@task(hosts=[...]` decorator produces a ctx
`Context` object, and using `-H` produces a ctx `Connection` object.

I know using a task (`prod(ctx)`) to wrap environment logic may be
questionable...but is there a way to ensure the task (`test(ctx)`) always
receives a `Connection` object...or am I fundamentally misunderstanding
something?

Thanks.

Edit: I've also tried directly passing a host list `(e.g.
@task(hosts=["somehost1.tld", "somehost2.tld"]))` with the same result.

Reply via email to