これは何
elasticsearchのindexを削除するときにはcuratorを使うと思うが、そのactionファイルがわかりにくく、大きくなりがちだったのでメモ。
curator はver 4での記法(ver3だとちょっと違うみたいなので注意)
curator action fileの基本の書き方
1から順番に実行される。
actions:
1:
action: delete_indices
description: "delete application log indices"
options:
disable_action: False
ignore_empty_list: True
filters:
- filtertype: pattern
kind: prefix
value: "application." # elasticsearchのindex名と"kind","value"設定が対応するようにする
exclude: False
- filtertype: age
source: creation_date
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: "30" # 30日残す設定
2:
action: delete_indices
description: "delete indices"
options:
disable_action: False
ignore_empty_list: True
filters:
- filtertype: pattern
kind: prefix
value: "application."
exclude: True # ここでexcludeしておかないと30日保存したいのに10日までになってしまう
- filtertype: kibana
exclude: True # kibanaを使っている場合には入れたほうがよい。.kibanaファイルが消えて、kibana indexを毎回登録しないといけなくなる。
- filtertype: age
source: creation_date
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 10
削除日数を細かく制御したい場合(ansible templateで解決)
上の例の1の記述のところみたいなのを並べて、さらに2のexcludeにも突っ込んでいかないといけない。コード量が増えて管理しづらい。
ansibleで配置するなら以下のようにすればvarsのリストに追加するだけで簡単。
- varsで以下のように設定する
CURATOR_DELETE_LIST: - { TARGET: "application." , DAYS: "30" } - { TARGET: "httpd.error." , DAYS: "30" } - { TARGET: "httpd.access.hoge." , DAYS: "7" } - { TARGET: "httpd.access.hoge." , DAYS: "7" }
loopでまわす
actions:
{# 明示的な削除対象のためのブロック-#}
{% for t in CURATOR_DELETE_LIST %}
{{ loop.index }}:
action: delete_indices
description: "delete {{ t.TARGET }} indices"
options:
disable_action: False
ignore_empty_list: True
filters:
- filtertype: pattern
kind: prefix
value: "{{ t.TARGET }}"
exclude: False
- filtertype: age
source: creation_date
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: "{{ t.DAYS }}"
{% endfor %}
{# .kibana を除くその他の index は 10 日間保持。最後のactionになるように99としておく。 #}
99:
action: delete_indices
description: "delete indices"
options:
disable_action: False
ignore_empty_list: True
filters:
{% for t in CURATOR_DELETE_LIST %}
- filtertype: pattern
kind: prefix
value: "{{ t.TARGET }}"
exclude: True
{% endfor %}
- filtertype: kibana
exclude: True
- filtertype: age
source: creation_date
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 10
もっとまとめて綺麗にできるかも。でもまあ役割ごとにブロックで分けれたからよし。