web-dev-qa-db-ja.com

ソルト管理されたファイルのみがディレクトリに残り、差分をクリーンに保つにはどうすればよいですか?

次のようなディレクトリを想定します。

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

ここで、hostAおよびhostBはsaltによって作成されます。 hostC以前にもsaltによって作成されましたが、それ以降は柱から削除され、不要になりました。現在の状態を表すファイルのみをディレクトリに含める必要があります。 clean: Trueのディレクトリを持つオプションがありますが、その結果、ハイステートするたびにディレクトリの完全な差分が表示されます-この場合は30の異なるファイルですすべてのハイステートで作成されます。そのため、行われた変更を確認するのは非常に困難です。これを回避する方法はありますか?

更新:現在の出力(疑似yaml)

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

私は期待します

- directory:
  - deleted: 
    - file: hostC
2
Tomáš Fejfar

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 %}
4
John Hazen

ディレクトリをclean:Trueにするオプションがありますが、これにより、ハイステートするたびにディレクトリの完全な差分が表示されます。この場合、ハイステートごとに30の異なるファイルが作成されます。そのため、行われた変更を確認するのは非常に困難です。これを回避する方法はありますか?

はい、方法は「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/
2
Chupaka

これは、構成管理ツールの「問題」です。存在するものの状態を定義しますが、オブジェクトのトラックを削除すると、オートメーションツールは何もしません。たとえば、ユーザーを作成するときにも同様の問題があります。ツールからユーザーを削除しても、サーバーからは削除されません。

存在させたいもののオブジェクト定義と削除したいもののブラックリストを作成する場合の解決策。私は柱を使ってユーザーを管理しています。新しいユーザーが必要な場合は、そのユーザーを柱のリストに追加します。ただし、ユーザーを削除したい場合は、ユーザーのブラックリストを用意しています。

同じファイルにすべてのサイトがある場合の別のオプション。一部の仮想ホストを削除すると、ファイルが更新され、Nginxが再起動します。サーバーを手動で管理する場合は、サイトごとに1つのファイルを使用するのが理にかなっていますが、構成管理ツールを使用する場合は問題ないと思います。

1
Diego Woitasen

file.recurseは、実際には2015.8の- clean: Trueで必要なことを正確に実行します。ソースパスにnotであるファイルのみを削除し、削除した不要なファイルのみを出力します。

0
savamane