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 に吐き出されるようになっています。
-rw------- 1 root root 0 Mar 18 2015 /var/log/cron
-rw-r----- 1 root root 0 Feb 12 2017 /var/log/messages
Step 1. cron 実行・動作確認
以下の例では、設定したジョブが定期的に実行されることを確認するために、1分毎に /tmp/test.txt に TEST を書き込みます。 (1分毎に上書き)
*/1 * * * * echo "TEST" > /tmp/test.txt
Reload service Cron done
cron が実行されるまで待ちます。
・・・
2018-10-31T01:02:01.518679+00:00 vcsa-60 /usr/sbin/cron[16321]: (root) CMD (echo "TEST" > /tmp/test.txt)
エラーなく、実行されたら実際にファイルが存在することとファイルの中身を確認します。
-rw------- 1 root root 5 Oct 31 10:02 /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 に吐き出されるようになっています。
-rw------- 1 root root 0 10月 22 2016 /var/log/cron
Step 1. cron 実行・動作確認
以下の例では、設定したジョブが定期的に実行されることを確認するために、1分毎に /tmp/test.txt に TEST を書き込みます。 (1分毎に上書き)
*/1 * * * * echo "TEST" > /tmp/test.txt
cron が実行されるまで待つと PAM エラーを吐きます。
・・・
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 認証方式を パスワード認証 から システム認証 に変更します。
#
# 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
#
# 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 が実行されるまで待ちます。
・・・
2018-10-31T00:38:01.624789+00:00 vcsa-65 CROND[26906]: (root) CMD (echo "TEST" > /tmp/test.txt)
エラーなく、実行されたら実際にファイルが存在することとファイルの中身を確認します。
-rw-r--r-- 1 root root 5 10月 31 00:38 /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 に吐き出されるようになっています。
-rw------- 1 root root 0 10月 22 2016 /var/log/cron
ls: cannot access '/var/log/messages*': No such file or directory
Step 1. cron 実行・動作確認
以下の例では、設定したジョブが定期的に実行されることを確認するために、1分毎に /tmp/test.txt に TEST を書き込みます。 (1分毎に上書き)
*/1 * * * * echo "TEST" > /tmp/test.txt
cron が実行されるまで待つと PAM エラーを吐きます。
・・・
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 です。
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 と同じように見えますが、よく見るとちょっと違います。
#
# 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
#
# 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 が実行されるまで待ちます。
・・・
2018-10-31T01:30:01.152937+00:00 vcsa-67 CROND[49793]: (root) CMD (echo "TEST" > /tmp/test.txt)
エラーなく、実行されたら実際にファイルが存在することとファイルの中身を確認します。
-rw-r--r-- 1 root root 5 Oct 31 10:30 /tmp/test.txt
TEST
実際に使う cron ジョブを仕込む
一通りテストが終わって、cron が問題なく実行されることが分かったら 実際にスケジューリングして定期的に実行させる「コマンド、またはスクリプト」をジョブとして登録します。
以下の例では、毎朝 5:30 に vSphere Web Client サービスを再起動 (停止 → 成功したら → 起動) させます。
30 5 * * * service-control --stop vsphere-client && service-control --start vsphere-client > /dev/null 2>&1
vCSA 6.7 では、再起動用のオプションが使えるようになったので、--restart でも構いません。
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 による定期実行 でした。