是否有条件地提示变量?

Ann*_*ile 31 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
Run Code Online (Sandbox Code Playgroud)

注意:我在Mac上,但我希望任何解决方案都与平台无关.

小智 34

根据开发人员的回复和我用最新版本进行的快速测试,它vars_prompt "收集事实" 之前运行的.这意味着env var SSHPWD始终null在您检查时when.

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

Michael DeHaan的理由是,在任务级别允许提示会为角色打开大门,提出很多问题.这将使使用Ansible Galaxy角色变得困难:

Ansible的自动化已经得到了明确的重视,在任务级别提问并不是我们真正想做的事情.

但是,您仍然可以在游戏级别询问vars_prompt问题,并在整个任务中使用这些变量.你不能在角色中提问.

真的,这就是我想强制执行的 - 如果很多Galaxy角色开始提问,我可以看到这很烦人:)

  • 很好地解释了 GATHERING FACTS 与 vars_prompt 部分的排序。 (3认同)

teh*_*oon 28

我可能迟到了派对,但要避免的一个简单方法vars_prompt就是interactive mode通过这样一个简单的技巧来禁用它:

echo -n | ansible-playbook -e MyVar=blih site.yaml
Run Code Online (Sandbox Code Playgroud)

这无法控制哪些vars_prompt要避免但与之相结合default: "my_default"可以在脚本中使用.

完整的例子:

---
- hosts: localhost
  vars_prompt:
    - prompt: Enter blah value
    - default: "{{ my_blah }}"
    - name: blah
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


key*_*ess 9

根据tehmoon 的回答并进行了一些修改,我这样做了:

- hosts:
    - hostA
  become: yes
  pre_tasks:
    - pause:
        prompt: "Give your username"
      register: prompt
      no_log: yes
      run_once: yes
    - set_fact:
        username: "{{prompt.user_input}}"
      no_log: yes
      run_once: yes
    - pause:
        prompt: "Give your password"
        echo: no
      register: prompt
      no_log: yes
      run_once: yes
    - set_fact:
        password: "{{prompt.user_input}}"
      no_log: yes
      run_once: yes
  tags: [my_role_using_user_pass]
  roles:
    - role: my_role_using_user_pass
Run Code Online (Sandbox Code Playgroud)