问:“不与指定的 remote_user:root 连接,而是与用户 'ansible' 连接。”
A:很可能remote_user 被变量ansible_user 覆盖。该变量具有更高的precedence。见最后一节。例如
- set_fact:
ansible_user: admin
- command: whoami
remote_user: root
register: result
- debug:
var: result.stdout
给
"result.stdout": "admin"
没有变量ansible_user 这应该可以工作。 remote_user 在任务级别定义。例如,
- command: whoami
remote_user: admin
register: result
- debug:
var: result.stdout
- command: whoami
remote_user: root
register: result
- debug:
var: result.stdout
给
"result.stdout": "admin"
"result.stdout": "root"
调试
将调试任务放入代码中,查看变量ansible_user 的值。例如
- debug:
var: ansible_user
- name: "Create 'ansible' user"
remote_user: root
user:
name: "ansible"
使用ansible_user
如果没有机会覆盖该值,请使用ansible_user。
另见 SSH 连接插件的参数remote_user。 remote_user 是 Ansible 配置中的参数。相反,也可以使用变量ansible_user 从剧本或任务中更改远程用户。该变量具有最高的preference。见最后一节。例如
- command: whoami
register: result
vars:
ansible_user: admin
- debug:
var: result.stdout
- command: whoami
register: result
vars:
ansible_user: root
- debug:
var: result.stdout
按预期工作并给予
"result.stdout": "admin"
"result.stdout": "root"
}
Best practice是使用public key authentication和ssh-agent提供的私钥密码。
禁用 root 登录
但是,最好的做法是Disable root login:“使用普通用户帐户来启动您的连接,以及 sudo。” 例如
- command: whoami
register: result
become: true
become_method: sudo
become_user: root
vars:
ansible_user: admin
- debug:
var: result.stdout
给予
"result.stdout": "root"
当然必须允许远程用户管理员sudo
root@test_01> cat /usr/local/etc/sudoers
...
admin ALL=(ALL) NOPASSWD: ALL
优先级
有必要了解许多配置参数可以被从游戏级别到任务级别的变量覆盖。在大多数情况下,这些变量是通过添加前缀ansible_ 从参数名称创建的。变量ansible_user 和参数remote_user 是一个异常(FWIW,我不知道有任何其他异常)。
记住variables got precedence over playbook's keywords也很重要。
例如,become directives 也可以指定为变量。例如
- command: whoami
register: result
vars:
ansible_user: admin
ansible_become: true
ansible_become_method: sudo
ansible_become_user: root
- debug:
var: result.stdout
给予
"result.stdout": "root"