我有许多文件需要以安全的方式传输到特定的minion主机,我想使用Salt自动执行该过程。但是,我在找出实现主机限制传输的最佳方法时遇到了麻烦。
salt文件服务器非常适合非特定于主机的传输。但是,我需要传输的一些文件是特定于客户的,因此我需要确保只能从特定的主机访问它们。假设Pillar将是minion特定限制的理想候选者,但我在找出一种使用pillar作为源指定文件传输的方法时遇到了麻烦。
据我所知,Pillar只支持基于SLS的字典数据,不支持文件传输。我尝试过使用各种卷积构造路径的file.managed状态规范的各种组合(包括salt://_pillar/xxx),但到目前为止,除了在SLS文件中定义的令牌数据之外,我还不能访问任何其他内容。
对如何做到这一点有什么建议吗?我假设安全的文件传输应该是一个足够普遍的需求,应该有一个标准的方法来完成它,而不是编写一个自定义函数。
发布于 2018-10-26 08:57:10
答案取决于你到底想要保护什么。如果只有一部分文件是“敏感”的(例如配置文件中的密码),那么您可能需要使用一个模板,将敏感部分从pillar中拉入:
# /srv/salt/app/files/app.conf.jinja
[global]
user = {{ salt['pillar.get']("app:user") }}
password = {{ salt['pillar.get']("app:password") }}
# ...and so on在这种情况下,您不需要关心模板本身是否可以被minion访问。
如果涉及的整个文件都是敏感的,那么我认为您应该设置file_tree external pillar,并将file.managed与contents_pillar选项一起使用。这不是我用过的东西,所以我没有一个好的例子。
发布于 2018-10-27 03:56:57
解决方案概要:使用PILLAR.FILE_TREE
答:在您的主机上,设置一个目录,您将从中为私有文件提供服务(例如: /srv/salt/ private )。
B:在该目录下创建一个“hosts”子目录,然后在该目录下为每个将拥有私有文件的主机创建一个目录。
C:在host目录下,包含您想要通过pillar传输的任何文件。
echo “I am Foo\!” > /srv/salt/private/hosts/hostA/testme D:在您的主配置文件(例如: /etc/salt/ master )中,包含以下一节:
ext_pillar:
- file_tree:
root_dir: /srv/salt/private
follow_dir_links: False
keep_newline: True
debug: TrueE:创建一个salt状态文件来处理传输。
cat > /srv/salt/files/base/foo.sls << END
/tmp/pt_test:
file.managed:
- contents_pillar: testme
ENDF:运行command refresh,然后运行state命令:
salt hostA state.apply foo在最后一步之后,hostA应该有一个名为/tmp/pt_test的文件,其中包含文本“I am Foo!”。
https://stackoverflow.com/questions/52998970
复制相似问题