72
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ansible で prompt (入力待ち) の実現とその周辺テクニックのまとめ

Last updated at Posted at 2016-02-04

概要

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"}}"
72
69
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?