とても初歩的なことでハマってしまったので、今後忘れないためにもしっかり書いておく。
目指せ30分以内編集
今回の事象
ハマったこと
-
Ansibleでtomcatを起動するスクリプトを実行。
okの確認、pidファイルの作成も確認できていたが、ログインしてみると起動できていなかった。 -
ログインしたサーバーで起動スクリプトを叩くと起動できる。
-
debugで出力した結果も、環境変数が指定できていない等の問題はなさそう。
原因
- 起動コマンドに"&"をつけてバックグラウンドで起動していたが、
sshのコネクションが切れたため、プロセスも終了していた。 - Ansibleはsshでコネクションを張り、命令を実行という基本的な流れを忘れていた/(^o^)\
解決策
- nohupつけて起動
もう少し詳しく
実際にはただこれだけの無知なお話ですが、流れを詳細に。
実行命令
AnsibleのPlaybook内で以下のように記述
※{{ standby_deploy.stdout }}にはtomcatのパスが入る
- name: standby tomcat start
shell: |
{{ standby_deploy.stdout }}/bin/startup.sh
register: stadby_check
tags: tomcat
- debug: var=stadby_check
サーバー側
startup.sh → catarina.sh start
という流れを実行することになる。
catarina.shの起動部分は以下のように書かれていた。
eval \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
-Dcatalina.base=\"$CATALINA_BASE\" \
-Dcatalina.home=\"$CATALINA_HOME\" \
-Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
startで実行される部分まで追っていくと、
- javaコマンドで起動
- ログは"$CATALINA_OUT"に全て記述
- "&"が付いているのでバックグラウンドで実行
となっていることがわかる。
プロセスをバックグランドで実行させていた場合、sshコネクションの切断とともにkillされてしまう。
コネクションが切れても実行し続けるためにはdaemon化しとくか、
"nohup"をつけてログアウトしてもkillされないようにする必要がある。
以下のように変更
eval nohup \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
-Dcatalina.base=\"$CATALINA_BASE\" \
-Dcatalina.home=\"$CATALINA_HOME\" \
-Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
nohupを入れただけ
まとめ
Ansibleの処理後はsshコネクションが切られる
→yml内で実行命令出していたプロセスも切られる
ということを意識するというお話でした。
短時間まとめを意識したが難しい…
追記
@r_rudi さんよりコメントを頂いたとおり、
Ansibleのasync
オプションを使うことでnohupをつける必要なく行けました。
async
:http://docs.ansible.com/playbooks_async.html
Alternatively, if you do not need to wait on the task to complete, you may “fire and forget” by specifying a poll value of 0
pollを0に指定することで、タスクの完了を待機しないとの事。
ymlファイルを下記のように変更。
- name: standby tomcat start
shell: |
{{ standby_deploy.stdout }}/bin/startup.sh
register: stadby_check
async: 15
poll: 0
tags: tomcat
- debug: var=stadby_check
実行した所、表示はokではなく下記のようになっていた。
TASK: [api_deploy | standby tomcat start] *************************************
<job 434049680585> finished on 54.**.**.**
ok,changedではなくfinished
情報頂きありがとうございましたm(__)m