Выполнение ротации бревна в составе рецепта шеф-повара

Я использую следующий рецепт для выполнения log rotation:

bash 'adding_logrotate_for_consul' do
  code <<-EOH
    echo "" >> /etc/logrotate.conf
    echo "/tmp/output.log {" >> /etc/logrotate.conf
    echo -e "\tsize 20M" >> /etc/logrotate.conf
    echo -e "\tcreate 700 root root" >> /etc/logrotate.conf
    echo -e "\trotate 3" >> /etc/logrotate.conf
    echo "}" >> /etc/logrotate.conf
  EOH
end

Приведенный выше код работает совершенно нормально, и он добавляет следующую запись в /etc/logrotate.conf

/tmp/output.log {
        size 20M
        create 700 root root
        rotate 3
}

Однако после добавления вышеуказанной записи с помощью chef мне приходится каждый раз вручную запускать на узле следующую команду:

logrotate -s /var/log/logstatus /etc/logrotate.conf

Как включить указанную выше команду в рецепт шеф-повара, чтобы ротация логов могла выполняться с использованием рецепта шеф-повара после того, как размер файла достиг 20М?

1 ответ

Решение

Я думаю, что здесь есть несколько вещей, которые вы делаете меньше, чем в идеале. Отпусти меня один за другим:

Я использую следующий рецепт для выполнения ротации журнала:

bash 'добавление_logrotate_for_consul' сделать код...

Это не хороший способ создания записи logrotate. У шеф-повара (и других инструментов оркестровки) есть очень хорошая функция, называемая идемпотентностью. Его основной смысл заключается в том, что вы можете запускать один и тот же рецепт много раз, и он будет только сходиться или "применять" себя, если это необходимо. Проблема, с которой вы столкнетесь при этом, заключается в том, что ваш блок кода будет запускаться КАЖДЫЙ раз, когда вы запускаете свою кулинарную книгу - поэтому после 5 запусков у вас будет 5 одинаковых записей в /etc/logrotate.conf. Это было бы не очень хорошо...

К счастью, есть гораздо лучшие способы делать то, что вы хотите сделать. Вы знакомы с супермаркетом Chef? Это сайт, где вы можете найти множество готовых кулинарных книг, чтобы расширить функциональность вашей кулинарной книги. Таким образом, для вашей текущей проблемы вы можете, например, использовать кулинарную книгу под названием logrotate. Как вы можете использовать его в своей собственной кулинарной книге? Вы должны включить его, добавив следующее в эти файлы:

BERKSFILE

source 'https://supermarket.chef.io'
metadata

METADATA.RB

depends 'logrotate'

Теперь ваша поваренная книга знает о поваренной книге "logrotate", и вы можете использовать предоставляемые ею ресурсы Chef. Таким образом, вы можете создать следующий рецепт:

logrotate_app 'app_with_logs' do
  path      '/tmp/output.log'
  options   ['size 20M']
  rotate    3
  create    '700 root adm'
end

Теперь, когда вы запустите свой рецепт, это создаст запись logrotate, только если она еще не существует. Handy! (обратите внимание, что это может создать запись в /etc/logrotate.d/ вместо /etc/logratate.conf. Это предпочтительный способ добавления записи logrotate).

К следующей части.

Как включить указанную выше команду в рецепт шеф-повара, чтобы ротация логов могла выполняться с использованием рецепта шеф-повара после того, как размер файла достиг 20М?

Logrotate как программа запускается автоматически, один раз в день. Когда он запускается, он проверяет все записи в /etc/logrotate.conf и /etc/logrotate.d/* и запускает их, если они удовлетворяют требованиям (в данном случае, размер 20M). Однако, поскольку он запускается только один раз в день, в зависимости от того, насколько быстро растет ваш журнал, к моменту его оценки и поворота он может быть намного больше, чем 20 миллионов!

Итак, теперь у вас есть два варианта. Либо, во-первых, позвольте logrotate работать так, как ожидается, и вращайте журнал один раз в день, если его размер превышает 20M. Или, во-вторых, вы можете сделать то, что вы хотите, и выполнить эту команду в рецепте шеф-повара, хотя это не будет хорошим способом сделать это. Но, для полноты, я расскажу вам, как вы можете запустить команду с Chef. Но помни! Это, опять же, НЕ будет идемпотентным. Таким образом, почему это не очень хороший способ сделать это!

Чтобы запустить команду из рецепта шеф-повара, используйте ресурс execute. Например:

execute 'rotate_my_log_because_I_cant_wait_24h' do
  command 'logrotate -s /var/log/logstatus /etc/logrotate.conf'
end

Это запустит эту команду на вашем узле. Но опять же, это не рекомендуемый способ сделать это.

Другие вопросы по тегам