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: Brandon Whaley
Subject: Re: [Fab-user] How do I combine "local" with "remote" tasks in fabric 2?
Date: Mon, 1 Apr 2019 15:33:15 -0400

There is no local attribute on invoke contexts, only on fabric
connections (which inherits from invoke contexts).  If this isn't what
you're trying to do, could you provide some code examples that give
you the traceback you're seeing?

On Mon, Apr 1, 2019 at 1:07 PM Michel Albert <address@hidden> wrote:
>
> 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]