vCSA のバージョンによっては cron で仕込んだジョブが動かない

cron は、設定した時間になったら定期的にコマンドを実行してくれるので Linux 触ってる人なら普通に使ってると思いますが、vCSA の中でジョブを仕込もうとする人は少ないのではないかと。

cron の設定方法については検索すると山ほど出てくるので割愛しますが、

vCSA のバージョンによっては、今まで通りにジョブを仕込んでも動かない場合があるため、そこを何とかしてジョブを実行させることに焦点を当てます。

基本的には、cron デーモン用の PAM のシステム認証 「/etc/pam.d/crond」 設定を変更することで解決できますが、vCSA のバージョンによってデフォルト設定値が異なるため、設定箇所も微妙に変わります。

また、vCSA のバージョンによっても cron ログの出力先が異なるため、そこも一緒に確認しながら作業を実施します。

Linux のディストリビューションによっては、crontab -e で設定するだけで、cron サービスの再起動が不要だったりしますが、反映されない場合もあるので、ジョブを確実に実行させるために、crontab を修正した場合は、cron サービスを reload、または restart するようにします。

vCSA 6.0 : cron 設定

vCSA 6.0 の場合は、PAM 設定を変更しなくても普通に cron 設定したジョブが実行されます。

  • OS : SUSE Enterprise Linux 11
  • cron ログの出力先 : /var/log/messages.log

/var/log/cron/var/log/messages は存在するものの、使われておらず、cron ログはデフォルトで /var/log/messages.log に吐き出されるようになっています。

参考 : ログファイル確認 (使われない)
1
2
3
4
5
# ls -l /var/log/cron
-rw------- 1 root root 0 Mar 18  2015 /var/log/cron

# ls -l /var/log/messages
-rw-r----- 1 root root 0 Feb 12  2017 /var/log/messages

Step 1. cron 実行・動作確認

以下の例では、設定したジョブが定期的に実行されることを確認するために、1分毎に /tmp/test.txtTEST を書き込みます。 (1分毎に上書き)

cron 設定 (動作テスト用)
1
2
3
4
5
# crontab -e
*/1 * * * * echo "TEST" > /tmp/test.txt

# service cron reload
Reload service Cron                done

cron が実行されるまで待ちます。

cron 実行待ち
1
2
3
# tail -f /var/log/messages.log
・・・
2018-10-31T01:02:01.518679+00:00 vcsa-60 /usr/sbin/cron[16321]: (root) CMD (echo "TEST" > /tmp/test.txt)

エラーなく、実行されたら実際にファイルが存在することとファイルの中身を確認します。

cron 実行語の正常性確認
1
2
3
4
5
# ls -l /tmp/test.txt
-rw------- 1 root root 5 Oct 31 10:02 /tmp/test.txt

# cat /tmp/test.txt
TEST

vCSA 6.5 : cron 設定

vCSA 6.5 の場合は、cron 設定したジョブを実行させるために、PAM 設定を変更する必要があります。

  • OS : VMware Photon Linux 1.0
  • cron ログの出力先 : /var/log/messages

/var/log/cron は存在するものの、使われておらず、cron ログはデフォルトで /var/log/messages に吐き出されるようになっています。

参考 : ログファイル確認 (使われない)
1
2
# ls -l /var/log/cron
-rw------- 1 root root 0 10月 22  2016 /var/log/cron

Step 1. cron 実行・動作確認

以下の例では、設定したジョブが定期的に実行されることを確認するために、1分毎に /tmp/test.txtTEST を書き込みます。 (1分毎に上書き)

cron 設定 (動作テスト用)
1
2
3
4
# crontab -e
*/1 * * * * echo "TEST" > /tmp/test.txt

# systemctl reload crond

cron が実行されるまで待つと PAM エラーを吐きます。

cron 実行待ち
1
2
3
4
5
# tail -f /var/log/messages
・・・
2018-10-31T00:32:01.540362+00:00 vcsa-65 crond[20510]: PAM _pam_load_conf_file: unable to open config for password-auth
2018-10-31T00:32:01.540398+00:00 vcsa-65 crond[20510]: (root) PAM ERROR (Permission denied)
2018-10-31T00:32:01.540444+00:00 vcsa-65 crond[20510]: (root) FAILED to authorize user with PAM (Permission denied)

Step 2. cron デーモンの PAM 認証方式変更

crond の PAM 認証方式を パスワード認証 から システム認証 に変更します。

/etc/pam.d/crond (変更前)
01
02
03
04
05
06
07
08
09
10
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account    required   pam_access.so
account    include    password-auth
session    required   pam_loginuid.so
session    include    password-auth
auth       include    password-auth
/etc/pam.d/crond (変更後)
01
02
03
04
05
06
07
08
09
10
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account    required   pam_access.so
account    include    system-auth
session    required   pam_loginuid.so
session    include    system-auth
auth       include    system-auth

/etc/pam.d/crond 修正後、cron デーモンの再起動等は不要です。

Step 3. cron 実行・動作確認

後は、cron が実行されるまで待ちます。

cron 実行待ち
1
2
3
# tail -f /var/log/messages
・・・
2018-10-31T00:38:01.624789+00:00 vcsa-65 CROND[26906]: (root) CMD (echo "TEST" > /tmp/test.txt)

エラーなく、実行されたら実際にファイルが存在することとファイルの中身を確認します。

cron 実行語の正常性確認
1
2
3
4
5
# ls -l /tmp/test.txt
-rw-r--r-- 1 root root 5 10月 31 00:38 /tmp/test.txt

# cat /tmp/test.txt
TEST

vCSA 6.7 : cron 設定

vCSA 6.7 の場合も、cron 設定したジョブを実行させるために、PAM 設定を変更する必要があります。

  • OS : VMware Photon Linux 1.0
  • cron ログの出力先 : /var/log/vmware/messages.1

/var/log/cron は存在するものの、使われておらず、/var/log/messages* も存在しません。

cron ログはデフォルトで /var/log/vmware/messages.1 に吐き出されるようになっています。

参考 : ログファイル確認 (使われない)
1
2
3
4
5
# ls -l /var/log/cron
-rw------- 1 root root 0 10月 22  2016 /var/log/cron

# ls -l /var/log/messages*
ls: cannot access '/var/log/messages*': No such file or directory

Step 1. cron 実行・動作確認

以下の例では、設定したジョブが定期的に実行されることを確認するために、1分毎に /tmp/test.txtTEST を書き込みます。 (1分毎に上書き)

cron 設定 (動作テスト用)
1
2
3
4
# crontab -e
*/1 * * * * echo "TEST" > /tmp/test.txt

# systemctl reload crond

cron が実行されるまで待つと PAM エラーを吐きます。

cron 実行待ち
1
2
3
4
5
# tail -f /var/log/vmware/messages.1
・・・
2018-10-31T01:26:01.436293+00:00 vcsa-67 crond[48819]: pam_unix(crond:account): expired password for user root (root enforced)
2018-10-31T01:26:01.436382+00:00 vcsa-67 crond[48819]: (root) PAM ERROR (Authentication token is no longer valid; new one required)
2018-10-31T01:26:01.436432+00:00 vcsa-67 crond[48819]: (root) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)

ちなみに、/var/log/vmware は Symbolic Link です。

/var/log/vmware リンク先のパス確認
1
2
# ls -l /var/log/vmware
lrwxrwxrwx 1 root root 19 Jul  3 11:11 /var/log/vmware -> /storage/log/vmware

Step 2. cron デーモンの PAM 認証方式変更

vCSA 6.5 と同じように、crond の PAM 認証方式を パスワード認証 から システム認証 に変更します。

ぱっと見、変更前のデフォルト設定は、6.5 と同じように見えますが、よく見るとちょっと違います。

/etc/pam.d/crond (変更前)
01
02
03
04
05
06
07
08
09
10
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account    required   pam_access.so
account    include    system-account
session    required   pam_loginuid.so
session    include    system-session
auth       include    system-auth
/etc/pam.d/crond (変更後)
01
02
03
04
05
06
07
08
09
10
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account    required   pam_access.so
account    include    system-auth
session    required   pam_loginuid.so
session    include    system-auth
auth       include    system-auth

/etc/pam.d/crond 修正後、cron デーモンの再起動等は不要です。

Step 3. cron 実行・動作確認

後は、cron が実行されるまで待ちます。

cron 実行待ち
1
2
3
# tail -f /var/log/vmware/messages.1
・・・
2018-10-31T01:30:01.152937+00:00 vcsa-67 CROND[49793]: (root) CMD (echo "TEST" > /tmp/test.txt)

エラーなく、実行されたら実際にファイルが存在することとファイルの中身を確認します。

cron 実行語の正常性確認
1
2
3
4
5
# ls -l /tmp/test.txt
-rw-r--r-- 1 root root 5 Oct 31 10:30 /tmp/test.txt

# cat /tmp/test.txt
TEST

実際に使う cron ジョブを仕込む

一通りテストが終わって、cron が問題なく実行されることが分かったら 実際にスケジューリングして定期的に実行させる「コマンド、またはスクリプト」をジョブとして登録します。

以下の例では、毎朝 5:30 に vSphere Web Client サービスを再起動 (停止 → 成功したら → 起動) させます。

vCSA 6.0 / 6.5 / 6.7 共通 : 停止 → 起動
1
2
# crontab -e
30 5 * * * service-control --stop vsphere-client && service-control --start vsphere-client > /dev/null 2>&1

vCSA 6.7 では、再起動用のオプションが使えるようになったので、--restart でも構いません。

vCSA 6.7 : --restart で再起動
1
2
# crontab -e
30 5 * * * service-control --restart vsphere-client > /dev/null 2>&1

終わりに

vCSA 6.0 の場合は、使い続けると Web Client で vCenter にログインした時に 何故かインベントリ階層が全く見えなくなる (仮想マシン・ポートグループ・データストアなど全く見えない) ことがあります。

そういった場合は、インベントリサービス (vmware-invsvc) を再起動すると直るので、毎週土日とか誰も使わない時間帯にインベントリサービスを再起動するように設定するのも良いかもしれません。

cron ログの吐き先が「/var/log/messages.log」だったり、「/var/log/messages」だったり、「/var/log/vmware/messages.1」だったり紛らわしいので、vCSA 6.0 (SUSE) はさて置いて、少なくとも 6.5 以降の VMware Photon では 統一してほしいなと思いました。

また、タイムゾーンが UTC になっていると cron が意図した時間に実行されないので、必要に応じて、タイムゾーンを JST (UTC+9) に変更してください。 (変更後には、rsyslogd の再起動も必要)

以上、vCenter Server Appliance : cron による定期実行 でした。