てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ansible-navigator で vars_prompt のような対話式入力を有効する --enable-prompts オプション

はじめに

ansible-navigator 3.0.0 で、vars_prompt ディレクティブや ansible.builtin.pause モジュール のような、ユーザーの入力を待つ機能と組み合わせて使うためのオプション --enable-prompts (短縮形は --ep )が追加されました。

該当 changelog:

Add enable_prompts parameter for run subcommand (#1419) @shatakshiiii

Release v3.0.0 · ansible/ansible-navigator · GitHub

この機能を試してみます。

  • 環境
    • ansible-navigator 3.0.0
    • ee: ghcr.io/ansible/creator-ee:v0.14.1

これまでの仕様や --enable-prompts の役割

デフォルトでは、Playbook 実行中はユーザーの入力を受け付けない(もちろんTUIの操作は受け付ける)仕様になっています。

公式ドキュメントの FAQ にも記載があります。

Why does the playbook hang when vars_prompt, pause/prompt or --ask-pass is used?

Frequently asked questions - Ansible Navigator Documentation

これまでの ansible-navigator でも、アーティファクト(ログのようなもの)機能を無効化して、--mode stdout で実行すれば入力を受け付けられました。今回追加された --enable-prompts オプションを付けるだけでもできるようになりました。

--enable-prompts オプションを使うと、入力が受け付けられるようになる代わりに、アーティファクト機能は無効化され、--mode stdout 相当 Playbook が実行されます。この点はこれまでと変わりません。

表示上は ansible-playbook コマンドをそのまま実行するようなイメージになります。

おためし

Playbook

試す Playbook は以下のとおりです。vars_prompt で、ユーザーの入力を待って、入力された値を変数 msg に入れます。

---
- name: Hello
  hosts: localhost
  gather_facts: false

  vars_prompt:
    name: msg
    prompt: What is your message?
    private: false

  tasks:
    - name: Hello
      ansible.builtin.debug:
        msg: "{{ msg }}"

ansible-navigator.yml

ansible-navigator の設定ファイルである ansible-navigator.yml は今回はなしです。もろもろデフォルト値で実行します。

デフォルトだと

比較のために、 --enable-prompts なしのデフォルトだとどうなるか試します。

右下に Running と表示されたままになっている通り、いつまで立っても完了しません。Playbook としては vars_prompt で入力を待っています。ですが、ここで何を入力しても ansible-navigator のTUI の操作として扱われるため、Playbook に入力を渡せない状態です。

--enable-prompts あり

次に --enable-prompts をつけて実行します。

見慣れた --mode stdout 相当の表示となり、vars_prompt で指定したプロンプト文字が表示され、入力も受け付けられました。

なお、--enable-prompts true と指定すると ERROR! the playbook: true could not be found というエラーになります。単に --enable-prompt だけ指定します(プチハマりしました)。

おわりに

本来は、Automation Controller で実行するときのことを考えると、このようなユーザーの入力を待つ Playbook は避けるべきです。

ですが、諸事情で入力を受け付けたいときは便利な方法だと思います。ただし、アーティファクトが無効になる点は注意が必要です。