【问题标题】:Ansible: check prompt valueAnsible:检查提示值
【发布时间】:2020-11-20 15:29:06
【问题描述】:

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

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

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

感谢支持 马可

【问题讨论】:

    标签: ansible prompt


    【解决方案1】:

    有一个 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"
    

    【讨论】:

    • 在提示符下,是否可以禁用没有值的,或者强制使用介于接受值之间的值?
    • 我认为不可能防止空的 被按下。但是default 参数应该会处理它。
    • 嗨 seshadri_c,我找到了解决方案:直到:vm_ip_result.user_input|length > 0
    【解决方案2】:

    如果您想让用户有机会改进,请使用pause。但是,没有默认

    - 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 }}
    

    在下面给出“是”的输出

    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. 尽管隐含的是/否转换为真/假,但可以在 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') }}"
    

    见:

    【讨论】:

    • 感谢您的支持。我尝试使用您的代码,但总是收到错误,不接受任何值,我尝试插入 PRD 或 prd 但它不接受。
    • 不客气。我再次仔细检查了代码。它对我有用。我添加了一个输出示例。
    • 请注意,如果您在上面的值中使用“yes”或“no”,则 set_fact 之后会将 user_input 信息变为布尔值(“true”/“false”)!
    • @Monger39,谢谢!我对此添加了注释。
    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2015-07-25
    • 2021-12-16
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多