本記事のターゲット
- Ansible初学者
- 実務でAnsibleを使用しているエンジニア
- 対話型、対話形式のコマンドやインストールの自動化に困っている方
前書き
ソフトウェアの中には、dnfモジュールではなく「install.sh」のようなシェルスクリプトを実行してインストールするものがあります。
その際、実行するだけでインストールを完了してくれるものもあれば、インストール途中に質問を投げかけ「yes/no」を入力させる対話型のものもあります。
もし対話型のソフトウェアのインストールをAnsibleで自動化する場合、Shellモジュール等でそのまま実行しても質問のタイミングでこけてしまいます。
自動化を実現する為には「expectモジュール」を活用する必要があるので、以下にその方法を記載します。
尚、今回はapacheのインストールを例に紹介します。
「ん?apacheならdnfモジュールを使えば良いのでは?」
とかいう野暮なことは聞かないでください。
(対話型インストールのソフトウェアを探すのは流石にシンドイ…)
※参考にする場合は自己責任でお願いします。
※expectモジュールを使用する場合、pexpectを対象ノード側にインストールしておく必要があります。
expectモジュールの記載例
- name: apacheのインストール(dnfモジュール未使用) #任意の名称
expect:
command: dnf install httpd
responses:
"Is this ok \\[y/N\\]": y
command
shellモジュールやcommandモジュールのように実行したいコマンドを記載します。
responses
"<質問内容>":<回答内容>
上記のように記載します。
「:」より左側の質問内容部分はインストール途中で確認を求められる際の文章になります。
responses記載時の注意点
「:」よりも左側の質問内容の文中に[]
、()
、?
、.
などの正規表現として用いられる記号が含まれている場合、\\
を使用してエスケープする必要があります。
裏ワザ(自己責任)
[]、()、?、.などの正規表現として用いられる記号が含まれている場合、「\\」を使用してエスケープする必要があります。
と上述しましたが、複数の正規表現が使われている場合、上手くエスケープできないことがあります。
そこで[]
、()
、?
、.
などの正規表現が含まれていない部分のみをresponses
に記載してみたところ、コケることなく正常終了しました。
質問文の全文ではなく、一部が記載されていれば問題ないと判断されるみたいですね。
ただ、詳細設計書に質問内容自体も記載されている現場の場合、この方法はNGを喰らうかもしれませんね…
- name: apacheのインストール(dnfモジュール未使用) #任意の名称
expect:
command: dnf install httpd
responses:
"Is this ok": y
終わりに
主要なミドルウェアはdnfモジュールでインストール可能ですが、場合によっては"PJ特有"のミドルウェアを使用することもしばしばあります。(大人の事情的な。。)
rpmが配布されているミドルウェアであれば良いのですが、必ずしもそうとは限りません。
もしAnsibleで自動化する必要がある上、インストールするミドルウェアが対話型インストールだった場合、今回紹介した「expectモジュール」を活用して頂ければと思います。