Salt内置一个简单的文件服务器用于分发文件给Salt minions. 文件服务器是一个构建于Salt master的无状态的ZeroMQ服务器。
Salt文件服务器的主要意图是使用在Salt state系统中展示文件的。这样看来,Salt文件服务器可以用于任何master到minions的通用文件传输。
The cp module is the home of minion side file server operations. The cp module is used by the Salt state system, salt-cp, and can be used to distribute files presented by the Salt file server.
The salt://
url format can potentially contain a query string, for example
salt://dir/file.txt?saltenv=base
. You can prevent the fileclient/fileserver from
interpreting ?
as the initial token of a query string by referencing the file
with salt://|
rather than salt://
.
/etc/marathon/conf/?checkpoint:
file.managed:
- source: salt://|hw/config/?checkpoint
- makedirs: True
Since the file server is made to work with the Salt state system, it supports environments. The environments are defined in the master config file and when referencing an environment the file specified will be based on the root directory of the environment.
cp.get_file功能可以用于minion从master下载一个文件,该语法像这样:
# salt '*' cp.get_file salt://vimrc /etc/vimrc
该指令将会通知所有Salt minions下载vimrc文件并且拷贝到/etc/vimrc
模板渲染功能可以同时在源和目标文件启用,命名像这样:
# salt '*' cp.get_file "salt://{{grains.os}}/vimrc" /etc/vimrc template=jinja
该范例将会通知所有Salt minions下载vimrc从同名目录名下载,作为他们的OS grain并且拷贝到/etc/vimrc
For larger files, the cp.get_file module also supports gzip compression. Because gzip is CPU-intensive, this should only be used in scenarios where the compression ratio is very high (e.g. pretty-printed JSON or YAML files).
To use compression, use the gzip
named argument. Valid values are integers
from 1 to 9, where 1 is the lightest compression and 9 the heaviest. In other
words, 1 uses the least CPU on the master (and minion), while 9 uses the most.
# salt '*' cp.get_file salt://vimrc /etc/vimrc gzip=5
Finally, note that by default cp.get_file does not create new destination
directories if they do not exist. To change this, use the makedirs
argument:
# salt '*' cp.get_file salt://vimrc /etc/vim/vimrc makedirs=True
In this example, /etc/vim/ would be created if it didn't already exist.
The cp.get_dir function can be used on the minion to download an entire directory from the master. The syntax is very similar to get_file:
# salt '*' cp.get_dir salt://etc/apache2 /etc
cp.get_dir supports template rendering and gzip compression arguments just like get_file:
# salt '*' cp.get_dir salt://etc/{{pillar.webserver}} /etc gzip=5 template=jinja
A client API is available which allows for modules and applications to be written which make use of the Salt file server.
The file server uses the same authentication and encryption used by the rest of the Salt system for network communication.
The FileClient class is used to set up the communication from the minion to
the master. When creating a FileClient object the minion configuration needs
to be passed in. When using the FileClient from within a minion module the
built in __opts__
data can be passed:
import salt.minion
def get_file(path, dest, saltenv='base'):
'''
Used to get a single file from the Salt master
CLI Example:
salt '*' cp.get_file salt://vimrc /etc/vimrc
'''
# Create the FileClient object
client = salt.minion.FileClient(__opts__)
# Call get_file
return client.get_file(path, dest, False, saltenv)
Using the FileClient class outside of a minion module where the __opts__
data is not available, it needs to be generated:
import salt.minion
import salt.config
def get_file(path, dest, saltenv='base'):
'''
Used to get a single file from the Salt master
'''
# Get the configuration data
opts = salt.config.minion_config('/etc/salt/minion')
# Create the FileClient object
client = salt.minion.FileClient(opts)
# Call get_file
return client.get_file(path, dest, False, saltenv)