【发布时间】: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: false 在vars: 部分下?
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