【问题标题】:ansible connects with default remote_user even if I specify another one即使我指定了另一个,ansible 也会与默认的 remote_user 连接
【发布时间】:2020-05-16 08:47:38
【问题描述】:

我使用主机上的 ansible 模块创建了一个虚拟 linux 服务器。这工作正常。 下一个任务应该使用添加用户“ansible”

- include: task-files/users_create_ansible_user.yml
    delegate_to: '{{ createdserver.ipv4_address }}'
    remote_user: root

如您所见,我在此处添加了 remote_user(我还将它添加到包含的任务中)。

但是尽管有这两个 remote_user 条目,它仍然会尝试与 ansible.cfg 中设置的 remote_user 连接(我将 remote_user 设置为“ansible”,因为我想在创建该用户后对其执行以下所有任务)。

更多详情:

这是包含的任务文件中的第一个任务(失败)

- name: "Create 'ansible' user"
  remote_user: root
  user:
    name: "ansible"

返回

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}'

如您所见,它没有与指定的 remote_user: root 连接,而是与用户“ansible”(尚未创建)连接。当我将 ansible.cfg 中的 remote_user 更改为 root 时……它可以在这里连接。

谁能指导我理解我的误解?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    问:“不与指定的 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_userremote_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 authenticationssh-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"
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2020-08-22
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多