如果ansible_user该剧本的“首次运行”方式有所不同,这就是我要做的事情(例如,如果您只有一个root用户,并且打算使用SSH密钥设置一个新用户):
- 与
ansible_pass使用密码登录名时(请记住要使用Vault)一样存储密码,这应该是您用于剧本“首次运行”的用户的密码。 
ansible_user当您在服务器上正确设置用户时,设置为您希望在首次运行后使用的用户的用户名。 
- 例如,将变量设置为
ansible_user_first_run要用于剧本“首次运行”的用户root。 
- 使用本地命令尝试使用正确的SSH密钥连接服务器,
ignore_errors并使用和changed_when: False 
- 如果失败,则更新
ansible_user为ansible_user_first_run 
这是代码:
---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed
注意:值得进行设置,transport = ssh因为在某些配置中paramiko可能意外地无法登录到服务器(例如,当服务器设置为不接受密码,并且您首先尝试输入密钥然后输入密码...很奇怪!) ssh传输也更快,因此还是值得的。
进一步说明:如果使用此方法,则需要gather_facts: false在剧本定义文件中进行指定,以便在进入测试密码阶段之前不会自动运行设置/事实收集任务。如果您需要任何有关事实的信息,则需要setup在访问诸如等位置通常可用的任何数据之前显式调用您的角色ansible_devices。执行此操作的一种好方法是调用setup一个when子句来检查是否在您将其称为角色之前,使用的事实是否为空。