Ansible - 当条件不适用于剧本级别的 vars_prompt 时

Ansible - when conditional not working for vars_prompt at playbook level

ansible 2.1.2.0

我这里有一个情况,我想和大家一起看看这个解决方案是否甚至可以使用 Ansible vars_prompt 功能和 when 条件。

Ansible 具有以下功能:vars_prompt and I want to club this with the when 条件(when: ... 我们通常在任务或剧本级别操作中使用)

PS: 我的问题 与此不同 post: Ansible to Conditionally Prompt for a Variable? 即我的vars: 变量不依赖于任何机器的 OS ENV 变量,在我的例子中,我只有一个 vars: 变量的简单硬编码值。我还在主要剧本级别(而不是任务级别)运行设置 when 条件。

我想做的是提示用户输入一个变量值,只有在命令行中,用户用 --extra-vars "install_tool=true"

调用了 ansible-playbook install_tool.yml ... ...

workspace/ansible/install_tool.yml中我有:

- hosts: all
  become: true
  gather_facts: false

  vars:
    instance: test
    #install_tool: false
    company_api_url: DUMMY_INVALID_URL

  vars_prompt:
    - name: "company_api_url"
      prompt: "Enter Company API URL: "
      default: "https://{{ instance }}.company.com"
      private: no
      when: install_tool == "true" and company_api_url == "DUMMY_INVALID_URL"
      # or
      #when: ( "{{ install_tool }}" == "true" and "{{ company_api_url }}" == "DUMMY_INVALID_URL" )

  pre_tasks:
    - debug: msg="install_tool = {{ install_tool }} and instance = {{ instance }}" 
      when: install_tool == "true"

我的问题:
我怎样才能让上面的条件提示工作(用一个有效的替代 default 提示变量的值)andSKIP 来提示一个用户完全取决于 install_tool 变量的值?

我的理解: 在顶级剧本文件 (install_tool.yml) 中,我定义了一个变量 instance,值为 test。为什么 vars_prompt 部分的 default 值没有选择 test 并在剧本级别定义时替换它的值(--或者如果用户传递 instance ex: --extra-vars "instance=qa" 的命令行变量?在那种情况下,我希望默认值为 [https://qa.company.com],我该怎么做)? 运行针对任何语法使用它时,我没有看到任何错误。

我得到以下输出(但我期待一个替代的 URL 值,如:[https://test.company.com] 即使 install_tool 在命令行中设置或传递为 false:

运行:

$ ansible-playbook -i "localhost," --connection=local install_tool.yml --extra-vars "install_tool=false instance=qa"

$ ansible-playbook -i inventory -l localhost install_tool.yml --extra-vars "install_tool=false"
...
.....some lines here
...
PLAYBOOK: install_tool.yml *******************************************
1 plays in install_tool.yml
Enter Company API URL:  [https://{{ instance }}.company.com]: 

由于在 vars_prompt 部分中使用 when: ( "{{ install_tool }}" == "true" and ...) 条件,under/for - name: company_api_url 变量,它没有因任何语法问题等而出错(这意味着,Ansible不认为这是错误的),然后 WHY,Ansible 仍然提示我输入上面的 vars_prompts 变量,即使我正在传递 --extra-vars "install_tool=false" --OR-- 如果我 取消注释 行:install_tool: falsevars: 部分?

PS: when: ... 条件在 pre_tasks 部分成功工作,即当 install_tool 为真时,它显示这两个变量的值,当 install_tool 设置为 false 时,它​​不会 运行 - debug 步骤并跳过它(这是预期的)。

谢谢。

您可以检查提示变量的所有支持属性 here

提示变量不支持

when 语句。从来没有。

提示变量的模板默认值也是not supported

防止 vars 提示的唯一方法是通过 extra_vars 传递有问题的变量。在您的示例中,如果您传递 -e company_api_url=my_custom_url,Ansible 将跳过提示。