Предположим, что такой каталог:
- etc/nginx/sites-available/
- hostA
- hostB
- hostC
куда hostA и hostB создаются солью. hostC ранее был создан солью, но с тех пор она была удалена из столба и больше не нужна. Я хочу, чтобы каталог содержал только файлы, представляющие текущее состояние. Есть возможность иметь каталог с clean: True
, но это приведет к отображению полная разница в каталоге каждый раз, когда я использую highstate - в нашем случае это 30 разных файлов, созданных на каждом highstate. Из-за этого очень сложно проверить произошедшие изменения. Есть ли способ обойти это?
Обновить: текущий вывод (псевдо-ямл)
- directory
- deleted:
- file: hostA
- file: hostB
- file: hostC
- file
- new file: hostA
- file
- new file: hostB
Я ожидал
- directory:
- deleted:
- file: hostC
Вы можете получить список желаемого каталога, вызвав file.find
модуль, и поскольку у вас есть список файлов, которыми вы хотите управлять, вы можете удалить файлы, которых нет в списке файлов для управления.
Вот код, адаптированный из файла состояния, которым мне пришлось управлять /etc/yum.repos.d. Я предполагаю, что ваши файлы для управления взяты из столба, и они являются ключами к dict, а значениями являются остальные данные, которые используются для рендеринга файла.
{% 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 %}
Существует возможность иметь каталог с clean: True, но это приведет к тому, что каждый раз, когда я буду использовать highstate, будет отображаться полное различие каталога - в нашем случае это 30 различных файлов, созданных на каждом highstate. Из-за этого очень сложно проверить произошедшие изменения. Есть ли способ обойти это?
Да, можно использовать "require: - your_file_states" или "require_in: - directory_state". file.directory удалит все файлы, кроме необходимых.
/etc/nginx/sites-available/:
file.directory:
- clean: True
/etc/nginx/sites-available/hostA:
file.managed:
- require:
- /etc/nginx/sites-available/
/etc/nginx/sites-available/hostB:
file.managed:
- require:
- /etc/nginx/sites-available/
Это «проблема» с инструментами управления конфигурацией. Вы определяете состояние вещей, которые существуют, но если вы удалите след какого-то объекта, инструмент автоматизации ничего не сделает. Например, аналогичная проблема возникает при создании пользователей. Если вы удалите пользователя из инструмента, он не удалит его с серверов.
Решение, если создать определение объекта для вещей, которые вы хотите существовать, и черный список для вещей, которые вы хотите удалить. Я управляю пользователями с помощью столбов. Если мне нужен новый пользователь, я добавляю его в список в столбце. Но если я хочу удалить пользователя, у меня есть черный список для пользователей.
Другой вариант в вашем случае, если просто все сайты в одном файле. Если вы удалите какой-то vhost, файл будет обновлен и Nginx перезапустится. Когда вы управляете серверами вручную, имеет смысл иметь один файл на сайт, но я думаю, что при использовании инструмента управления конфигурацией это не имеет значения.
file.recurse
на самом деле делает именно то, что вы хотите, с - clean: True
в 2015. 8. Удаляются только те файлы, которые не в исходном пути и выводить только ненужные файлы, которые он удалил.