compute-nest-best-practice/opensource/vault/single.yaml (365 lines of code) (raw):
ROSTemplateFormatVersion: '2015-09-01'
Description:
zh-cn: 单节点Vault部署,支持付费类型选择,自动配置ECS、安全组、存储及网络,集成TLS加密,提供内网与可选公网访问。
en: Single-node Vault deployment with support for selecting payment tiers, automatically
configuring ECS (Elastic Compute Service), security groups, storage, and networking,
integrated with TLS encryption, offering both internal network access and optional
public internet accessibility.
# 参数配置
Parameters:
PayType:
Type: String
Label:
en: ECS Instance Charge Type
zh-cn: 付费类型
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
AssociationProperty: ChargeType
AssociationPropertyMetadata:
LocaleKey: InstanceChargeType
PayPeriodUnit:
Type: String
Label:
en: Pay Period Unit
zh-cn: 购买资源时长周期
Default: Month
AllowedValues:
- Month
- Year
AssociationProperty: PayPeriodUnit
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
PayPeriod:
Type: Number
Description:
en: When the resource purchase duration is Month, the value of Period ranges from 1 to 9, 12, 24, 36, 48, or 60. <br><b><font color='red'> When ECS instance types are PrePaid valid </b></font>
zh-cn: 当购买资源时长为Month时,Period取值:1~9 <br><b><font color='red'>当ECS实例类型为PrePaid有效</b></font>
Label:
en: Period
zh-cn: 购买资源时长
Default: 1
AllowedValues:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AssociationProperty: PayPeriod
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
ZoneId:
Type: String
AssociationProperty: ALIYUN::ECS::Instance::ZoneId
Label:
en: VSwitch Availability Zone
zh-cn: 交换机可用区
VpcId:
AssociationProperty: ALIYUN::ECS::VPC::VPCId
Type: String
Description:
en: Please search the ID starting with (vpc-xxx) from console-Virtual Private Cloud
zh-cn: 现有虚拟专有网络的实例ID
Label:
en: VPC ID
zh-cn: 专有网络VPC实例ID
VSwitchId:
AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
AssociationPropertyMetadata:
VpcId: ${VpcId}
ZoneId: ${ZoneId}
Type: String
Description:
en: Instance ID of existing business network switches, console-Virtual Private Cloud-VSwitches under query
zh-cn: 现有业务网络交换机的实例ID
Label:
en: VSwitch ID
zh-cn: 交换机实例ID
EcsInstanceType:
Type: String
Label:
en: Instance Type
zh-cn: 实例类型
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceChargeType: ${InstanceChargeType}
AllocatePublicIp:
Default: true
Type: Boolean
Label:
zh-cn: 开启公网IP
en: allocate public ip
InternetMaxBandwidthOut:
Default: 5
Type: Number
Label:
zh-cn: 流量公网带宽
en: Internet Max Bandwidth Out
MinValue: 0
MaxValue: 100
Description:
zh-cn: 取值范围0-100, 0为不开公网ip
en: no public ip if zero
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Equals:
- ${AllocatePublicIp}
- true
InstancePassword:
NoEcho: true
Type: String
Description:
en: Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ Special symbol in)
zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)
Label:
en: Instance Password
zh-cn: 实例密码
ConstraintDescription:
en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ Special symbol in)
zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)
AssociationProperty: ALIYUN::ECS::Instance::Password
AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
MinLength: 8
MaxLength: 30
TlsCert:
Type: String
Label:
en: TLS certificate
zh-cn: TLS证书
Description:
en: The TLS certificate when using https to access vault server
zh-cn: 使用https协议访问Vault服务端,用来进行端到端加密的TLS证书
NoEcho: true
AssociationProperty: FileContent
TextArea: true
TlsKey:
Type: String
Label:
en: TLS key
zh-cn: TLS key
Description:
en: The TLS key when using https to access vault server
zh-cn: 使用https协议访问Vault服务端,用来进行端到端加密的TLS key
NoEcho: true
AssociationProperty: FileContent
TextArea: true
Conditions:
IfAllocatePublicIp:
Fn::Equals:
- Ref: AllocatePublicIp
- true
# 资源配置
Resources:
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: VpcId
# 安全组入端口
SecurityGroupIngress:
- PortRange: 8200/8200
Priority: 1
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
# 定义waitCondition和waitConditionHandle来等待跳板机命令执行完毕部署成功
WaitCondition:
Type: ALIYUN::ROS::WaitCondition
Properties:
Count: 1
Handle:
Ref: WaitConditionHandle
Timeout: 240
WaitConditionHandle:
Type: ALIYUN::ROS::WaitConditionHandle
EcsInstanceGroup:
Type: ALIYUN::ECS::InstanceGroup
Properties:
# 实例名
InstanceName:
Fn::Join:
- '-'
- - Ref: ALIYUN::StackName
- '[1,4]'
IoOptimized: optimized
# 付费类型
InstanceChargeType:
Ref: PayType
PeriodUnit:
Ref: PayPeriodUnit
Period:
Ref: PayPeriod
# 网络配置
VpcId:
Ref: VpcId
ZoneId:
Ref: ZoneId
VSwitchId:
Ref: VSwitchId
SecurityGroupId:
Ref: EcsSecurityGroup
# 磁盘类型和大小
SystemDiskCategory: cloud_essd
SystemDiskSize: 200
DiskMappings:
- Category: cloud_essd
Size: 200
MaxAmount: 1
# 镜像
ImageId: centos_7
# 实例类型
InstanceType:
Ref: EcsInstanceType
Password:
Ref: InstancePassword
# 公网带宽
InternetMaxBandwidthOut:
Fn::If:
- IfAllocatePublicIp
- Ref: InternetMaxBandwidthOut
- 0
InstanceRunCommand:
Type: ALIYUN::ECS::RunCommand
Properties:
CommandContent:
Fn::Sub:
- |
#!/bin/bash
set -x
init_and_mount_data_disk() {
local fs_type=$1
local mount_point=$2
# 找出磁盘设备(排除分区)
devices=(`lsblk -o NAME,FSTYPE --noheadings --nodeps | awk '$2 == "" {print $1}'`)
# 找出不存在文件系统的磁盘设备
for device in ${!devices[@]};
do
lsblk -o NAME,FSTYPE --noheadings | awk '$2 != "" {print $1}' | grep ${!device}
if [[ $? -eq 1 ]]; then
data_disk=${!device}
break
fi
done
# 为数据盘创建文件系统
mkfs -t ${!fs_type} /dev/${!data_disk}
cp /etc/fstab /etc/fstab.bak
mkdir ${!mount_point}
# 更新/etc/fstab并挂载磁盘
echo `blkid /dev/${!data_disk} | awk '{print $2}' | sed 's/\\\"//g'` ${!mount_point} ext4 defaults 0 0 >> /etc/fstab
mount -a
}
# 挂盘到/opt/vault
init_and_mount_data_disk ext4 /opt/vault
wget '{{ computenest::file::vault }}'
rpm -ivh vault-*.rpm
cp /etc/vault.d/vault.hcl /etc/vault.d/vault.hcl.default
cat > /etc/vault.d/vault.hcl <<"EOF"
# Full configuration options can be found at https://www.vaultproject.io/docs/configuration
ui = true
mlock = true
storage "file" {
path = "/opt/vault/data"
}
# HTTPS listener
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/opt/vault/tls/tls.crt"
tls_key_file = "/opt/vault/tls/tls.key"
}
EOF
cp /opt/vault/tls/tls.crt /opt/vault/tls/tls.crt.default
cp /opt/vault/tls/tls.key /opt/vault/tls/tls.key.default
cat > /opt/vault/tls/tls.crt <<"EOF"
${TlsCert}
EOF
cat > /opt/vault/tls/tls.key << "EOF"
${TlsKey}
EOF
systemctl enable vault
# 启动Vault服务,但是Vault服务端还没有初始化
# 用户必须手工初始化,并妥善保存unseal keys和root token
systemctl start vault
# 执行成功回调WaitCondition结束waitCondition的等待
${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
# 获取到waitConditionHandle的地址放到 ${CurlCli}变量里
- CurlCli:
Fn::GetAtt:
- WaitConditionHandle
- CurlCli
TlsCert:
Ref: TlsCert
TlsKey:
Ref: TlsKey
Type: RunShellScript
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
Timeout: '240'
# 定义输出
Outputs:
PrivateEndpoint:
Description:
zh-cn: 内网访问地址
en: Private web address
Value:
Fn::Sub:
- https://${ServerAddress}:8200
- ServerAddress:
Fn::Select:
- 0
- Fn::GetAtt:
- EcsInstanceGroup
- PrivateIps
PublicEndpoint:
Condition: IfAllocatePublicIp
Description:
zh-cn: 公网访问地址
en: Public web Address
Value:
Fn::Sub:
- https://${ServerAddress}:8200
- ServerAddress:
Fn::Select:
- 0
- Fn::GetAtt:
- EcsInstanceGroup
- PublicIps
HowToStart:
Description:
zh-cn: 配置说明
Value: 1.Vault实例未初始化,请访问web页面或者远程登录ECS实例使用命令行进行初始化,获取unseal keys和root token并妥善保管。2.请将证书中的域名指向服务实例的公网IP,并通过域名访问以避免浏览器安全报警
Metadata:
ALIYUN::ROS::Interface:
# 分组信息
ParameterGroups:
- Parameters:
- PayType
- PayPeriodUnit
- PayPeriod
Label:
default:
en: PayType Configuration
zh-cn: 付费类型配置
- Parameters:
- ZoneId
Label:
default:
zh-cn: 可用区配置
en: Zone Configuration
- Parameters:
- VpcId
- VSwitchId
Label:
default:
zh-cn: 选择已有基础资源配置
en: Choose existing Infrastructure Configuration
- Parameters:
- EcsInstanceType
- AllocatePublicIp
- InternetMaxBandwidthOut
- InstancePassword
Label:
default:
en: Instance
zh-cn: ECS实例配置
- Parameters:
- TlsCert
- TlsKey
Label:
default:
en: Vault configuration
zh-cn: Vault配置