てくなべ (tekunabe)

ansible / network automation / 学習メモ

[ansible] ansible-navigator で --step や vars_prompt によるインタラクティブな操作をする

はじめに

ansible-navigator は、Playbookの実行、ドキュメントなどの情報が表示できる TUI ツールです。

Playbook の実行に関しては、ansible-playbook コマンドでできることはだいたいできると思ってよさそうです。 ansible-playbook コマンドの各オプションも ansible-navigator コマンド経由で渡るようです

ただし、ユーザーからの操作を受けてのインタラクティブな操作が一部できません。

私が分かっている範囲では、--step オプションによる Playbook のステップ実行や、vars_promptディレクティブによる変数の値の入力などです。Playbook の実行が途中で止まることは止まりますが、ユーザーの入力値を拾ってくれません。

何かか対処方法はあるかなと調べたらたら、ドキュメントの Frequently asked questions に掲載されていました。

playbook-artifact を無効化して、モードを stdout にするといいようです。

試してみたのでまとめます。

  • 環境
    • ansible-navigator 1.1.0

playbook-artifact の無効化と、stdout モードへの変更

デフォルトでは playbook-artifact が有効で、モードは interactive (TUI) なのでそれぞれ変更する必要があります。

挙動の指定方法は以下の3通りあります。

  1. ansible-navigator の設定ファイルである ansible-navigator.yml による指定
  2. ansible-navigator コマンドのオプションによる指定
  3. 環境変数による指定

各設定値や方法詳細はこちら

指定方法1: ansible-navigator.yml

ansible-navigator.yml による指定の場合は、以下のように定義します。

---
ansible-navigator:
   # ...(略)...
   playbook-artifact:
     enable: False       # playbook-artifact の無効化
   mode: stdout         # モードを stdout に変更

指定方法2: ansible-navigator コマンドのオプション

オプション 説明 指定例
--pae または --playbook-artifact-enable playbook-artifact の有効、無効 --pae False
-m または --mode モードの指定 -m stdout

指定方法3: 環境変数

export ANSIBLE_NAVIGATOR_PLAYBOOK_ARTIFACT_ENABLE=False
export ANSIBLE_NAVIGATOR_MODE=stdout

おためし1: --step によるステップ実行

ここでは ansible-navigator コマンドのオプション(-m stdout --pae False)で指定します。加えて、ステップ実行の --step オプションも指定します。

$ ansible-navigator run plyabooks/step.yml -i inventory --step -m stdout --pae False
PLAY [localhost] **********************************************************************************
Perform task: TASK: task1 (N)o/(y)es/(c)ontinue: y   # ここで一時停止するので、実行するための y を指定してエンター

Perform task: TASK: task1 (N)o/(y)es/(c)ontinue: **************************************************

TASK [task1] **************************************************************************************
ok: [localhost] => {
    "msg": "this is task1"
}
Perform task: TASK: task2 (N)o/(y)es/(c)ontinue: y  # 同上

Perform task: TASK: task2 (N)o/(y)es/(c)ontinue: **************************************************

TASK [task2] **************************************************************************************
ok: [localhost] => {
    "msg": "this is task2"
}

PLAY RECAP ****************************************************************************************
localhost  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

参考: playbook-artifact を有効なままの場合

なお、playbook-artifact を有効なままの場合、以下のところでとまって入力も受け付けられません。(さすがにCtrl+Cで抜けられます)

$ ansible-navigator run plyabooks/step.yml -i inventory --step -m stdout  # playbook-artifact を有効なまま

PLAY [localhost] ***************************************************************

おためし2: vars_prompt による変数値指定

以下の Playbook で試します。

---
- hosts: localhost
  gather_facts: false
  connection: local

  vars_prompt:   # 変数の値をインタラクティブにユーザーに指定してもらう
    - name: msg
      prompt: Input msg
      private: false

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

先ほどと同じく、 ansible-navigator コマンドのオプション(-m stdout --pae False)で指定します。

$ ansible-navigator run plyabooks/step.yml -i inventory  -m stdout --pae False
Input msg: sakana sakana sakana         # 変数の値を聞かれるので入力する

PLAY [localhost] ***********************************************************************************

TASK [task1] ***************************************************************************************
ok: [localhost] => {
    "msg": "sakana sakana sakana"
}

PLAY RECAP *****************************************************************************************
localhost   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

参考: playbook-artifact を有効なままの場合

playbook-artifact を有効なままの場合、以下のところでとまって入力も受け付けられません。(さすがにCtrl+Cで抜けられます)事情を知らないと何が起こったかわからないですね・・

$ ansible-navigator run plyabooks/step.yml -i inventory  -m stdout 

--stepvars_prompt を別々で試しました、組み合わせも大丈夫でした。

おわりに

今回ご紹介した設定変更では、当初とは別の制約があります。

  • playbook-artifact を無効化するため ansible-navigator replay によるリプレイ機能が利用できない
  • stdout モードにするためTUI ではなくなる

だったら普通に ansible-playbook コマンドでいいんじゃないかというケースもありますが、Execution Environment をコマンドから使うにはやはり ansible-navigator を使うことになると思います。

上記2点の制約が特に問題ではなく、インタラクティブな操作が必要な場合は、有効な手段になるかと思います。