使用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
完成后使用浏览器测试: