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
备注
- 请注意,如果您在值中使用上面的 '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
- 尽管 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') }}"
参见:
我创建了一个 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
备注
- 请注意,如果您在值中使用上面的 '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
- 尽管 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') }}"
参见: