如果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
子句来检查是否在您将其称为角色之前,使用的事实是否为空。