Ansible:检查提示值

Ansible: check prompt value

我创建了一个 Ansible 剧本脚本,运行 它需要用户交互。 现在我需要检查用户在提示时是否正确插入值。

  vars_prompt:
  - name: "vm_env"
    prompt: "vm_env (values: PRD, TST, DEV)"
    default: "DEV"
    private: false

如何检查用户是否仅正确插入了这些值(PRD、TST、DEV)之一,以及是否停止脚本?

感谢支持 马可

有一个 Ansible assert module 可以验证事物并在条件不匹配时失败并显示适当的错误消息。

示例:

  vars_prompt:
  - name: "vm_env"
    prompt: "vm_env (values: PRD, TST, DEV)"
    default: "DEV"
    private: false

  tasks:
  # "|lower" filter used to fix any case inconsistency, not required if case should match
  - assert:
      that:
      - vm_env|lower in [ 'prd', 'tst', 'dev' ]
      fail_msg: "VM environment should be one of: PRD, TST, DEV"

如果您想给用户提供改进的机会,请使用 pause。但是没有default.

- hosts: localhost
  gather_facts: false
  tasks:
    - pause:
        prompt: "vm_env (values: PRD, TST, DEV)"
      register: result
      until: result.user_input|default('') in ['PRD', 'TST', 'DEV']
      retries: 3
      delay: 0
    - set_fact:
        vm_env: "{{ result.user_input }}"

给予

PLAY [localhost] ****

TASK [pause] ****
[pause]
vm_env (values: PRD, TST, DEV):
ok: [localhost]

TASK [set_fact] ****
ok: [localhost]

TASK [debug] ****
ok: [localhost] => {
    "vm_env": "PRD"
}

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

备注

  1. 请注意,如果您在值中使用上面的 'yes' 或 'no',set_fact 之后会将 user_input 信息变成布尔值( 'true'/'false')! (信用@Monger39)
    - pause:
        prompt: "vm_env (values: yes, no)"
      register: result
    - debug:
        msg: |-
          result.user_input: {{ result.user_input }}
          result.user_input|type_debug: {{ result.user_input|type_debug }}
    - set_fact:
        vm_env: "{{ result.user_input }}"
    - debug:
        msg: |-
          vm_env: {{ vm_env }}
          vm_env|type_debug: {{ vm_env|type_debug }}

给出下面 'yes'

的输出
TASK [pause] ********************************************************
[pause]
vm_env (values: yes, no):
yes^Mok: [localhost]

TASK [debug] ********************************************************
ok: [localhost] => 
  msg: |-
    result.user_input: yes
    result.user_input|type_debug: AnsibleUnsafeText

TASK [set_fact] *****************************************************
ok: [localhost]

TASK [debug] ********************************************************
ok: [localhost] => 
  msg: |-
    vm_env: True
    vm_env|type_debug: bool

和 'no'

的类似输出
TASK [pause] ********************************************************
[pause]
vm_env (values: yes, no):
no^Mok: [localhost]

TASK [debug] ********************************************************
ok: [localhost] => 
  msg: |-
    result.user_input: no
    result.user_input|type_debug: AnsibleUnsafeText

TASK [set_fact] *****************************************************
ok: [localhost]

TASK [debug] ********************************************************
ok: [localhost] => 
  msg: |-
    vm_env: False
    vm_env|type_debug: bool
  1. 尽管 yes/no 隐式转换为 True/False,但可以在 until 循环中测试字符串。以下任务按预期工作
    - pause:
        prompt: "vm_env (values: yes, no)"
      register: result
      until: result.user_input|default('') in ['yes', 'no']
      retries: 3
      delay: 0
    - debug:
        msg: "User entered: {{ result.user_input|bool|ternary('yes', 'no') }}"

参见: