はじめに
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通りあります。
- ansible-navigator の設定ファイルである
ansible-navigator.yml
による指定 ansible-navigator
コマンドのオプションによる指定- 環境変数による指定
指定方法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
--step
や vars_prompt
を別々で試しました、組み合わせも大丈夫でした。
おわりに
今回ご紹介した設定変更では、当初とは別の制約があります。
- playbook-artifact を無効化するため
ansible-navigator replay
によるリプレイ機能が利用できない stdout
モードにするためTUI ではなくなる
だったら普通に ansible-playbook
コマンドでいいんじゃないかというケースもありますが、Execution Environment をコマンドから使うにはやはり ansible-navigator を使うことになると思います。
上記2点の制約が特に問題ではなく、インタラクティブな操作が必要な場合は、有効な手段になるかと思います。