Como posso garantir que apenas arquivos gerenciados por sal permaneçam no diretório e mantenham o diff limpo?

1

Assuma um diretório como este:

- etc/nginx/sites-available/
    - hostA
    - hostB
    - hostC

Onde hostA e hostB são criados por salt. O hostC foi criado anteriormente pelo sal também, mas desde então, ele foi removido do pilar e não é mais necessário. Eu quero o diretório para conter apenas arquivos que representam o estado atual. Existe a opção de ter o diretório com clean: True , mas isso resultará em um diff completo do diretório toda vez que eu estiver no estado - no nosso caso são 30 arquivos diferentes criados em todos os estados. Isso está dificultando muito a verificação das mudanças ocorridas. Existe alguma maneira de contornar isso?

Atualizar : saída atual (pseudo yaml)

- directory
  - deleted: 
    - file: hostA
    - file: hostB
    - file: hostC
- file
   - new file: hostA
- file
   - new file: hostB

Eu esperaria

- directory:
  - deleted: 
    - file: hostC
    
por Tomáš Fejfar 19.02.2016 / 13:40

3 respostas

2

Você pode obter uma listagem do diretório desejado chamando o módulo file.find e, como você tem uma lista dos arquivos que deseja gerenciar, é possível excluir os arquivos que não estão na lista de arquivos a serem gerenciados. .

Aqui está um código adaptado de um arquivo de estado que eu tive que gerenciar /etc/yum.repos.d. Eu vou assumir que seus arquivos para gerenciar são do pilar, e eles são chaves para um dict, com os valores sendo o resto dos dados que vão para renderizar o arquivo.

{% 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 %}
    
por 19.03.2016 / 08:31
1

Isso é "problema" com ferramentas de gerenciamento de configuração. Você define o estado das coisas que existem, mas se você remover a trilha de algum objeto, a ferramenta de automação não fará nada. Por exemplo, há um problema semelhante quando você cria usuários. Se você remover o usuário da ferramenta, ele não o removerá dos servidores.

A solução se para criar a definição de objeto para as coisas que você quer que exista e uma lista negra para as coisas que você deseja remover. Estou gerenciando usuários usando pilares. Se eu quiser um novo usuário, adiciono o usuário a uma lista no pilar. Mas se eu quiser remover um usuário, tenho uma lista negra para os usuários.

Outra opção no seu caso, basta ter todo o site no mesmo arquivo. Se você remover algum vhost, o arquivo será atualizado e o Nginx reiniciado. Ter um arquivo por site faz sentido quando você gerencia servidores manualmente, mas usando uma ferramenta de gerenciamento de configuração, acho que isso não importa.

    
por 21.02.2016 / 02:36
0

file.recurse realmente faz exatamente o que você quer com - clean: True em 2015.8. Ele excluirá somente os arquivos que não são não no caminho de origem e somente exibirá os arquivos indesejados removidos.

    
por 21.02.2016 / 14:32