Назад | Перейти на главную страницу

Как я могу гарантировать, что в каталоге остаются только файлы, управляемые солью, и поддерживать чистоту diff?

Предположим, что такой каталог:

- 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. Удаляются только те файлы, которые не в исходном пути и выводить только ненужные файлы, которые он удалил.