如何使用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加密:
- 创建一个单独的变量文件
azure_creds.yml:azure_client_id: "你的client_id" azure_client_secret: "你的client_secret" azure_tenant_id: "你的tenant_id" azure_subscription_id: "你的subscription_id" - 加密这个文件:
ansible-vault encrypt azure_creds.yml - 在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
相关产品推荐
相关产品推荐

