<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://aznot.com/index.php?action=history&amp;feed=atom&amp;title=Python%2FFabric</id>
	<title>Python/Fabric - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://aznot.com/index.php?action=history&amp;feed=atom&amp;title=Python%2FFabric"/>
	<link rel="alternate" type="text/html" href="https://aznot.com/index.php?title=Python/Fabric&amp;action=history"/>
	<updated>2026-05-07T04:25:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://aznot.com/index.php?title=Python/Fabric&amp;diff=6158&amp;oldid=prev</id>
		<title>Kenneth: /* Simple Local */</title>
		<link rel="alternate" type="text/html" href="https://aznot.com/index.php?title=Python/Fabric&amp;diff=6158&amp;oldid=prev"/>
		<updated>2023-01-03T16:51:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Simple Local&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Fabric2 ==&lt;br /&gt;
&lt;br /&gt;
See [[Python/Fabric2]]&lt;br /&gt;
&lt;br /&gt;
== Simple Local ==&lt;br /&gt;
&lt;br /&gt;
 # local(command, capture=False, shell=None)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from fabric.api import local&lt;br /&gt;
local(&amp;#039;hostname&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simple Remote ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from fabric.api import env&lt;br /&gt;
from fabric.api import run&lt;br /&gt;
&lt;br /&gt;
env.host_string = &amp;#039;some_node&amp;#039;&lt;br /&gt;
env.user = &amp;#039;some_user&amp;#039;&lt;br /&gt;
env.password = &amp;#039;some_pass&amp;#039;&lt;br /&gt;
run(&amp;#039;hostname&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kind of ugly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from fabric.api import env&lt;br /&gt;
from fabric.api import settings&lt;br /&gt;
from fabric.api import run&lt;br /&gt;
&lt;br /&gt;
crash_host = {&amp;#039;host_string&amp;#039;: &amp;#039;some-node&amp;#039;,&lt;br /&gt;
                              &amp;#039;user&amp;#039;: &amp;#039;root&amp;#039;,&lt;br /&gt;
                              &amp;#039;password&amp;#039;: &amp;#039;password&amp;#039;,&lt;br /&gt;
                              &amp;#039;command_timeout&amp;#039;: 10,&lt;br /&gt;
                              &amp;#039;connection_attempts&amp;#039;: 1,&lt;br /&gt;
                              &amp;#039;abort_on_prompts&amp;#039;: True}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with settings(**crash_host):&lt;br /&gt;
  run(&amp;#039;hostname&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handle a non zero return code ==&lt;br /&gt;
&lt;br /&gt;
Normally Fabric aborts the program on a failure, which is just stupid&lt;br /&gt;
&lt;br /&gt;
For all:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
env.warn_only = True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or per command:&lt;br /&gt;
 rc = run(&amp;#039;aaa&amp;#039;, warn_only=True)&lt;br /&gt;
 if rc.failed:&lt;br /&gt;
    print(&amp;quot;failure with {}&amp;quot;.format(rc.return_code))&lt;br /&gt;
 if rc.succeeded:&lt;br /&gt;
    print(&amp;quot;Happy&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== change directory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from fabric.api import env, run&lt;br /&gt;
from fabric.context_managers import cd&lt;br /&gt;
&lt;br /&gt;
env.host_string = &amp;#039;localhost&amp;#039;&lt;br /&gt;
&lt;br /&gt;
with cd(&amp;#039;welcome&amp;#039;):&lt;br /&gt;
    run(&amp;quot;echo &amp;#039;hi&amp;#039; &amp;gt; hello.txt&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ref: [https://stackoverflow.com/questions/10280984/how-to-set-the-working-directory-for-a-fabric-task]&lt;br /&gt;
&lt;br /&gt;
== Sample Put / Get ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
from fabric.api import env&lt;br /&gt;
from fabric.operations import run, put, get&lt;br /&gt;
&lt;br /&gt;
env.host_string = &amp;quot;somenode&amp;quot;&lt;br /&gt;
env.user = &amp;quot;user&amp;quot;&lt;br /&gt;
env.password = &amp;quot;password&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# put local file on remote node&lt;br /&gt;
put(&amp;#039;test.zip&amp;#039;, &amp;#039;/tmp/test.zip&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# copy remote file on local&lt;br /&gt;
get(&amp;#039;/tmp/test.zip&amp;#039;, &amp;#039;test2.zip&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# verify md5sum&lt;br /&gt;
run(&amp;#039;md5sum /tmp/test.zip&amp;#039;, timeout=1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
result = run(&amp;#039;pwd&amp;#039;)&lt;br /&gt;
print(result.return_code)&lt;br /&gt;
print(result)  # combined output&lt;br /&gt;
print(result.stdout)&lt;br /&gt;
print(result.stderr)&lt;br /&gt;
print(result.failed) # True or False&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Windows struggles, but this seemed to work:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from fabric import api as fab  # pylint: disable=import-error&lt;br /&gt;
from fabric.exceptions import CommandTimeout # Gets the class for CommandTimeout exception&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
fab_test_settings = fab.settings(&lt;br /&gt;
        host_string=&amp;#039;HOSTNAME&amp;#039;,&lt;br /&gt;
        user=&amp;#039;USER&amp;#039;,&lt;br /&gt;
        password=&amp;#039;PASSWORD&amp;#039;,&lt;br /&gt;
        abort_on_prompts=True,&lt;br /&gt;
        keepalive=30)&lt;br /&gt;
&lt;br /&gt;
with fab_test_settings:&lt;br /&gt;
    fab.run(&amp;#039;dir&amp;#039;, shell=False, pty=False, warn_only=False, timeout=None, quiet=False, stdout=sys.stdout, combine_stderr=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
https://docs.fabfile.org/en/1.14/api/core/operations.html&lt;br /&gt;
&lt;br /&gt;
run() also has a timeout in seconds&lt;br /&gt;
&lt;br /&gt;
 fabric.operations.run(command, shell=True, pty=True, combine_stderr=None, quiet=False, warn_only=False, stdout=None, stderr=None, timeout=None, shell_escape=None, capture_buffer_size=None)&lt;br /&gt;
&lt;br /&gt;
Other ENV paramters:&lt;br /&gt;
&lt;br /&gt;
 https://docs.fabfile.org/en/1.14/usage/env.html&lt;br /&gt;
&lt;br /&gt;
== Paramiko Logging ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import logging&lt;br /&gt;
logging.basicConfig(level=logging.DEBUG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lots of logs, but no logs during the actual copy.&lt;br /&gt;
&lt;br /&gt;
== keywords ==&lt;/div&gt;</summary>
		<author><name>Kenneth</name></author>
	</entry>
</feed>