是否有条件地提示变量?

时间:2014-08-23 21:48:48

标签: variables ansible

我希望能够提示我的超级安全密码变量,如果它不在环境变量中。 (我想我可能不想把这个定义放到.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上,但我希望任何解决方案都与平台无关。

6 个答案:

答案 0 :(得分:34)

根据devs的回复以及我对最新版本进行的快速测试,vars_prompt在" GATHERING之前运行 FACTS&#34 ;.这意味着在您使用SSHPWD核对时,env变量null始终为when

不幸的是,似乎没有办法在任务级别允许vars_prompt语句。

迈克尔德哈恩的理由是,在任务层面允许提示会为角色打开大门,提出很多问题。这将使得使用Ansible Galaxy角色变得困难:

  

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参数提示。