Techioz Blog

Chef cron リソースを通じて作成されていない、すでに存在する root cron からエントリを削除する方法

概要

私の cron エントリ:

[root@server1 ~]# cat /var/spool/cron/root
0 21 * * * /bin/bash -c "sleep $[RANDOM \% 60 + 1]m"; nice -n 10 /opt/snow/snowagent -w /opt/snow/ >/dev/null 2>&1
# Chef Name: account_lister_clean
0 12,23 * * * rm -f /opt/scripts/acct_list_run_once
# Chef Name: logger_cron
0 0 * * * /opt/unx_logger.sh

=======================================

Chef を使用して以下の行だけを削除したかったのです。

0 21 * * * /bin/bash -c "sleep $[RANDOM \% 60 + 1]m"; nice -n 10 /opt/snow/snowagent -w /opt/snow/ >/dev/null 2>&1

========================================

delete_lines 'remove snow agent cron at 22:00' do
        path '/var/spool/cron/root'
        pattern '^*/opt/snow/snowagent'
end

以下のようなエラーが発生しました。特に、04:00 に開始する同じ cron を作成しているため、22:00 に開始する /opt/snow/snowagent を削除する必要があるパターンは何でしょうか。 04:00に実行されるものは削除したくありません。

NoMethodError
-------------
undefined method `delete_lines' for cookbook: test_lnx_slm9upgrade, recipe: install_slm9 :Chef::Recipe

解決策

delete_lines がないようです。インポートし損ねた可能性があります。

その間、私はそれを行うための簡単な解決策を見つけました

ruby_block 'remove snow agent' do
  block do
    rc = Chef::Util::FileEdit.new('/etc/hosts')
    rc.search_file_delete_line(/\/opt\/snow\/snowagent/, '')
    rc.write_file
  end
end

詳細については、https://rubydoc.info/gems/chef/Chef/Util/FileEdit#search_file_delete_line-instance_method を参照してください。