假设一个像这样的目录:
- etc/nginx/sites-available/ - hostA - hostB - hostC
hostA和hostB是由salt创build的。 hostC也是早先由salt创build的,但是因为它已经从柱子上移除了,不再需要了。 我希望目录只包含代表当前状态的文件。 有一个选项可以让目录的clean: True ,但是这会导致在每次highstate时都会看到完全不同的目录 – 在我们的例子中,每个highstate都创build了30个不同的文件。 这使得很难检查发生的变化。 有什么办法可以解决这个问题吗?
更新 :当前输出(伪yaml)
- directory - deleted: - file: hostA - file: hostB - file: hostC - file - new file: hostA - file - new file: hostB
我期望
- directory: - deleted: - file: hostC
您可以通过调用file.find模块获取所需目录的列表,并且由于您有要pipe理的文件的列表,因此可以删除不在要pipe理的文件列表中的文件。
这里有一些代码是从我必须pipe理/etc/yum.repos.d的状态文件改编的。 我将假定您的文件是从支柱上进行pipe理的,而且它们是字典的关键,其中的值是用于呈现文件的其余数据。
{% set site_dir = '/etc/nginx/sites-available/' %} {% set sites = salt['pillar.get']('nginx_sites',{}) %} {% set site_files = salt['file.find'](site_dir,type='f',print='name',maxdepth=0) %} {% for site_file in site_files %} {% if site_file not in sites %} delete-old-{{ site_file }}: file.absent: - name: {{ site_dir }}/{{ site_file }} {% endif %} {% endfor %} {# then go through the sites and manage the files... #} {% for site in sites %} manage-site-file-{{ site_file }}: file.managed: - name: {{ site_dir }}/{{ site }} - source: salt://nginx/files/site-file.conf - template: jinja {% endfor %}
这是configurationpipe理工具的“问题”。 您可以定义存在的事物的状态,但是如果删除某个对象的轨迹,自动化工具将不会执行任何操作。 例如,创build用户时也有类似的问题。 如果从工具中删除用户,则不会将其从服务器中删除。
解决scheme是为想要存在的事物创build对象定义,并为要删除的事物创build一个黑名单。 我正在使用支柱pipe理用户。 如果我想要一个新用户,我将用户添加到支柱中的列表中。 但是,如果我想删除一个用户,我有一个用户的黑名单。
在你的情况下,如果只是在同一个文件中的所有网站的另一个选项。 如果你删除了一些虚拟主机,这个文件将会被更新,Nginx会重新启动。 每个站点有一个文件是有意义的,当你手动pipe理服务器,但使用configurationpipe理工具,我认为这并不重要。
file.recurse实际上正是你想要的- clean: True 2015.8 - clean: True 。 它只会删除不在源path中的文件,只输出不需要的文件。