如果环境变量中尚未包含我的超级安全密码变量,我希望能够提示该变量。 (我想我可能不想将定义放入 .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,但我希望任何解决方案都独立于平台。
根据 devs 的回复以及我对最新版本所做的快速测试,
vars_prompt
是在 “收集事实”之前运行的。这意味着在您使用 SSHPWD
检查时,环境变量
null
始终为
when
。不幸的是,似乎没有办法允许在任务级别使用
vars_prompt
语句。Michael DeHaan 对此的推理是,在任务级别允许提示将为提出很多问题的角色打开大门。 这将使使用 Ansible Galaxy 角色来执行此操作变得困难:
Ansible 明确强调自动化,在任务级别提出问题并不是我们真正想做的事情。但是,您仍然可以在游戏级别询问 vars_prompt 问题,并在整个任务中使用这些变量。 你只是不能在角色中提问。
实际上,这就是我想要强制执行的——如果很多银河角色开始提出问题,我可以看到这很烦人:)
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
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
---
- 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的工作:
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
您可以通过在命令行上定义变量来有条件地跳过
假设您有:
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