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

如何使用Ansible部署用于在Azure创建单台VM的Terraform模板?

别担心,用Ansible部署你的Azure单VM Terraform模板其实没那么复杂,我一步步给你拆解清楚:

核心思路

Ansible是通过调用community.general.terraform模块来整合Terraform工作流的——简单说就是让Ansible帮你自动执行terraform init、terraform apply这些你之前手动跑的命令,同时帮你管理环境变量和文件复制的细节。

步骤1:准备依赖

首先得确保你的Ansible控制节点(就是你跑Ansible的机器)上装了这些东西:

  • Ansible:不多说,基础工具
  • Terraform:和你之前手动部署用的版本一致就行
  • community.general集合:因为terraform模块属于这个集合,执行命令安装:
    ansible-galaxy collection install community.general
    
步骤2:编写Ansible Playbook

下面是一个完整的示例Playbook,你可以直接参考修改:

---
- name: 用Ansible调用Terraform部署Azure VM
  hosts: localhost
  connection: local
  gather_facts: false
  vars:
    # Terraform工作目录(临时存放模板文件和状态文件)
    tf_work_dir: "/tmp/azure_vm_terraform"
    # Azure认证信息(建议用Ansible Vault加密,别明文写!)
    azure_client_id: "{{ your_client_id }}"
    azure_client_secret: "{{ your_client_secret }}"
    azure_tenant_id: "{{ your_tenant_id }}"
    azure_subscription_id: "{{ your_subscription_id }}"
    # 你的Terraform模板需要的变量(根据自己的variables.tf调整)
    vm_name: "my-ansible-tf-vm"
    vm_size: "Standard_D2s_v3"

  tasks:
    # 1. 创建Terraform工作目录
    - name: 初始化工作目录
      file:
        path: "{{ tf_work_dir }}"
        state: directory
        mode: '0755'

    # 2. 把你的Terraform模板文件复制到工作目录
    - name: 复制Terraform模板文件
      copy:
        src: "{{ item }}"
        dest: "{{ tf_work_dir }}/"
      loop:
        - ./main.tf
        - ./variables.tf
        - ./outputs.tf
      # 这里的src路径要对应你本地Terraform文件的实际位置

    # 3. 执行terraform init
    - name: 初始化Terraform
      community.general.terraform:
        project_path: "{{ tf_work_dir }}"
        state: present
        force_init: yes
      environment:
        # 传递Azure认证环境变量给Terraform
        AZURE_CLIENT_ID: "{{ azure_client_id }}"
        AZURE_CLIENT_SECRET: "{{ azure_client_secret }}"
        AZURE_TENANT_ID: "{{ azure_tenant_id }}"
        AZURE_SUBSCRIPTION_ID: "{{ azure_subscription_id }}"

    # 4. 执行terraform apply
    - name: 部署VM
      community.general.terraform:
        project_path: "{{ tf_work_dir }}"
        state: present
        # 传递Terraform变量
        variables:
          vm_name: "{{ vm_name }}"
          vm_size: "{{ vm_size }}"
      environment:
        AZURE_CLIENT_ID: "{{ azure_client_id }}"
        AZURE_CLIENT_SECRET: "{{ azure_client_secret }}"
        AZURE_TENANT_ID: "{{ azure_tenant_id }}"
        AZURE_SUBSCRIPTION_ID: "{{ azure_subscription_id }}"
      register: tf_output

    # 5. 显示Terraform输出结果(比如VM的公网IP)
    - name: 打印部署结果
      debug:
        var: tf_output.outputs
步骤3:安全处理Azure凭据

绝对不要把Azure服务主体的明文信息写在Playbook里!推荐用Ansible Vault加密:

  1. 创建一个单独的变量文件azure_creds.yml:
    azure_client_id: "你的client_id"
    azure_client_secret: "你的client_secret"
    azure_tenant_id: "你的tenant_id"
    azure_subscription_id: "你的subscription_id"
    
  2. 加密这个文件:
    ansible-vault encrypt azure_creds.yml
    
  3. 在Playbook里引用这个加密文件:

vars_files:
- ./azure_creds.yml

4. 运行Playbook时输入Vault密码:
```bash
ansible-playbook deploy_vm.yml --ask-vault-pass
步骤4:运行Playbook

执行命令启动部署:

ansible-playbook deploy_vm.yml
额外注意点
  • 如果你的Terraform模板已经配置了远程状态存储(比如Azure Blob),不用改Playbook,terraform init会自动识别并使用远程状态。
  • 要销毁VM的话,只需要把Playbook里的state: present改成state: absent再运行一次。
  • 可以先单独执行terraform plan查看部署计划,在Playbook里添加一个task:
    - name: 生成部署计划
      community.general.terraform:
        project_path: "{{ tf_work_dir }}"
        state: planned
        plan_file: "{{ tf_work_dir }}/tfplan"
      environment:
        AZURE_CLIENT_ID: "{{ azure_client_id }}"
        # ...其他环境变量
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:03:14