更新 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
.
我目前在我的 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
.