Ansible 有条件提示输入变量?

问题描述 投票:0回答:8

如果环境变量中尚未包含我的超级安全密码变量,我希望能够提示该变量。 (我想我可能不想将定义放入 .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,但我希望任何解决方案都独立于平台。

variables ansible
8个回答
51
投票

根据 devs 的回复以及我对最新版本所做的快速测试,

vars_prompt
是在 “收集事实”之前运行的。这意味着在您使用 SSHPWD
 检查时,环境变量 
null
 始终为 
when

不幸的是,似乎没有办法允许在任务级别使用

vars_prompt

 语句。

Michael DeHaan 对此的推理是,在任务级别允许提示将为提出很多问题的角色打开大门。 这将使使用 Ansible Galaxy 角色来执行此操作变得困难:

Ansible 明确强调自动化,在任务级别提出问题并不是我们真正想做的事情。

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

实际上,这就是我想要强制执行的——如果很多银河角色开始提出问题,我可以看到这很烦人:)


36
投票
我可能会迟到,但避免

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
    

10
投票
基于

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

- 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
    

4
投票
这在 Ansible 中默认是不可能的。我理解不允许这样做的原因,但我认为它在某些情况下“可以”是合适的。我一直在使用蓝/绿部署系统编写一个 AWS EC2 部署脚本,在角色中的某个时刻,我需要询问用户如果出现问题是否需要进行回滚。如前所述,没有办法做到这一点(有条件地和/或不难看)。

因此,我基于标准库中的暂停操作编写了一个非常简单的 Ansible (2.x) 操作插件。它有点斯巴达,因为它只接受单个按键,但它可能有用。您可以在 Github gist 中找到它

。您需要将整个 Gist 文件复制到 playbook 目录的

action_plugins 目录中。请参阅文件中的文档。

    


3
投票
中可以看出,

when关键字没有为vars_prompt

实现(事实上从未实现过)。这个 Github 
comment
 中也提到了同样的事情。
当前 vars_prompt

有条件的唯一方式是,仅当变量(在

name

 中定义)已定义(使用命令行 
extra_vars
 参数)时才会提示。

这对我有用(2.3)..在一个文件中执行两位。 这允许我在通过 jenkins 运行剧本时构建 tmp vars 文件..但也允许在命令行上提示

2
投票
你只需使用一个 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}}"

根据@tehmoon的回答,这对我来说是ansible-core 2.14的工作:

0
投票
tasks: - name: Prompt SSH password if necessary when: ansible_password is undefined block: - name: Conditionally prompt for ssh/sudo password ansible.builtin.pause: prompt: "Password for {{ ansible_user_id }}@{{ ansible_host }}" echo: false register: password_prompt no_log: true - name: Set ansible_password ansible.builtin.set_fact: ansible_password: "{{ password_prompt.user_input }}" no_log: true - name: Set ansible_become_password ansible.builtin.set_fact: ansible_become_password: "{{ ansible_password }}" no_log: true when: ansible_become_password is undefined

您可以通过在命令行上定义变量来有条件地跳过 

0
投票
提示符的执行。

假设您有:

vars_prompt: - name: server prompt: New Server Name? (skip with -e "server=foo") private: false

如果您使用 `ansible-playbook your_playbook.yml -e "server=foo" 运行此剧本,则将跳过提示。如果您在没有 extra_vars 定义的情况下运行剧本,系统将提示您输入未定义的变量。
有问题的实际 ansible 代码是

here

extra_vars-e

 的长形式。
if vname not in self._variable_manager.extra_vars

如果您的目标更多的是通过实际的
extra_vars
子句以编程方式使用

when:

,则这是不可能的。相反,Ansible
团队的
官方建议是使用暂停模块:
when 不是 vars 支持的关键字(即使在 vars_prompt 中),如果你想使用条件输入,请查看暂停模块

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/pause_module.html

© www.soinside.com 2019 - 2024. All rights reserved.