fab
选项和参数¶
The most common method for utilizing Fabric is via its command-line tool,
fab
, which should have been placed on your shell’s executable path when
Fabric was installed. fab
tries hard to be a good Unix citizen, using a
standard style of command-line switches, help output, and so forth.
基本应用¶
In its most simple form, fab
may be called with no options at all, and
with one or more arguments, which should be task names, e.g.:
$ fab task1 task2
As detailed in 概览 & 教程 and Execution model, this will run task1
followed by task2
, assuming that Fabric was able to find a fabfile nearby
containing Python functions with those names.
However, it’s possible to expand this simple usage into something more flexible, by using the provided options and/or passing arguments to individual tasks.
直接执行远程命令¶
0.9.2 新版功能.
Fabric 还实现了一个鲜为人知的命令行接口,可以像下面这样调用:
$ fab [options] -- [shell command]
--
之后的所有字符都会用于创建一个 run
临时调用,是不是做为 fab
的参数解析。如果你在模块级或者命令行中设置了的主机列表参数,它的执行方式将类似单行的匿名任务。
例如:假设你想要获取多个系统的内核信息,可以这样做:
$ fab -H system1,system2,system3 -- uname -a
它的作用完全等价于下面的 fabfile:
from fabric.api import run
def anonymous():
run("uname -a")
像这样执行:
$ fab -H system1,system2,system3 anonymous
大多数情况下,你更愿意将(仅执行一次,不大会再度执行的)任务写入 fabfile,而该特性基于 fabfile 连接设置,提供了一个方便、快捷的 SSH 命令传输。
命令行参数¶
A quick overview of all possible command line options can be found via fab
--help
. If you’re looking for details on a specific option, we go into detail
below.
注解
fab
uses Python’s optparse library, meaning that it honors typical
Linux or GNU style short and long options, as well as freely mixing options
and arguments. E.g. fab task1 -H hostname task2 -i path/to/keyfile
is
just as valid as the more straightforward fab -H hostname -i
path/to/keyfile task1 task2
.
-
-a
,
--no_agent
¶
Sets env.no_agent to
True
, forcing our SSH layer not to talk to the SSH agent when trying to unlock private key files.0.9.1 新版功能.
-
-A
,
--forward-agent
¶
Sets env.forward_agent to
True
, enabling agent forwarding.1.4 新版功能.
-
--abort-on-prompts
¶
Sets env.abort_on_prompts to
True
, forcing Fabric to abort whenever it would prompt for input.1.1 新版功能.
-
-c
RCFILE
,
--config
=RCFILE
¶ Sets env.rcfile to the given file path, which Fabric will try to load on startup and use to update environment variables.
-
-d
COMMAND
,
--display
=COMMAND
¶ Prints the entire docstring for the given task, if there is one. Does not currently print out the task’s function signature, so descriptive docstrings are a good idea. (They’re always a good idea, of course – just moreso here.)
-
--connection-attempts
=M
,
-n
M
¶ Set number of times to attempt connections. Sets env.connection_attempts.
1.4 新版功能.
-
-D
,
--disable-known-hosts
¶
Sets env.disable_known_hosts to
True
, preventing Fabric from loading the user’s SSHknown_hosts
file.
-
-f
FABFILE
,
--fabfile
=FABFILE
¶ The fabfile name pattern to search for (defaults to
fabfile.py
), or alternately an explicit file path to load as the fabfile (e.g./path/to/my/fabfile.py
.)
-
-F
LIST_FORMAT
,
--list-format
=LIST_FORMAT
¶ Allows control over the output format of
--list
.short
is equivalent to--shortlist
,normal
is the same as simply omitting this option entirely (i.e. the default), andnested
prints out a nested namespace tree.1.1 新版功能.
-
-g
HOST
,
--gateway
=HOST
¶ Sets env.gateway to
HOST
host string.1.5 新版功能.
-
-h
,
--help
¶
Displays a standard help message, with all possible options and a brief overview of what they do, then exits.
-
--hide
=LEVELS
¶ A comma-separated list of output levels to hide by default.
-
-x
HOSTS
,
--exclude-hosts
=HOSTS
¶ Sets env.exclude_hosts to the given comma-delimited list of host strings to then keep out of the final host list.
1.1 新版功能.
-
-i
KEY_FILENAME
¶ When set to a file path, will load the given file as an SSH identity file (usually a private key.) This option may be repeated multiple times. Sets (or appends to) env.key_filename.
-
-I
,
--initial-password-prompt
¶
Forces a password prompt at the start of the session (after fabfile load and option parsing, but before executing any tasks) in order to pre-fill env.password.
This is useful for fire-and-forget runs (especially parallel sessions, in which runtime input is not possible) when setting the password via
--password
or by setting env.password in your fabfile, is undesirable.注解
The value entered into this prompt will overwrite anything supplied via env.password at module level, or via
--password
.
-
-k
¶
Sets env.no_keys to
True
, forcing the SSH layer to not look for SSH private key files in one’s home directory.0.9.1 新版功能.
-
--keepalive
=KEEPALIVE
¶ Sets env.keepalive to the given (integer) value, specifying an SSH keepalive interval.
1.1 新版功能.
-
--linewise
¶
Forces output to be buffered line-by-line instead of byte-by-byte. Often useful or required for parallel execution.
1.3 新版功能.
-
-l
,
--list
¶
Imports a fabfile as normal, but then prints a list of all discovered tasks and exits. Will also print the first line of each task’s docstring, if it has one, next to it (truncating if necessary.)
在 0.9.1 版更改: Added docstring to output.
-
-p
PASSWORD
,
--password
=PASSWORD
¶ Sets env.password to the given string; it will then be used as the default password when making SSH connections or calling the
sudo
program.
-
-P
,
--parallel
¶
Sets env.parallel to
True
, causing tasks to run in parallel.1.3 新版功能.
参见
-
--no-pty
¶
Sets env.always_use_pty to
False
, causing allrun
/sudo
calls to behave as if one had specifiedpty=False
.1.0 新版功能.
-
-r
,
--reject-unknown-hosts
¶
Sets env.reject_unknown_hosts to
True
, causing Fabric to abort when connecting to hosts not found in the user’s SSHknown_hosts
file.
-
--set
KEY=VALUE,...
¶ Allows you to set default values for arbitrary Fabric env vars. Values set this way have a low precedence – they will not override more specific env vars which are also specified on the command line. E.g.:
fab --set password=foo --password=bar
will result in
env.password = 'bar'
, not'foo'
Multiple
KEY=VALUE
pairs may be comma-separated, e.g.fab --set var1=val1,var2=val2
.Other than basic string values, you may also set env vars to True by omitting the
=VALUE
(e.g.fab --set KEY
), and you may set values to the empty string (and thus a False-equivalent value) by keeping the equals sign, but omittingVALUE
(e.g.fab --set KEY=
.)1.4 新版功能.
-
-s
SHELL
,
--shell
=SHELL
¶ Sets env.shell to the given string, overriding the default shell wrapper used to execute remote commands.
-
--shortlist
¶
Similar to
--list
, but without any embellishment, just task names separated by newlines with no indentation or docstrings.0.9.2 新版功能.
参见
-
--show
=LEVELS
¶ A comma-separated list of output levels to be added to those that are shown by default.
-
--ssh-config-path
¶
Sets env.ssh_config_path.
1.4 新版功能.
-
--skip-bad-hosts
¶
Sets env.skip_bad_hosts, causing Fabric to skip unavailable hosts.
1.4 新版功能.
-
--skip-unknown-tasks
¶
Sets env.skip_unknown_tasks, causing Fabric to skip unknown tasks.
-
--timeout
=N
,
-t
N
¶ Set connection timeout in seconds. Sets env.timeout.
1.4 新版功能.
-
--command-timeout
=N
,
-T
N
¶ Set remote command timeout in seconds. Sets env.command_timeout.
1.6 新版功能.
-
-u
USER
,
--user
=USER
¶ Sets env.user to the given string; it will then be used as the default username when making SSH connections.
-
-V
,
--version
¶
Displays Fabric’s version number, then exits.
-
-w
,
--warn-only
¶
Sets env.warn_only to
True
, causing Fabric to continue execution even when commands encounter error conditions.
-
-z
,
--pool-size
¶
Sets env.pool_size, which specifies how many processes to run concurrently during parallel execution.
1.3 新版功能.
参见
Per-task arguments¶
The options given in 命令行参数 apply to the invocation of
fab
as a whole; even if the order is mixed around, options still apply to
all given tasks equally. Additionally, since tasks are just Python functions,
it’s often desirable to pass in arguments to them at runtime.
Answering both these needs is the concept of “per-task arguments”, which is a special syntax you can tack onto the end of any task name:
- Use a colon (
:
) to separate the task name from its arguments; - Use commas (
,
) to separate arguments from one another (may be escaped by using a backslash, i.e.\,
); - Use equals signs (
=
) for keyword arguments, or omit them for positional arguments. May also be escaped with backslashes.
Additionally, since this process involves string parsing, all values will end up as Python strings, so plan accordingly. (We hope to improve upon this in future versions of Fabric, provided an intuitive syntax can be found.)
For example, a “create a new user” task might be defined like so (omitting most of the actual logic for brevity):
def new_user(username, admin='no', comment="No comment provided"):
print("New User (%s): %s" % (username, comment))
pass
You can specify just the username:
$ fab new_user:myusername
Or treat it as an explicit keyword argument:
$ fab new_user:username=myusername
If both args are given, you can again give them as positional args:
$ fab new_user:myusername,yes
Or mix and match, just like in Python:
$ fab new_user:myusername,admin=yes
The print
call above is useful for illustrating escaped commas, like
so:
$ fab new_user:myusername,admin=no,comment='Gary\, new developer (starts Monday)'
注解
Quoting the backslash-escaped comma is required, as not doing so will cause shell syntax errors. Quotes are also needed whenever an argument involves other shell-related characters such as spaces.
All of the above are translated into the expected Python function calls. For example, the last call above would become:
>>> new_user('myusername', admin='yes', comment='Gary, new developer (starts Monday)')
Roles and hosts¶
As mentioned in the section on task execution,
there are a handful of per-task keyword arguments (host
, hosts
,
role
and roles
) which do not actually map to the task functions
themselves, but are used for setting per-task host and/or role lists.
These special kwargs are removed from the args/kwargs sent to the task function itself; this is so that you don’t run into TypeErrors if your task doesn’t define the kwargs in question. (It also means that if you do define arguments with these names, you won’t be able to specify them in this manner – a regrettable but necessary sacrifice.)
注解
If both the plural and singular forms of these kwargs are given, the value of the plural will win out and the singular will be discarded.
When using the plural form of these arguments, one must use semicolons (;
)
since commas are already being used to separate arguments from one another.
Furthermore, since your shell is likely to consider semicolons a special
character, you’ll want to quote the host list string to prevent shell
interpretation, e.g.:
$ fab new_user:myusername,hosts="host1;host2"
Again, since the hosts
kwarg is removed from the argument list sent to the
new_user
task function, the actual Python invocation would be
new_user('myusername')
, and the function would be executed on a host list
of ['host1', 'host2']
.
配置文件¶
Fabric currently honors a simple user settings file, or fabricrc
(think
bashrc
but for fab
) which should contain one or more key-value pairs,
one per line. These lines will be subject to string.split('=')
, and thus
can currently only be used to specify string settings. Any such key-value pairs
will be used to update env when fab
runs, and is loaded prior
to the loading of any fabfile.
By default, Fabric looks for ~/.fabricrc
, and this may be overridden by
specifying the -c
flag to fab
.
For example, if your typical SSH login username differs from your workstation
username, and you don’t want to modify env.user
in a project’s fabfile
(possibly because you expect others to use it as well) you could write a
fabricrc
file like so:
user = ssh_user_name
Then, when running fab
, your fabfile would load up with env.user
set to
'ssh_user_name'
. Other users of that fabfile could do the same, allowing
the fabfile itself to be cleanly agnostic regarding the default username.