我使用主机上的 ansible 模块创建了一个虚拟 Linux 服务器。这很好用。下一个任务应该使用添加用户“ansible”
- include: task-files/users_create_ansible_user.yml
delegate_to: '{{ createdserver.ipv4_address }}'
remote_user: root
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我在此处添加了remote_user(我还将其添加到了包含的任务中)。
但是,尽管有这两个remote_user条目,它仍然尝试与ansible.cfg中设置的remote_user连接(我将remote_user设置为“ansible”,因为我想在创建该用户后对其执行以下所有任务)。
更多细节:
这是包含的任务文件中的第一个任务(失败)
- name: "Create 'ansible' user"
remote_user: root
user:
name: "ansible"
Run Code Online (Sandbox Code Playgroud)
返回
fatal: [localhost]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ansible@116.203.119.43: Permission denied (publickey,password).", "unreachable": true}'
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它不与指定的remote_user: root 连接,而是与用户“ansible”(尚未创建)连接。当我将 ansible.cfg 中的remote_user更改为root时...它可以连接到这里。
谁能指导我纠正我的错误观念?
问:“不与指定的remote_user
root 连接,而是与用户 ansible 连接。”
答:很可能被remote_user
变量覆盖ansible_user
。该变量具有较高的优先级。请参阅最后一节。例如,
- set_fact:
ansible_user: admin
- command: whoami
remote_user: root
register: result
- debug:
var: result.stdout
Run Code Online (Sandbox Code Playgroud)
给
result.stdout: admin
Run Code Online (Sandbox Code Playgroud)
这应该在没有变量的情况下工作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
Run Code Online (Sandbox Code Playgroud)
给
result.stdout: admin
result.stdout: root
Run Code Online (Sandbox Code Playgroud)
调试
将调试任务放入代码中并查看变量的值ansible_user
。例如,
- debug:
var: ansible_user
- name: Create 'ansible' user
remote_user: root
user:
name: ansible
Run Code Online (Sandbox Code Playgroud)
使用 ansible_user
如果没有机会覆盖该值,请使用ansible_user
.
另请参阅SSH 连接插件的参数remote_user 。remote_user
是 Ansible 配置中的参数。相反,也可以使用变量ansible_user
从剧本或任务中更改远程用户。该变量具有最高优先级。请参阅最后一节。例如,
- command: whoami
register: result
vars:
ansible_user: admin
- debug:
var: result.stdout
- command: whoami
register: result
vars:
ansible_user: root
- debug:
var: result.stdout
Run Code Online (Sandbox Code Playgroud)
按预期工作并给予
result.stdout: admin
result.stdout: root
}
Run Code Online (Sandbox Code Playgroud)
最佳实践public key authentication
是与 提供的私钥密码一起使用ssh-agent
。
禁用 root 登录
最佳实践是禁用 root 登录:“使用普通用户帐户与 sudo 一起启动连接。” 例如,
- command: whoami
register: result
become: true
become_method: sudo
become_user: root
vars:
ansible_user: admin
- debug:
var: result.stdout
Run Code Online (Sandbox Code Playgroud)
给出
result.stdout: root
Run Code Online (Sandbox Code Playgroud)
sudo
当然,必须允许远程用户管理员
root@test_01> cat /usr/local/etc/sudoers
...
admin ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)
优先级
有必要了解许多配置参数可以被从游戏级别到任务级别的变量覆盖。在大多数情况下,这些变量是通过添加前缀从参数名称创建的ansible_
。变量ansible_user
和参数remote_user
是例外(FWIW,我不知道任何其他例外)。
同样重要的是要记住,变量优先于剧本的关键字。例如,指令变得也可以指定为变量。例如,
- command: whoami
register: result
vars:
ansible_user: admin
ansible_become: true
ansible_become_method: sudo
ansible_become_user: root
- debug:
var: result.stdout
Run Code Online (Sandbox Code Playgroud)
给出
result.stdout: root
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3086 次 |
最近记录: |