如何通过Terraform为Windows EC2自动执行配置静态IP的batch脚本userdata
可行解决方案
问题根因
该问题核心是Terraform传递的user data未被EC2的EC2Config/EC2Launch组件正确识别执行,常见原因有3个:
- 手动对user data做了多余的base64编码:
aws_instance资源的user_data参数默认会自动做base64编码,你手动编码后EC2无法正常解析内容 - 网卡名称写死不通用:不同Windows AMI版本、网卡挂载顺序会导致第二块网卡名称不一定是
Ethernet 3 - 缺少日志排查逻辑:脚本实际是否运行、运行报错信息无法追踪
修正后配置方案
方案1:内联user data写法(无需单独维护bat文件,推荐)
# 直接用user_data参数,不要手动base64编码 user_data = <<EOF <script> :: 开启日志输出,方便后续排查 echo %date% %time% user data 执行开始 >> C:\user_data_run_log.txt setlocal enabledelayedexpansion :: 动态匹配第二块以太网网卡,避免硬编码名称 for /f "skip=3 tokens=3*" %%a in ('netsh interface show interface ^| findstr /i "Ethernet"') do ( set "nic_name=%%a %%b" echo 识别到网卡: !nic_name! >> C:\user_data_run_log.txt :: 跳过第一块默认网卡,配置第二块 if "!nic_name!" neq "Ethernet" ( netsh interface ipv4 set address name="!nic_name!" static 10.*.*.* 255.*.*.* >> C:\user_data_run_log.txt 2>&1 echo 已为!nic_name!配置静态IP >> C:\user_data_run_log.txt ) ) echo %date% %time% user data 执行结束 >> C:\user_data_run_log.txt </script> <persist>true</persist> EOF
方案2:外部bat文件写法
首先修改build/Windows_network_adp.bat内容,增加动态匹配和日志逻辑:
<script> echo %date% %time% user data 执行开始 >> C:\user_data_run_log.txt setlocal enabledelayedexpansion for /f "skip=3 tokens=3*" %%a in ('netsh interface show interface ^| findstr /i "Ethernet"') do ( set "nic_name=%%a %%b" echo 识别到网卡: !nic_name! >> C:\user_data_run_log.txt if "!nic_name!" neq "Ethernet" ( netsh interface ipv4 set address name="!nic_name!" static 10.*.*.* 255.*.*.* >> C:\user_data_run_log.txt 2>&1 echo 已为!nic_name!配置静态IP >> C:\user_data_run_log.txt ) ) echo %date% %time% user data 执行结束 >> C:\user_data_run_log.txt </script> <persist>true</persist>
对应Terraform配置改为:
user_data = file("build/Windows_network_adp.bat")
验证与异常排查
实例启动完成后登录系统,查看C:\user_data_run_log.txt即可确认脚本是否执行、执行报错信息:
- 如果日志存在且无报错,网卡仍为DHCP:确认你配置的静态IP属于第二块网卡所属子网的可用IP段
- 如果日志不存在:确认你使用的Windows AMI未禁用EC2Launch/EC2Config的user data执行功能,默认官方AMI都是开启的
- 如果日志提示权限不足:在
netsh命令前添加runas /user:administrator /savecred以管理员权限执行
内容的提问来源于stack exchange,提问作者Kimberley
相关产品推荐
相关产品推荐

