Skip to main content

使用Cloud-init对Azure Linux虚拟机进行定制化

分类:  Azure虚拟机 标签:  #虚拟机 #Linux #Azure #基础 发布于: 2023-05-27 21:00:12

我们在创建Azure Linux虚拟机之后,还需要对虚拟机进行配置,才能应用到日常的工作中,如果可以在创建虚拟机的同时,并在第一次启动的时候配置好相应的配置,那就更好了。cloud-init是目前用得很广泛的工具,我们本章使用cloud-init来为自己的业务完成自动配置,如果想对cloud-init了解更多,您可以参考网站:https://cloudinit.readthedocs.io/。

使用cloud-init可以完成如下的任务:

  • 安装软件

  • 创建文件

  • 配置用户

  • 配置安全策略

cloud-init只在虚拟机第一次启动时运行。

本教程的目标:

  • 创建一个cloud-init配置文件

  • 使用cloud-init配置文件创建虚拟机

  • 查看运行在VM上的node.js App

  • 使用Azure Key Vault创建和保护证书

  • 使用cloud-init自动部署nginx和node.js app

创建cloud-init配置文件

本配置文件会完成如下的任务:

  • 安装nginx

  • 配置nginx

  • 安装Node.js

  • 运行一个node.js Hello world app

使用自己喜爱的编辑器编辑一个cloud-init.txt的配置文件,文件内容如下:

#cloud-config
package_upgrade: true
packages:
- nginx
- nodejs
- npm
write_files:
- owner: www-data:www-data
path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
- owner: azureuser:azureuser
path: /home/azureuser/myapp/index.js
content: |
var express = require('express')
var app = express()
var os = require('os');
app.get('/', function (req, res) {
res.send('Hello World from host ' + os.hostname() + '!')
})
app.listen(3000, function () {
console.log('Hello world app listening on port 3000!')
})
runcmd:
- service nginx restart
- cd "/home/azureuser/myapp"
- npm init
- npm install express -y
- nodejs index.js

创建虚拟机

我们这里还是使用Azure CLI来创建需要的资源,需要注意的还是在开始之前要设置云环境,登录到云环境,然后设定自己的订阅:

az cloud set --name <云环境>
az login
az account set --subscription <your sub id>

注意这里云环境可以通过如下的命令得到所有的列表:

az cloud list -o table

创建资源组

使用如下的命令创建资源组:

az group create --name myResourceGroupAutomate --location chinaeast2

使用cloud-init.txt配置文件来创建虚拟机:

az vm create \
--resource-group myResourceGroupAutomate \
--name myAutomatedVM \
--image UbuntuLTS \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init.txt

等待创建完成之后,开通访问Azure虚拟机的端口

az vm open-port --port 80 --resource-group myResourceGroupAutomate --name myAutomatedVM

然后打开IP地址来测试:



使用cloud-init创建使用x509证书来加密的HTTPS Web服务

我们这一步中使用Azure Key Vault来生成和管理证书,关于什么是Azure Key Vault请参考文档:https://docs.microsoft.com/en-us/azure/key-vault/

使用Key Vault

先创建Key Vault

keyvault_name=mykeyvault
az keyvault create \
--resource-group myResourceGroupAutomate \
--name $keyvault_name \
--enabled-for-deployment

然后使用key valut来创建证书:

az keyvault certificate create \
--vault-name $keyvault_name \
--name mycert \
--policy "$(az keyvault certificate get-default-policy --output json)"

为虚拟机准备证书

secret=$(az keyvault secret list-versions \
--vault-name $keyvault_name \
--name mycert \
--query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secret "$secret" --output json)

创建一个新的cloud-init配置文件:cloud-init-secured.txt

#cloud-config
package_upgrade: true
packages:
- nginx
- nodejs
- npm
write_files:
- owner: www-data:www-data
path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.cert;
ssl_certificate_key /etc/nginx/ssl/mycert.prv;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
- owner: azureuser:azureuser
path: /home/azureuser/myapp/index.js
content: |
var express = require('express')
var app = express()
var os = require('os');
app.get('/', function (req, res) {
res.send('Hello World from host ' + os.hostname() + '!')
})
app.listen(3000, function () {
console.log('Hello world app listening on port 3000!')
})
runcmd:
- secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
- mkdir /etc/nginx/ssl
- cp $secretsname.crt /etc/nginx/ssl/mycert.cert
- cp $secretsname.prv /etc/nginx/ssl/mycert.prv
- service nginx restart
- cd "/home/azureuser/myapp"
- npm init
- npm install express -y
- nodejs index.js

然后使用该配置文件创建一个VM:

az vm create \
--resource-group myResourceGroupAutomate \
--name myVMWithCerts \
--image UbuntuLTS \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init-secured.txt \
--secrets "$vm_secret"

等候创建完成之后,打开端口:

az vm open-port \
--resource-group myResourceGroupAutomate \
--name myVMWithCerts \
--port 443

完成后使用浏览器测试: