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
提示变量的值)and 也 SKIP 来提示一个用户完全取决于 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: false
在 vars:
部分?
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 将跳过提示。
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
提示变量的值)and 也 SKIP 来提示一个用户完全取决于 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: false
在 vars:
部分?
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 将跳过提示。