我试图让salt自动将文件部署给用户'主目录(创建它们之后)。目录结构(在file_roots
下面)如下:
users/
init.sls
user_list.jinja
files/
userX/
some_dir_I_want_deployed_to_userX_homedir/
some_script_I_want_deployed.sh
etc
user_list.jinja
有一个用户列表。我们的想法是,如果在userX
下有files/
的目录,则应将该目录子树部署到userX的主页。但是,如果他们没有任何要部署的东西,我宁愿不必为userY
等创建空目录,所以我试图测试目录的存在以避免错误
以下是users/init.sls
的相关摘录:
{% from "users/user_list.jinja" import users with context %}
{% for name, user in users.items() %}
{% set files_path = '{0}/files/{1}'.format(salt['file.dirname'](tplpath), name) %}
{% if salt['file.directory_exists'](files_path) %}
{{ user.home }}:
file.recurse:
- source: salt://users/files/{{ name }}
- user: {{ name }}
- group: {{ name }}
{% endif %}
{% endfor %}
通过一些调试(这对于弄清楚上面的内容是非常必要的),我已经知道这是鸡与蛋的情况,即:
file.directory_exists
测试是针对小兵(那是公平的)/var/cache/salt/minion/file
下的本地缓存中)在状态中引用的项目(更可能的是,minions只请求他们看到引用的东西)。users/files/userX
的目录子树,file.directory_exists
会返回False
,这意味着在Jinja渲染过程中,以{{ user.home }}
开头的整个部分将被抑制;因此它没有被引用,并且副本(对于minion的本地缓存)永远不会发生。如果我在minion上为users/files/userX
手动创建一个空的目录结构,一切都会开始工作。这告诉我,我的理论至少部分正确。
我可以"感觉"我在这里做错了(整个事情感觉过于程序化)。实现这一目标的最佳方法是什么?该要求本身似乎太牵强附会。
答案 0 :(得分:1)
执行此操作的更多方法是在支柱数据中包含一些数据并检查该密钥是否存在。像user.enabled之类的东西。但是,这需要您将设置保存在2个位置,支柱和file_roots中。
您不想检查minion服务器上是否存在目录,您要检查文件根目录中是否存在该文件。
不幸的是,我不认为可以在salt:// scheme下检查文件是否存在。如果我错了,那么您所要做的就是用检查file_root文件存在的语法替换对目录存在的检查。
更多的salt-ish方法是定义在支柱数据中的每台机器上启用/禁用哪些用户,并使用用户模块将它们添加到系统中。
https://github.com/saltstack-formulas/users-formula
您可以添加到标准用户公式所给出的标准支柱,并输入一个说明同步文件的密钥
#pillar
users:
ausername:
fullname: A User
syncfiles: True
busername:
fullname: B User
syncfiles: False
#state
{% for name, user in pillar.get('users', {}).items() if user.absent is not defined or not user.absent %}
{% if user.syncfiles %}
/home/{{ user.username }}:
file.recurse:
- source: salt://users/files/{{ user.username }}
- user: {{ user.username }}
{% if user.prime_group %}
- group: {{ user.prime_group.name }}
{% endif %}
{% endif %}
{% endfor %}
实际上,标准用户公式已经处理了预填充文件。我会使用那个公式。我知道它在2个地方跟踪数据,但你可以获得利用已经建立的状态文件的好处。