Python/Fabric: Difference between revisions
< Python
(No difference)
|
Latest revision as of 16:51, 3 January 2023
Fabric2
See Python/Fabric2
Simple Local
# local(command, capture=False, shell=None)
from fabric.api import local
local('hostname')
Simple Remote
from fabric.api import env
from fabric.api import run
env.host_string = 'some_node'
env.user = 'some_user'
env.password = 'some_pass'
run('hostname')
Kind of ugly:
from fabric.api import env
from fabric.api import settings
from fabric.api import run
crash_host = {'host_string': 'some-node',
'user': 'root',
'password': 'password',
'command_timeout': 10,
'connection_attempts': 1,
'abort_on_prompts': True}
with settings(**crash_host):
run('hostname')
Handle a non zero return code
Normally Fabric aborts the program on a failure, which is just stupid
For all:
env.warn_only = True
or per command:
rc = run('aaa', warn_only=True)
if rc.failed:
print("failure with {}".format(rc.return_code))
if rc.succeeded:
print("Happy")
change directory
from fabric.api import env, run
from fabric.context_managers import cd
env.host_string = 'localhost'
with cd('welcome'):
run("echo 'hi' > hello.txt")
ref: [1]
Sample Put / Get
#!/usr/bin/python
from fabric.api import env
from fabric.operations import run, put, get
env.host_string = "somenode"
env.user = "user"
env.password = "password"
# put local file on remote node
put('test.zip', '/tmp/test.zip')
# copy remote file on local
get('/tmp/test.zip', 'test2.zip')
# verify md5sum
run('md5sum /tmp/test.zip', timeout=1)
result = run('pwd')
print(result.return_code)
print(result) # combined output
print(result.stdout)
print(result.stderr)
print(result.failed) # True or False
Windows struggles, but this seemed to work:
from fabric import api as fab # pylint: disable=import-error
from fabric.exceptions import CommandTimeout # Gets the class for CommandTimeout exception
import sys
fab_test_settings = fab.settings(
host_string='HOSTNAME',
user='USER',
password='PASSWORD',
abort_on_prompts=True,
keepalive=30)
with fab_test_settings:
fab.run('dir', shell=False, pty=False, warn_only=False, timeout=None, quiet=False, stdout=sys.stdout, combine_stderr=True)
API
https://docs.fabfile.org/en/1.14/api/core/operations.html
run() also has a timeout in seconds
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)
Other ENV paramters:
https://docs.fabfile.org/en/1.14/usage/env.html
Paramiko Logging
import logging logging.basicConfig(level=logging.DEBUG)
Lots of logs, but no logs during the actual copy.