カテゴリー
Linux

【Ansible】SDKMAN! で Oracle Java インストール時のキーボード入力待ち状態に expect モジュールで対処する

まとめ

  • Ansible の expect モジュールを使用する。
    • pip – Manages Python library dependencies. — Ansible Documentation
    • virtualenv、pip に依存するとあるが、pip のみのインストールで問題なかった。
    • pip は epel リポジトリの python-pip でインストールした。
    • pip がインストールされれば、ansilbe の pip モジュールが使用できるようになり、楽に pexpect をインストールできるようになった。
  • OpenJDK のときは対話処理するための質問文が表示されない。このときは expect は無視されるので Ansible の実行に影響なし。
  • expect モジュールの timeout デフォルト値は 30 秒のため、Java のインストールに間に合わずエラーとなった。したがって、1200 (60 秒 × 20 分) を設定した。
    • timeout 値を超える前にインストールが完了すれば次の処理へ進んだ。したがって、timeout には大きな値を入れておけば良い。

SDKMAN! で Oracle Java をインストールする Ansible プレイブック

次のように書きました。

実際には、バージョン部分の 8u141-oracle を変数にしています。

---
- name: Install python-pip
  yum:
    name: python-pip
    enablerepo: epel
    state: latest

- name: Install pexpect
  pip:
    name: pexpect
    state: latest

- name: Install Java
  expect:
    command: bash -lc "sdk install java 8u141-oracle"
    responses:
      "Do you agree to the terms of this agreement¥¥? ¥¥(Y¥¥/n¥¥): ": "Y"
    timeout: 1200

おまけ

ヒアドキュメントでも問題解決できるように思います。

sdk install java 8u141-oracle <<EOT
Y
EOT

実際に上記コマンドは、未インストール時、インストール後の 2 回ためしてみましたけれども、上手く動作しました。

ただし、Ansible で表現しようとすると、わかりやすく書くのは困難なように感じました。

また、キーボードの入力待ちの必要ない OpenJDK をインストールしたい場合、ヒアドキュメントのコマンドでは意味が伝わりにくくなります。

かといって、分岐をしてプレイブックを複雑にもしたくありません。

そのような理由で、expect モジュールのほうがマシかと思い、こちらにいたしました。

おわりに

次のページが参考になりました。特に response に書く文字列は正規表現であるので、? などエスケープしなければならない文字をどのように処理すべきが、助かりました。ありがとうございます!

以上です。

コメントを残す