You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合az ssh vm(AADSSHLoginForLinux)与Ansible实现部署?

解决方案:通过Azure Entra ID凭据+az ssh部署Ansible Playbook

针对你遇到的Ansible无法直接调用az ssh vm、缺少对应SCP工具的问题,可通过以下步骤完成整合:

1. 编写az ssh包装脚本(解决ssh_executable限制)

Ansible的ssh_executable仅支持指定单个命令,无法直接传递az ssh vm的参数,因此需要写一个包装脚本解析Ansible传递的SSH参数,转换为az ssh vm的调用格式。

创建az-ssh-wrapper.sh脚本:

#!/bin/bash
HOST=""
SSH_OPTS=""

# 解析Ansible传递的参数,分离主机IP与SSH选项
for arg in "$@"; do
    if [[ "$arg" == *@* ]]; then
        HOST="${arg#*@}"
    elif [[ -z "$HOST" ]]; then
        SSH_OPTS="$SSH_OPTS $arg"
    fi
done

# 处理无@符号的主机参数
if [[ -z "$HOST" ]]; then
    HOST="${@: -1}"
    SSH_OPTS="${*% $HOST}"
fi

# 调用az ssh vm,将SSH选项通过--传递
exec az ssh vm --ip "$HOST" -- $SSH_OPTS

赋予脚本执行权限:

chmod +x az-ssh-wrapper.sh

2. 解决SCP文件传输问题

微软未提供az scp工具,可通过两种方案解决文件传输需求:

方案A:轻量SCP包装脚本(适合小文件)

创建az-scp-wrapper.sh脚本,利用az ssh vm的stdin/stdout模拟SCP功能:

#!/bin/bash
REMOTE=""
LOCAL=""
DIRECTION=""

# 识别远程路径与传输方向
for arg in "$@"; do
    if [[ "$arg" == *@*:* ]]; then
        REMOTE="$arg"
        HOST="${REMOTE%%:*}"
        HOST="${HOST#*@}"
        REMOTE_PATH="${REMOTE#*:}"
        [[ "$arg" == "$1" ]] && DIRECTION="upload" || DIRECTION="download"
        LOCAL="${@: -1}"
    fi
done

# 执行上传/下载操作
if [[ "$DIRECTION" == "upload" ]]; then
    cat "$LOCAL" | az ssh vm --ip "$HOST" -- "cat > $REMOTE_PATH"
elif [[ "$DIRECTION" == "download" ]]; then
    az ssh vm --ip "$HOST" -- "cat $REMOTE_PATH" > "$LOCAL"
fi

赋予执行权限:

chmod +x az-scp-wrapper.sh

方案B:SSH隧道转发(适合大文件/稳定传输)

通过az ssh vm建立本地端口转发,让Ansible使用原生SSH/SCP工具连接:

  1. 先建立隧道:
az ssh vm --ip 1.2.3.4 -- -L 2222:localhost:22
  1. 在Ansible inventory中配置本地转发端口:
[azure_vms]
127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user=your-entra-id-user

3. 配置Ansible使用包装脚本

在ansible.cfg中添加全局配置:

[defaults]
ssh_executable = /绝对路径/az-ssh-wrapper.sh
scp_if_ssh = True
transfer_executable = /绝对路径/az-scp-wrapper.sh

或在单个playbook中通过变量指定:

- name: 部署到Azure VM
  hosts: azure_vms
  vars:
    ansible_ssh_executable: /绝对路径/az-ssh-wrapper.sh
    ansible_scp_executable: /绝对路径/az-scp-wrapper.sh
  tasks:
    - name: 示例任务:安装nginx
      apt:
        name: nginx
        state: present

4. 验证执行

确保执行Ansible的用户已通过az login完成Azure身份验证,且属于对应Entra ID管理员组。测试执行playbook:

ansible-playbook -i inventory.yml your-playbook.yml

注意事项

  • 若Ansible传递的用户名格式为user@domain.com,需调整包装脚本的IP提取逻辑以适配。
  • 大文件传输优先使用SSH隧道方案,避免包装脚本的性能瓶颈。
  • 确保az命令在Ansible执行环境的PATH中。

内容的提问来源于stack exchange,提问作者daviewales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:26:28