fab-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Fab-user] How do I combine "local" with "remote" tasks in fabric 2?


From: Michel Albert
Subject: Re: [Fab-user] How do I combine "local" with "remote" tasks in fabric 2?
Date: Mon, 1 Apr 2019 19:07:09 +0200

Ok. I think I will get it to work like that.

But after fiddling around with it I found out that the type of the first argument depends on whether a "hosts" argument was passed into the task decorator or not. This was quite confusing. And the error is a bit cryptic. When calling "local" on an invoke context, the following AttributeError is thrown:

Traceback (most recent call last):
  File "/usr/lib/python3.7/site-packages/invoke/config.py", line 113, in __getattr__
    return self._get(key)
  File "/usr/lib/python3.7/site-packages/invoke/config.py", line 178, in _get
    value = self._config[key]
  File "/usr/lib/python3.7/site-packages/invoke/config.py", line 169, in __getitem__
    return self._get(key)
  File "/usr/lib/python3.7/site-packages/invoke/config.py", line 178, in _get
    value = self._config[key]
KeyError: 'local'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/exhuma/.local/bin/fab", line 10, in <module>
    sys.exit(program.run())
  File "/usr/lib/python3.7/site-packages/invoke/program.py", line 363, in run
    self.execute()
  File "/usr/lib/python3.7/site-packages/invoke/program.py", line 532, in execute
    executor.execute(*self.tasks)
  File "/usr/lib/python3.7/site-packages/invoke/executor.py", line 129, in execute
    result = call.task(*args, **call.kwargs)
  File "/usr/lib/python3.7/site-packages/invoke/tasks.py", line 128, in __call__
    result = self.body(*args, **kwargs)
  File "/home/exhuma/tmp/fabfile.py", line 8, in get_version
    version = ctx.local('python setup.py --version').strip()
  File "/usr/lib/python3.7/site-packages/invoke/config.py", line 125, in __getattr__
    raise AttributeError(err)
AttributeError: No attribute or config key found for 'local'

Valid keys: ['connect_kwargs', 'forward_agent', 'gateway', 'inline_ssh_env', 'load_ssh_configs', 'port', 'run', 'runners', 'ssh_config_path', 'sudo', 'tasks', 'timeouts', 'user']

Valid real attributes: ['cd', 'clear', 'config', 'cwd', 'from_data', 'pop', 'popitem', 'prefix', 'run', 'setdefault', 'sudo', 'update']


On Mon, Apr 1, 2019 at 5:37 PM Brandon Whaley <address@hidden> wrote:
Hi Mich,

The connection object (you're using ctx in your examples) has a .local
method that is just a pass-through to invoke.run.  It's documented on
the connection object's page:
http://docs.fabfile.org/en/2.4/api/connection.html?highlight=local#fabric.connection.Connection.local

On Mon, Apr 1, 2019 at 5:55 AM Michel Albert <address@hidden> wrote:
>
> Hi,
>
>
> Consider the following fabric-1 task. For illustration I kept it really short:
>
> @fab.task
> def sample():
>     version = fab.local('python setup.py --version')
>     fab.run('mkdir -p /snapshots/%s' % version.strip())
>
> This task needs to run a local and remote command. I am now trying to port this to fabric-2, and I can't figure out how I can implement this. If I define the "hosts" variable in the task, then the first line will be executed on the remote host as well, which I don't want. A naive aproach which won't work:
>
> @task(hosts=PROD)
> def sample(ctx):
>     version = ctx.run('python setup.py --version').strip()   # <- this won't work
>     ctx.run('mkdir -p /snapshots/%s' % version)
>
> At first I thought I would split the task into two, one for just local commands and one for remote tasks, but then I am forced to pass in the context, which will in turn cause it again to be run remotely:
>
> @task
> def get_version(ctx):
>     version = ctx.run('python setup.py --version').strip()
>     return version
>
> @task(hosts=PROD)
> def sample(ctx):
>     version = get_version(ctx)  # <- this won't work
>     ctx.run('mkdir -p /snapshots/%s' % version)
>
> How can I accomplish something like this? And where is it noted in the docs? In the current example on the "Upgrading from 1.x" page does not have a single task mixing local with remote commands in any way.
>
>
> Regards,
>
>
> Mich
>
> _______________________________________________
> Fab-user mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/fab-user

reply via email to

[Prev in Thread] Current Thread [Next in Thread]