如何在Ansible Playbook/任务级别配置ask_pass?报错求解
Ansible Playbook中设置ask_pass的正确方法
问题背景
已在ansible.cfg的[defaults]段配置ask_pass = false,多数服务器使用密钥认证。但针对未配置密钥认证的特定服务器,希望在Playbook中直接设置密码询问逻辑,而非使用--ask-pass命令行参数,配置后出现报错:
ERROR! 'ask_pass' is not a valid attribute for a Play
原因说明
ask_pass是Ansible全局配置项或连接插件参数,不属于Play级别的合法属性,因此不能直接写在Play的顶层字段中。
正确解决方案
方法1:在Inventory中针对特定主机/组设置变量
在项目的inventory文件(如hosts)中,给需要密码认证的主机或组添加ansible_ssh_ask_pass=true变量:
# 针对单个主机 [special_servers] server1.example.com ansible_ssh_ask_pass=true # 针对主机组批量设置 [special_servers] server1.example.com server2.example.com [special_servers:vars] ansible_ssh_ask_pass=true
方法2:在Playbook中通过变量指定
在Play的vars字段中设置ansible_ssh_ask_pass=true,可针对整个Play生效,或结合主机组仅作用于特定服务器:
--- - name: ping hosts: special_servers remote_user: student vars: ansible_ssh_ask_pass: true tasks: - name: pinging ping:
如果需要更精细的控制,可结合when条件判断:
--- - name: ping hosts: all remote_user: student vars: ansible_ssh_ask_pass: "{{ true if inventory_hostname in groups['special_servers'] else false }}" tasks: - name: pinging ping:
注意事项
ansible_ssh_ask_pass变量的优先级高于ansible.cfg中的ask_pass全局配置- 设置后,Ansible执行时会自动弹出密码输入提示,无需额外命令行参数
内容的提问来源于stack exchange,提问作者csx4
相关产品推荐
相关产品推荐

