如何为 Ansible 连接设置默认 SSH 用户

AnsibleAnsibleBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

Ansible 是一个强大的自动化工具,它简化了对远程服务器的管理。Ansible 的一个关键方面是能够建立与这些服务器的安全 SSH 连接。在本教程中,我们将探讨如何为 Ansible 连接设置默认 SSH 用户,从而确保你的服务器管理任务拥有流畅而高效的工作流程。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 中级 级别的实验,完成率为 71%。获得了学习者 100% 的好评率。

安装和设置 Ansible

在为 Ansible 配置 SSH 用户之前,我们需要确保 Ansible 已正确安装并在我们的系统上设置完毕。

安装 Ansible

让我们从安装 Ansible 开始。打开一个终端并运行以下命令:

sudo apt update
sudo apt install -y ansible

安装完成后,通过检查 Ansible 的版本来验证它是否已正确安装:

ansible --version

你应该看到类似于以下的输出:

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (main, Ubuntu, x86_64)
  jinja version = 3.0.3
  libyaml = True

创建 Ansible 工作目录

接下来,让我们为我们的 Ansible 项目创建一个目录结构。这将帮助我们保持文件的组织性:

mkdir -p ~/project/ansible/inventory
cd ~/project/ansible

创建一个基本的清单文件

Ansible 使用清单文件来定义它管理的宿主机。让我们创建一个简单的清单文件:

echo "[webservers]
localhost ansible_connection=local" > ~/project/ansible/inventory/hosts

这个清单文件定义了一个名为 webservers 的组,其中只有一个宿主机 localhost,并告诉 Ansible 对此宿主机使用本地连接而不是 SSH。

现在,让我们验证我们的清单:

ansible -i inventory/hosts --list-hosts all

你应该看到类似这样的输出:

  hosts (1):
    localhost

这表明 Ansible 识别了我们的清单以及其中定义的宿主机。

理解 Ansible SSH 连接和配置

Ansible 主要使用 SSH 连接到远程宿主机并执行命令。让我们探讨 Ansible 如何建立 SSH 连接以及我们如何配置默认的 SSH 用户。

Ansible 如何使用 SSH

默认情况下,Ansible 尝试使用你当前的系统用户来建立 SSH 连接。这意味着如果你以 labex 用户的身份登录并运行 Ansible 命令,Ansible 将尝试以 labex 用户的身份连接到远程宿主机。

这种默认行为可能并不总是你想要的。例如:

  • 远程服务器可能需要不同的用户才能访问
  • 你可能希望使用一个专用的用户来执行自动化任务
  • 不同的服务器可能需要不同的用户

Ansible 配置层次结构

Ansible 使用配置源的层次结构来确定使用哪个 SSH 用户:

  1. 命令行选项(最高优先级)
  2. 剧本中特定于任务的选项
  3. 清单中的宿主机和组变量
  4. Ansible 配置文件
  5. 默认值(最低优先级)

让我们创建一个基本的 Ansible 配置文件来更好地理解这一点:

cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF

此配置文件告诉 Ansible:

  • 默认使用我们的清单文件
  • 禁用宿主机密钥检查(对在实验环境中的测试很有用)

让我们回顾一下我们刚刚创建的文件:

cat ~/project/ansible/ansible.cfg

你应该看到我们刚刚添加到文件的内容。

测试一个基本的 Ansible 命令

现在让我们运行一个基本的 Ansible 命令来查看当前用户:

cd ~/project/ansible
ansible localhost -m command -a "whoami"

输出应该显示:

localhost | CHANGED | rc=0 >>
labex

这确认了 Ansible 正在以当前用户 (labex) 的身份执行命令。

为 Ansible 设置默认 SSH 用户

现在我们了解了 Ansible 如何使用 SSH,让我们探索设置连接默认 SSH 用户的不同方法。

方法 1:使用 Ansible 配置文件

设置全局默认 SSH 用户最简单的方法是通过 Ansible 配置文件。让我们修改我们的 ansible.cfg 文件:

cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
remote_user = ansible_user
EOF

在此配置中,我们添加了 remote_user 参数,该参数告诉 Ansible 将 ansible_user 用作所有连接的默认 SSH 用户。

方法 2:在清单文件中设置用户

另一种方法是在清单文件中定义 SSH 用户。这种方法允许你为不同的宿主机或组设置不同的用户。

让我们修改我们的清单文件:

cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local

[dbservers]
db.example.com ansible_user=db_admin

[all:vars]
ansible_user=default_user
EOF

在这个例子中:

  • 我们添加了一个名为 dbservers 的新组,其中包含一个宿主机 db.example.com,并指定 Ansible 在连接到此宿主机时应使用 db_admin 用户。
  • 我们还添加了一个组变量 ansible_user=default_user,该变量适用于所有宿主机,除非被覆盖。

方法 3:使用命令行选项

你还可以在运行 Ansible 命令时直接在命令行中指定 SSH 用户:

ansible localhost -m command -a "whoami" -u specific_user

-u 选项告诉 Ansible 对此特定命令使用 specific_user,从而覆盖在配置文件或清单中定义的任何用户。

方法 4:在剧本中设置用户

在使用 Ansible 剧本时,你可以在 play 级别指定 SSH 用户:

让我们创建一个简单的剧本来演示这一点:

cat > ~/project/ansible/user_demo.yml << 'EOF'
---
- name: Demonstrate user configuration
  hosts: localhost
  remote_user: playbook_user
  
  tasks:
    - name: Show current user
      command: whoami
      register: current_user
      
    - name: Display current user
      debug:
        msg: "Current user is {{ current_user.stdout }}"
EOF

在此剧本中,remote_user 参数将 SSH 用户设置为 playbook_user,用于此 play 中的所有任务。

Ansible 中的用户优先级

了解这些不同方法的优先级非常重要:

  1. 命令行选项(-u 标志)具有最高优先级
  2. 剧本中的任务级设置
  3. 剧本中的 play 级设置
  4. 清单中的宿主机变量
  5. 清单中的组变量
  6. 配置文件设置(ansible.cfg 中的 remote_user
  7. 默认系统用户(最低优先级)

这意味着更具体的用户设置会覆盖更通用的设置。

测试和验证 SSH 用户配置

现在我们已经以不同的方式配置了默认的 SSH 用户,让我们测试并验证我们的配置。

测试配置文件设置

首先,让我们运行一个简单的 Ansible 命令,看看我们的配置文件设置是否已应用:

cd ~/project/ansible
ansible localhost -m command -a "whoami"

由于我们使用 ansible_connection=local 连接到 localhost,因此无论 remote_user 设置如何,Ansible 仍将以当前用户身份运行命令。但是,如果这是一个远程连接,Ansible 将尝试使用我们在配置中指定的 ansible_user 用户。

使用 ansible-inventory 检查用户设置

Ansible 提供了一个名为 ansible-inventory 的命令,它允许我们查看 Ansible 如何解释我们的清单,包括 SSH 用户设置:

ansible-inventory --list

此命令输出清单的 JSON 表示形式,显示与每个宿主机关联的所有变量,包括 SSH 用户设置。

使用剧本测试用户设置

让我们运行我们在上一步中创建的剧本:

ansible-playbook user_demo.yml

输出将显示类似内容:

PLAY [Demonstrate user configuration] ******************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Show current user] *******************************************************
changed: [localhost]

TASK [Display current user] ****************************************************
ok: [localhost] => {
    "msg": "Current user is labex"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

输出显示该命令仍然以 labex 用户身份执行,这是预期的,因为我们使用 ansible_connection=local 连接到 localhost。

创建一个真实的 SSH 用户配置示例

让我们创建一个更实际的示例,演示如何为远程宿主机设置 SSH 用户配置。我们将创建一个新的剧本:

cat > ~/project/ansible/remote_user_example.yml << 'EOF'
---
- name: Example of remote user configuration
  hosts: all
  remote_user: admin_user
  
  tasks:
    - name: This task uses the play-level user (admin_user)
      debug:
        msg: "This would run as admin_user"
      
    - name: This task uses a specific user
      debug:
        msg: "This would run as operator_user"
      remote_user: operator_user
      
    - name: This task uses become to elevate privileges
      debug:
        msg: "This would run as the root user"
      become: true
      become_user: root
EOF

在此剧本中:

  • 我们在 play 级别设置了 remote_user: admin_user,这默认适用于所有任务
  • 第二个任务使用 remote_user: operator_user 覆盖了此设置
  • 第三个任务使用 become: true 将权限提升到 root 用户

此示例显示了你可以在 Ansible 中配置 SSH 用户的不同级别。

高级 SSH 用户配置和故障排除

现在我们已经介绍了为 Ansible 设置默认 SSH 用户的基础知识,让我们探索一些高级技术和故障排除步骤。

在 Ansible 中使用 SSH 密钥

连接到远程宿主机时,最佳实践是使用 SSH 密钥身份验证而不是密码。让我们看看如何在 Ansible 中配置 SSH 密钥身份验证:

cat > ~/project/ansible/ssh_key_example.yml << 'EOF'
---
- name: Example using SSH key authentication
  hosts: all
  remote_user: secure_user
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
  
  tasks:
    - name: Show SSH connection details
      debug:
        msg: "Connecting as {{ ansible_user }} using key {{ ansible_ssh_private_key_file }}"
EOF

在这个例子中:

  • 我们将 remote_user: secure_user 设置为默认的 SSH 用户
  • 我们使用 ansible_ssh_private_key_file 指定要使用的 SSH 私钥文件

为不同的环境设置不同的用户

在实际场景中,你可能希望为不同的环境(开发、预发布、生产)使用不同的 SSH 用户。让我们看看如何实现这一点:

mkdir -p ~/project/ansible/group_vars

现在,让我们为不同的环境创建组变量文件:

cat > ~/project/ansible/group_vars/development << 'EOF'
---
ansible_user: dev_user
EOF

cat > ~/project/ansible/group_vars/production << 'EOF'
---
ansible_user: prod_user
ansible_ssh_private_key_file: ~/.ssh/prod_key
EOF

更新清单文件以包含这些环境组:

cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local

[development]
dev.example.com

[production]
prod1.example.com
prod2.example.com

[all:vars]
ansible_user=default_user
EOF

使用此配置:

  • development 组中的宿主机将使用 dev_user SSH 用户
  • production 组中的宿主机将使用 prod_user SSH 用户和特定的 SSH 密钥
  • 所有其他宿主机将使用 default_user SSH 用户

故障排除 SSH 用户配置

如果你在 Ansible 中遇到 SSH 用户配置问题,以下是一些故障排除步骤:

1. 检查 Ansible 解释的清单

要查看 Ansible 如何解释你的清单,包括所有变量值:

ansible-inventory --list

2. 使用详细模式运行 Ansible

使用增加的详细模式运行 Ansible 可以帮助识别连接问题:

ansible localhost -m ping -vvv

-vvv 标志增加了详细级别,显示有关 SSH 连接过程的详细信息。

3. 手动测试 SSH 连接

你可以手动测试 SSH 连接,以验证用户和密钥是否有效:

ssh -i ~/.ssh/id_rsa username@hostname

4. 检查 SSH 连接错误

常见的 SSH 连接错误包括:

  • Permission denied (publickey):这表示 SSH 密钥身份验证存在问题
  • Host key verification failed:当宿主机密钥已更改时发生
  • Connection refused:这表示 SSH 服务未运行或被防火墙阻止

5. 创建一个 Ansible 配置测试剧本

让我们创建一个简单的剧本来测试我们的 SSH 用户配置:

cat > ~/project/ansible/test_ssh_config.yml << 'EOF'
---
- name: Test SSH user configuration
  hosts: all
  gather_facts: no
  
  tasks:
    - name: Display connection information
      debug:
        msg: |
          Connected to: {{ inventory_hostname }}
          User: {{ ansible_user | default('not set') }}
          SSH Key: {{ ansible_ssh_private_key_file | default('not set') }}
EOF

运行此剧本以查看每个宿主机的连接信息:

ansible-playbook -i inventory/hosts test_ssh_config.yml

此剧本将向你显示 Ansible 正在为每个宿主机使用的 SSH 用户和密钥,这可以帮助识别配置问题。

总结

在这个实验中,你已经学习了如何使用各种方法配置 Ansible 连接的默认 SSH 用户。你现在了解如何:

  1. 安装并设置 Ansible 以及基本配置
  2. 通过 Ansible 配置文件配置默认 SSH 用户
  3. 在不同的级别设置 SSH 用户:清单、剧本和命令行
  4. 验证和测试你的 SSH 用户配置
  5. 排除常见的 SSH 连接问题

这些技能将使你能够使用 Ansible 更有效地管理你的基础设施,确保与远程服务器的安全可靠连接。通过正确配置 Ansible 连接的 SSH 用户,你可以在不同的环境中实施一致的自动化工作流程,同时保持适当的安全实践。