はじめに
ansible-navigator
は、Playbookの実行、ドキュメントなどの情報が表示できる TUI ツールです。
Playbook の実行に関しては、ansible-playbook
コマンドでできることはだいたいできると思ってよさそうです。 ansible-playbook
コマンドの各オプションも ansible-navigator
コマンド経由で渡るようです。
ただし、ユーザーからの操作を受けてのインタラクティブな操作が一部できません。
私が分かっている範囲では、--step
オプションによる Playbook のステップ実行や、vars_prompt
ディレクティブによる変数の値の入力などです。Playbook の実行が途中で止まることは止まりますが、ユーザーの入力値を拾ってくれません。
何かか対処方法はあるかなと調べたらたら、ドキュメントの Frequently asked questions に掲載されていました。
playbook-artifact を無効化して、モードを stdout
にするといいようです。
試してみたのでまとめます。
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
mode: stdout
指定方法2: ansible-navigator
コマンドのオプション
オプション |
説明 |
指定例 |
--pae または --playbook-artifact-enable |
playbook-artifact の有効、無効 |
--pae False |
-m または --mode |
モードの指定 |
-m stdout |
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
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点の制約が特に問題ではなく、インタラクティブな操作が必要な場合は、有効な手段になるかと思います。