LoginSignup
21
20

More than 5 years have passed since last update.

Ansible忘備録 -起動したはずのプロセスが死んでいる-

Last updated at Posted at 2014-07-12

とても初歩的なことでハマってしまったので、今後忘れないためにもしっかり書いておく。
目指せ30分以内編集

今回の事象

ハマったこと

  • Ansibleでtomcatを起動するスクリプトを実行。
    okの確認、pidファイルの作成も確認できていたが、ログインしてみると起動できていなかった。

  • ログインしたサーバーで起動スクリプトを叩くと起動できる。

  • debugで出力した結果も、環境変数が指定できていない等の問題はなさそう。

原因

  • 起動コマンドに"&"をつけてバックグラウンドで起動していたが、 sshのコネクションが切れたため、プロセスも終了していた。
  • Ansibleはsshでコネクションを張り、命令を実行という基本的な流れを忘れていた/(^o^)\

解決策

  • nohupつけて起動

もう少し詳しく

実際にはただこれだけの無知なお話ですが、流れを詳細に。

実行命令

AnsibleのPlaybook内で以下のように記述
※{{ standby_deploy.stdout }}にはtomcatのパスが入る

start_tomcat.yml
- 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の起動部分は以下のように書かれていた。

${CATALINA_HOME}/bin/catalina.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されないようにする必要がある。

以下のように変更

${CATALINA_HOME}/bin/catalina.sh
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ファイルを下記のように変更。

start_tomcat.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

21
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20