まとめ
- 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 に書く文字列は正規表現であるので、? などエスケープしなければならない文字をどのように処理すべきが、助かりました。ありがとうございます!
- Ansible:さらにPlaybookをきわめる | Think IT(シンクイット)
[対話処理を自動化する] の章
以上です。