我有许多文件需要以安全的方式传输到特定的奴才主机,我想使用Salt来自动执行该过程。但是,我在寻找实现主机受限传输的最佳方法时遇到了麻烦。
salt文件服务器非常适合非特定于主机的传输。但是,我需要传输的某些文件是特定于客户的,因此我需要确保只能从特定主机访问它们。假定Pillar是适用于奴才特定限制的理想人选,但我在弄清楚使用支柱作为来源指定文件传输的方式时遇到了麻烦。
据我所知,Pillar仅支持基于SLS的词典数据,不支持文件传输。我已经尝试过使用各种卷积(包括salt:// _ pillar / xxx)构造的路径进行file.managed状态规范的各种组合,但是到目前为止,除了SLS文件中定义的令牌数据之外,我无法访问任何其他内容。
有关如何执行此操作的任何建议?我假设安全的文件传输应该是一种普遍的需求,而不是编写自定义函数,因此应该有一种标准的传输方法。
答案 0 :(得分:0)
答案取决于您要保护的内容。如果所涉及的文件中只有一部分是“敏感的”(例如,配置文件中的密码),则可能要使用一个模板,将其从支柱中拉出:
# /srv/salt/app/files/app.conf.jinja
[global]
user = {{ salt['pillar.get']("app:user") }}
password = {{ salt['pillar.get']("app:password") }}
# ...and so on
在这种情况下,您无需担心爪牙是否可以访问模板本身。
如果涉及的整个文件都是敏感文件,那么我想想您要设置file_tree external pillar,并使用带有contents_pillar选项的file.managed。那不是我要处理的东西,所以我没有一个很好的例子。
答案 1 :(得分:0)
解决方案简介:使用PILLAR.FILE_TREE
A:在您的主服务器上,设置一个目录,您将从该目录中处理私有文件(例如:/ srv / salt / private)。
B:在下面创建一个“主机”子目录,然后在该目录下为每个将拥有私有文件的主机创建一个目录。
/ srv / salt / private / hosts / hostA
/ srv / salt / private / hosts / hostB
...,其中hostA和hostB是目标小兵的ID。
如果要使用节点组而不是主机ID,请参阅文档。
C:在主机目录下,包含您要通过支柱传输的所有文件。
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: True
E:创建一个盐状态文件来处理传输。
cat > /srv/salt/files/base/foo.sls << END
/tmp/pt_test:
file.managed:
- contents_pillar: testme
END
F:运行支柱刷新,然后运行状态命令:
salt hostA state.apply foo
在最后一步之后,hostA应该有一个名为/ tmp / pt_test的文件,其中包含文本“ I am Foo!”。