GCP VM启动脚本获取实例主机名变量失效问题排查
问题原因
调用元数据服务的curl逻辑本身没有问题,变量不生效的核心原因是错误给变量赋值语句添加了sudo前缀,脚本里还存在一处Apache模块名的笔误:
sudo执行的命令运行在独立的特权子shell中,sudo vm_hostname="$(curl ...)"这行只是在临时拉起的子shell里定义了变量,子shell执行完毕后会直接销毁,当前运行脚本的shell环境根本获取不到这个变量的值,后续echo调用$vm_hostname时拿到的是空值,所以页面只显示固定的前缀文本。- 脚本中
sudo a2enmod SSL的模块名写法错误,Apache的SSL模块名为全小写的ssl,大写写法会触发模块不存在的报错,影响HTTPS站点正常启用。
修正后的脚本
#!/bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl # 修正模块名为全小写格式 sudo a2enmod ssl # 移除赋值语句前的sudo,元数据服务访问不需要root权限 vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/hostname)" # 仅给需要写入系统路径的tee命令加sudo,保证echo能正常读取当前shell的变量 echo "Page served from: $vm_hostname" | \ sudo tee /var/www/html/index.html
补充说明
GCP实例内部访问元数据服务端点169.254.169.254不需要root权限,无需给curl命令添加sudo;管道操作场景下,仅给真正需要特权的操作(比如写入/var/www/html/这类系统路径的tee命令)加sudo即可,前置命令在当前shell上下文运行才能正常读取自定义变量。
内容的提问来源于stack exchange,提问作者ckreisbe
相关产品推荐
相关产品推荐

