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

如何让Puppet与Terraform协同完成Azure虚拟机配置管理

Terraform创建Azure VM后触发Puppet配置落地方案

关于按资源名称识别目标节点的说明

完全可以实现。Puppet默认通过节点上报的certname(证书名)做节点匹配,你只需要把Terraform中定义的VM资源名称,作为Puppet Agent注册时的certname,Puppet侧直接写对应名称的节点定义,就能精准匹配到目标节点,不需要额外的资源映射逻辑。

具体实现方式

生产环境最常用的是Agent预装自注册模式,不需要额外写通知逻辑,VM启动后自动对接Puppet拉取配置,稳定性最高:

  • 在Terraform定义VM资源时,通过custom_data传入云初始化脚本,在VM首次启动时自动安装Puppet Agent,指定certname为当前VM的Terraform资源名,同时配置Puppet Server地址,启动Agent服务。
  • 对应Terraform配置示例(Linux VM场景):
# 提前把Puppet Server地址、访问相关参数定义在变量里即可
resource "azurerm_linux_virtual_machine" "app_vm" {
  name                = "vm-app-prod-03" # 这个值就是后续Puppet识别的节点名
  resource_group_name = azurerm_resource_group.base.name
  location            = azurerm_resource_group.base.location
  size                = "Standard_B2s"
  admin_username      = "opsadmin"
  # 系统盘、网络接口等基础配置省略

  # 云初始化脚本,VM首次启动自动执行
  custom_data = base64encode(<<-BOOTSTRAP
#!/bin/bash
# 安装Puppet Agent,指定服务端地址和当前节点certname
curl -k https://${var.puppet_server_private_ip}:8140/packages/current/install.bash | \
  bash -s main:server=${var.puppet_server_fqdn} main:certname=${self.name}
# 设置Puppet Agent开机自启并立即启动,首次启动会自动向服务端拉取对应配置
/opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
BOOTSTRAP
  )
}
  • Puppet侧节点配置直接和VM资源名对齐即可:
# 节点名和Terraform里定义的VM name完全一致
node 'vm-app-prod-03' {
  # 这里放你预先写好的所有基础配置逻辑
  include base_hardening
  include docker_runtime
  include app_deploy
}

如果你用的是Puppet Bolt远程执行模式、或者需要Terraform在VM就绪后主动触发配置任务,可以在VM资源上添加local-exec provisioner,等VM网络连通后直接调用Puppet指令触发对应节点的配置运行:

resource "azurerm_linux_virtual_machine" "app_vm" {
  # 上述VM基础配置保持不变

  # 等待VM SSH端口就绪后触发Puppet任务
  provisioner "local-exec" {
    command = "puppet job run --nodes ${self.name} --environment prod"
    # 注意:执行Terraform的本地环境需要提前安装Puppet CLI,且完成和Puppet Server的认证
  }
}

注意事项

  • Azure侧NSG需要放通VM到Puppet Server 8140端口的出站规则,否则Agent无法和服务端通信
  • 如果使用自定义镜像,且镜像内已经预装了Puppet Agent,不需要重复执行安装步骤,只需要在初始化脚本里修改/etc/puppetlabs/puppet/puppet.conf中的certname配置为VM资源名,重启Agent服务即可
  • Puppet节点匹配支持通配符规则,如果是同角色批量创建的VM,可以在Terraform里按统一命名规则设置VM名称,Puppet侧用node 'vm-app-prod-*'这类通配符规则匹配整组节点,不需要逐个编写节点定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:09:47