概要
ansible でキー入力待ちを実現するには pause というモジュールを使います。
いろいろなサンプルをまとめてみました。
◆「Enterキーを押してください」
tasks
- name: confirm
pause: prompt="Enterキーを押してください"
nameがあることで下記の出力にできる
TASK: [confirm] ***********************************
[webservers]
Enterキーを押してください:
ちょいテク: 出力を汚さないために name
を使う:
nameがない場合はちょっと出力がカッコ悪い
TASK: [pause prompt="Enterキーを押してください"] ****
[webservers]
Enterキーを押してください:
nameがあれば
TASK: [confirm] ***********************************
[webservers]
Enterキーを押してください:
◆ y/nで確認
tasks
- name: confirm
pause: prompt="このまま進めて良いですか? (y/n)"
register: yn
- name: abort
fail: msg="Aborted!!"
when: yn.user_input != 'y'
run_once: true
ちょいテク: 条件付きで強制終了するなら when
+ fail
ちょいテク: run_once: true
でホストが複数でも1度しか実行しない。
-
pause
は性質上もともと1回しか動かないのでrun_once: true
は不要。つけても害はないが。
◆ 何かを入力させる
tasks
- name: branch
pause:
prompt: "branch 名 もしくは リリース tag を指定してください [develop]"
register: branch_input
- name: set branch
set_fact:
branch_name: "{{ branch_input.user_input | default('develop', true) }}"
表示イメージ
TASK: [branch] *****************************************
[127.0.0.1]
branch 名 もしくは リリース tag を指定してください [develop]:
ここで入力
ok: [127.0.0.1]
TASK: [set branch] *************************************
ok: [127.0.0.1]
ちょいテク: .user_input
で入力された内容を取れる。
- 末尾の改行は含まれない。
- 何も入力せずに Enter おされたら
""
が入る。
ちょいテク: default()
でデフォルトを指定できる
- 第1引数でデフォルト値を指定する。
- 第2引数を
true
にすることで、(未定義だけでなく)空欄も default の対象にできる。
ちょいテク: set_fact で変数への代入ができる
◆ vars_prompt
でも入力させることができる
playbook
- hosts: 127.0.0.1
vars_prompt:
- name: "branch_name"
prompt: "リリース tag もしくは branch 名を指定してください"
default: develop
private: no
表示イメージ
[ansibleadm@localhost playbooks]$ ansible-playbook -i hosts xxxx.yml
リリース tag もしくは branch 名を指定してください [develop]:
この方法の良い所:
- デフォルト機能が備わっている
- パスワードの場合の文字が見えない入力機能(
private: yes
)が備わっている - 冒頭で訊いてくれるので task の出力を汚さない
この方法の問題点:
- デフォルトに変数(
{{ default_branch }}
等)を使えない(変数展開されずそのまま使われてしまう) - role 化できない
おまけ1:hosts が複数サーバだった場合どうなるか
全サーバで1度しかプロンプトはでません。
おまけ2:promptで改行する方法
改行されない
pause: prompt="aaa\nbbb"
上記では改行されないが、下記なら改行されます:
改行される1
pause:
prompt: "aaa\nbbb"
もしくは
改行される2
pause: prompt="{{"aaa\nbbb"}}"