如何结合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工具连接:
- 先建立隧道:
az ssh vm --ip 1.2.3.4 -- -L 2222:localhost:22
- 在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
相关产品推荐
相关产品推荐

