更新 Deployment Manager 部署时如何在 VM 实例上执行命令行脚本

How to Execute a Command Line script on a VM Instance When Updating a Deployment Manager Deployment

我目前在我的 vm.yaml 文件中有此配置,它设置了一个允许 http 请求并提供自定义 Hello World! 页面的 vm 实例,如 startup-scripts 部分中所指定:

resources:
- type: compute.v1.instance
  name: quickstart-deployment-vm
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/my_project/zones/us-central1-f/machineTypes/f1-micro
    disks:
      ...
    networkInterfaces:
      ...
    tags:
        items: ["http"]

    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          apt-get update
          apt-get install -y apache2
          echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' | sudo tee /var/www/html/index.html

- type: compute.v1.firewall
  name: tcp-firewall-rule
  properties:
    targetTags: ["http"]
    network: https://www.googleapis.com/compute/v1/projects/my_project/global/networks/default
    sourceRanges: ["0.0.0.0/0"]
    targetTags: ["http","http-server"]
    allowed:
     - IPProtocol: TCP
       ports: ["80"]

在 运行 gcloud deployment-manager deployments create vm-deploy --config vm.yaml 之后,我在访问虚拟机的外部 ip 时得到了预期的 Hello World! 响应。但是,我现在想更新此部署以更改响应的内容,比如 What's up, everyone! 但是,似乎我不能仅通过更改 startup-scripts 部分中的内容来做到这一点。我试着把它放在 vm-update.yaml 文件中:

resources:
- type: compute.v1.instance
  name: quickstart-deployment-vm
  properties:
    ...
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          apt-get update
          apt-get install -y apache2
          echo '<!doctype html><html><body><h1>What's up, everyone!</h1></body></html>' | sudo tee /var/www/html/index.html

- type: compute.v1.firewall
  name: tcp-firewall-rule
  properties:
    ...

和运行gcloud deployment-manager deployments update vm-deploy --config vm-update.yaml。但是响应和index.html文件没有变化,还是Hello World!。我猜这是因为 startup-script 仅在实例创建时执行,而不是在实例更新时执行。有谁知道我在更新虚拟机时如何使用部署管理器在我的虚拟机上执行脚本?

要使用 Deployment Manager 更新 index.html(在 运行 服务器中)并使更改“生效”,只需在更新 yaml 中添加一行 service apache2 reload echo 部分之后的文件;像这样:

    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          apt-get update
          apt-get install -y apache2
          echo '<!doctype html><html><body><h1>What's up, everyone!</h1></body></html>' | sudo tee /var/www/html/index.html
          service apache2 reload

这将重新加载服务(比 restart 更安全)并提供新的 index.html 文件。

或者您可以将添加的行更改为 reboot -n,但前提是它对您方便。只重启服务会快很多。

我发现的一个 'hack' 是我可以在 vm-update.yaml 中更改 VM 的 machineType,我相信这会迫使 VM 成为 rebooted/reinitialized,并且 运行 startup-script.