我希望能够提示我的超级安全密码变量,如果它不在环境变量中。 (我想我可能不想把这个定义放到.bash_profile或其他一个地方。)
这不起作用。它总是提示我。
vars:
THISUSER: "{{ lookup('env','LOGNAME') }}"
SSHPWD: "{{ lookup('env','MY_PWD') }}"
vars_prompt:
- name: "release_version"
prompt: "Product release version"
default: "1.0"
when: SSHPWD == null
注意:我在Mac上,但我希望任何解决方案都与平台无关。
答案 0 :(得分:34)
根据devs的回复以及我对最新版本进行的快速测试,vars_prompt
在" GATHERING之前运行 FACTS&#34 ;.这意味着在您使用SSHPWD
核对时,env变量null
始终为when
。
不幸的是,似乎没有办法在任务级别允许vars_prompt
语句。
Ansible已经明确强调自动化,在任务级别提问不是我们真正想做的事情。
但是,您仍然可以在游戏级别询问vars_prompt问题,并在整个任务中使用这些变量。你不能在角色中提问。
实际上,这就是我想要执行的内容 - 如果很多Galaxy角色开始提问,我可以看到这很烦人:)
答案 1 :(得分:25)
我可能迟到了,但避免vars_prompt
的一种快捷方法是通过这个简单的技巧禁用interactive mode
:
echo -n | ansible-playbook -e MyVar=blih site.yaml
这无法控制哪些vars_prompt要避免,但与default: "my_default"
结合使用它可以在脚本中使用。
这里有完整的例子:
---
- hosts: localhost
vars_prompt:
- prompt: Enter blah value
- default: "{{ my_blah }}"
- name: blah
echo -n | ansible-playbook -e my_blah=blih site.yaml
修改强>
我发现使用pause
模块和prompt
参数正在做我想要的事情:
---
- pause:
prompt: "Sudo password for localhost "
when: ( env == 'local' ) and
( inventory_hostname == "localhost" ) and
( hostvars["localhost"]["ansible_become_password"] is not defined )
register: sudo_password
no_log: true
tags:
- always
答案 2 :(得分:4)
默认情况下,Ansible确实无法做到这一点。我理解不允许它的原因,但我认为可以在某些情况下是合适的。我一直在使用蓝/绿部署系统编写AWS EC2部署脚本,并且在角色的某个时刻我需要询问用户是否需要在出现问题时进行回滚。如上所述,没有办法做到这一点(有条件和/或无瑕疵)。
所以我写了一个非常简单的Ansible(2.x)动作插件,基于标准库的暂停动作。它有点简陋,因为它只接受一次按键,但它可能有用。您可以在Github gist here中找到它。您需要将整个Gist文件复制到playbook目录的action_plugins
目录中。请参阅文件中的文档。
答案 3 :(得分:2)
这对我有用(2.3)..在一个文件中做两位。 这允许我在通过jenkins运行playbook时构造tmp vars文件..但也允许在命令行上提示
你只需使用一个var
即可---
- name: first bit
hosts: all
connection: local
tasks:
- set_fact:
favColour: "{{ favColour }}"
when: favColour is defined
- name: second bit
hosts: all
connection: local
vars_prompt:
favColour:
prompt: "Whats ya favorite colour: "
when: favColour is not defined
tasks:
- debug: msg="{{favColour}}"
答案 4 :(得分:2)
基于tehmoon's的答案,我做了一些修改:
var script4 = document.createElement("script");
script4.setAttribute("type", "text/javascript");
script4.innerHTML = '$(document).delegate("#Filterable_Value2' + count +
'","keyup",function(){ var input = $("#Filterable_Value2' + count +
'").val(); document.getElementById("Filter_Value2-' + count + '").innerHTML =
input;})';
document.head.appendChild(script4);
答案 5 :(得分:1)
从source code可以看出,when
关键字未针对vars_prompt
实施(实际上从未实现过)。这个Github comment中提到了同样的事情。
vars_prompt
当前有条件的唯一方法是它仅在已定义变量(在name
中定义)时使用命令行extra_vars
参数提示。