【问题标题】:Ansible - when conditional not working for vars_prompt at playbook levelAnsible - 当有条件在剧本级别对 vars_prompt 不起作用时
【发布时间】:2017-01-02 09:25:23
【问题描述】:

ansible 2.1.2.0

我在这里遇到一种情况,我正在尝试与大家核实一下,看看是否可以使用 Ansible vars_prompt 功能和 when 条件解决方案。

Ansible 有一个名为:vars_prompt 的功能,我想将它与when 条件结合起来(when: ...,我们通常在任务或剧本级别的操作中使用它)

PS:我的问题与这篇文章不同Ansible to Conditionally Prompt for a Variable? 即我的vars: 变量不依赖于任何机器的操作系统 ENV 变量,就我而言,我对vars: 变量只有一个简单的硬编码值。我还在主要剧本级别(而不是任务级别)运行 when 条件。

我要做的是提示用户输入变量值,前提是用户在命令行中调用了ansible-playbook install_tool.yml ... ...--extra-vars "install_tool=true"

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 值作为提示变量)SKIP 根据值来完全提示用户install_tool 变量?

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

我得到以下输出(但我期待一个替代的 URL 值,例如:[https://test.company.com]并且即使在命令行中设置或传递了 install_tool 时它仍然在提示 @ 987654344@:

跑步:

$ 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 ...) 条件,在/for - name: company_api_url 变量下,它不会因任何语法问题等而出错(这意味着,Ansible 认为它没有错),然后 为什么,Ansible 仍然提示我输入上面的vars_prompts 变量,即使我传递--extra-vars "install_tool=false" --OR-- 如果我取消注释 行:install_tool: falsevars: 部分下?

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

谢谢。

【问题讨论】:

  • 将其归结为一个问题并提供一个可重复的示例。
  • @ceving 我更改了我的帖子,这有帮助吗?我想提供一些详细的解释。上面的 install_tool.yml 是否对您显示替换的 default 值有效,并且当 install_tool 设置为 false 时是否跳过提示部分?
  • 它看起来不像vars_prompt: 使用when: 指令...如果你只是添加一个简单的when: False 你可以看到它被忽略了。
  • @RobH 你是对的。我想知道是否在 pre_tasks 下,我可以使用一些本机模块,有条件地提示用户(在某些情况下,拼写错误等以确保事情不会在 98% 的运行中中断)并注册变量,但我想这不会像命令一样工作line 变量将取代所有或可能。至少对于 Ansible INTERACTIVE 运行而言,拥有此功能以使 Ansible 具有交互性/非交互性会很好。对于非交互式运行(如果 -e var=value 不正确),如果由于某种原因传递的值不正确(错字),则 Ansible 失败是可以的

标签: variables ansible ansible-playbook prompt ansible-2.x


【解决方案1】:

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

when 语句不支持提示变量。而且从来没有。

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

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

【讨论】:

  • 我同意康斯坦丁。有条件提示会非常好,即如果传递的值不是用户想要的(例如:错字/值取决于时间窗口等),那么 Ansible 自动化足够智能,至少可以提示用户进行交互式运行.是否有计划添加此功能/功能?我同意非交互式运行,我们不希望 Ansible 在运行过程中提示用户。
  • 我不是 Ansible 团队开发人员,因此无法告诉您任何计划,抱歉 :) 但我提倡尽可能少的交互行为。我在许多 playbook 的开头使用assert 任务来确保在进一步运行 playbook 期间所需的所有数据都存在,并为用户提供有意义的错误消息以修复输入数据。
  • 同意,我想在这种情况下我应该很快失败。
猜你喜欢
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多