即使我指定了另一个用户,ansible也会与默认的remote_user连接

and*_*mel 2 ansible

我使用主机上的 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时...它可以连接到这里。

谁能指导我纠正我的错误观念?

Vla*_*tka 6

问:“不与指定的remote_userroot 连接,而是与用户 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_userRemote_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)