Cloud Virtual Machine Provisioning
如何使用Terraform迅速在阿里云创建Pigsty部署所需的虚拟机资源
如果您手头没有 x86_64 架构的PC、笔记本、Mac,使用即用即毁的云虚拟机可能是另一个不错的选择。
Terraform
Terraform 是开源免费的 基础设施即代码 工具。您只需要声明好所需的云虚拟机、网络与安全组配置等,一键即可拉起对应的资源。
在MacOS下安装Terraform,只需要执行brew install terraform即可。然后您需要有云厂商账号,并获取AccessKey与AccessSecret凭证,充点钱,就可以开始云端沙箱部署之旅啦。
TF配置文件
项目根目录 terraform/ 中提供了若干云厂商的 Terraform 资源定义文件,您可以使用这些模板快速在云上申请虚拟机资源用于部署Pigsty。这里以阿里云为例:
1. cd terraform # 进入terraform目录中
2. vi alicloud.tf # 编辑配置文件,填入您的阿里云AccessKey与SecretKey
阿里云样例Terraform文件
1. provider "alicloud" {
2. access_key = "xxxxxx"
3. secret_key = "xxxxxx"
4. region = "cn-beijing"
5. }
7. # use 10.10.10.0/24 cidr block as demo network
8. resource "alicloud_vpc" "vpc" {
9. vpc_name = "pigsty-demo-network"
10. cidr_block = "10.10.10.0/24"
11. }
13. # add virtual switch for pigsty demo network
14. resource "alicloud_vswitch" "vsw" {
15. vpc_id = "${alicloud_vpc.vpc.id}"
16. cidr_block = "10.10.10.0/24"
17. zone_id = "cn-beijing-k"
18. }
20. # add default security group and allow all tcp traffic
21. resource "alicloud_security_group" "default" {
22. name = "default"
23. vpc_id = "${alicloud_vpc.vpc.id}"
24. }
25. resource "alicloud_security_group_rule" "allow_all_tcp" {
26. ip_protocol = "tcp"
27. type = "ingress"
28. nic_type = "intranet"
29. policy = "accept"
30. port_range = "1/65535"
31. priority = 1
32. security_group_id = "${alicloud_security_group.default.id}"
33. cidr_ip = "0.0.0.0/0"
34. }
36. # https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance
37. resource "alicloud_instance" "pg-meta-1" {
38. instance_name = "pg-meta-1"
39. host_name = "pg-meta-1"
40. instance_type = "ecs.s6-c1m2.small"
41. vswitch_id = "${alicloud_vswitch.vsw.id}"
42. security_groups = ["${alicloud_security_group.default.id}"]
43. image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
44. password = "PigstyDemo4"
45. private_ip = "10.10.10.10"
46. internet_max_bandwidth_out = 40 # 40Mbps , alloc a public IP
47. }
49. resource "alicloud_instance" "pg-test-1" {
50. instance_name = "pg-test-1"
51. host_name = "pg-test-1"
52. instance_type = "ecs.s6-c1m1.small"
53. vswitch_id = "${alicloud_vswitch.vsw.id}"
54. security_groups = ["${alicloud_security_group.default.id}"]
55. image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
56. password = "PigstyDemo4"
57. private_ip = "10.10.10.11"
58. }
60. resource "alicloud_instance" "pg-test-2" {
61. instance_name = "pg-test-2"
62. host_name = "pg-test-2"
63. instance_type = "ecs.s6-c1m1.small"
64. vswitch_id = "${alicloud_vswitch.vsw.id}"
65. security_groups = ["${alicloud_security_group.default.id}"]
66. image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
67. password = "PigstyDemo4"
68. private_ip = "10.10.10.12"
69. }
71. resource "alicloud_instance" "pg-test-3" {
72. instance_name = "pg-test-3"
73. host_name = "pg-test-3"
74. instance_type = "ecs.s6-c1m1.small"
75. vswitch_id = "${alicloud_vswitch.vsw.id}"
76. security_groups = ["${alicloud_security_group.default.id}"]
77. image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
78. password = "PigstyDemo4"
79. private_ip = "10.10.10.13"
80. }
83. output "meta_ip" {
84. value = "${alicloud_instance.pg-meta-1.public_ip}"
85. }
执行计划
首先,使用terraform命令,创建上面定义的云资源(共享1C1G临时用用很便宜,按需付费)
1. terraform init # 安装 terraform provider: aliyun (仅第一次需要)
2. terraform apply # 生成执行计划:创建虚拟机,虚拟网段/交换机/安全组
执行 apply 并输入 yes后,terraform会调用阿里云API创建对应的虚拟机资源。
Terraform Apply执行结果
1. Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
2. + create
4. Terraform will perform the following actions:
6. # alicloud_instance.pg-meta-1 will be created
7. + resource "alicloud_instance" "pg-meta-1" {
8. + availability_zone = (known after apply)
9. + credit_specification = (known after apply)
10. + deletion_protection = false
11. + dry_run = false
12. + host_name = "pg-meta-1"
13. + id = (known after apply)
14. + image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
15. + instance_charge_type = "PostPaid"
16. + instance_name = "pg-meta-1"
17. + instance_type = "ecs.s6-c1m2.small"
18. + internet_charge_type = "PayByTraffic"
19. + internet_max_bandwidth_in = (known after apply)
20. + internet_max_bandwidth_out = 40
21. + key_name = (known after apply)
22. + password = (sensitive value)
23. + private_ip = "10.10.10.10"
24. + public_ip = (known after apply)
25. + role_name = (known after apply)
26. + secondary_private_ip_address_count = (known after apply)
27. + secondary_private_ips = (known after apply)
28. + security_groups = (known after apply)
29. + spot_strategy = "NoSpot"
30. + status = "Running"
31. + subnet_id = (known after apply)
32. + system_disk_category = "cloud_efficiency"
33. + system_disk_performance_level = (known after apply)
34. + system_disk_size = 40
35. + volume_tags = (known after apply)
36. + vswitch_id = (known after apply)
37. }
39. # alicloud_instance.pg-test-1 will be created
40. + resource "alicloud_instance" "pg-test-1" {
41. + availability_zone = (known after apply)
42. + credit_specification = (known after apply)
43. + deletion_protection = false
44. + dry_run = false
45. + host_name = "pg-test-1"
46. + id = (known after apply)
47. + image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
48. + instance_charge_type = "PostPaid"
49. + instance_name = "pg-test-1"
50. + instance_type = "ecs.s6-c1m1.small"
51. + internet_max_bandwidth_in = (known after apply)
52. + internet_max_bandwidth_out = 0
53. + key_name = (known after apply)
54. + password = (sensitive value)
55. + private_ip = "10.10.10.11"
56. + public_ip = (known after apply)
57. + role_name = (known after apply)
58. + secondary_private_ip_address_count = (known after apply)
59. + secondary_private_ips = (known after apply)
60. + security_groups = (known after apply)
61. + spot_strategy = "NoSpot"
62. + status = "Running"
63. + subnet_id = (known after apply)
64. + system_disk_category = "cloud_efficiency"
65. + system_disk_performance_level = (known after apply)
66. + system_disk_size = 40
67. + volume_tags = (known after apply)
68. + vswitch_id = (known after apply)
69. }
71. # alicloud_instance.pg-test-2 will be created
72. + resource "alicloud_instance" "pg-test-2" {
73. + availability_zone = (known after apply)
74. + credit_specification = (known after apply)
75. + deletion_protection = false
76. + dry_run = false
77. + host_name = "pg-test-2"
78. + id = (known after apply)
79. + image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
80. + instance_charge_type = "PostPaid"
81. + instance_name = "pg-test-2"
82. + instance_type = "ecs.s6-c1m1.small"
83. + internet_max_bandwidth_in = (known after apply)
84. + internet_max_bandwidth_out = 0
85. + key_name = (known after apply)
86. + password = (sensitive value)
87. + private_ip = "10.10.10.12"
88. + public_ip = (known after apply)
89. + role_name = (known after apply)
90. + secondary_private_ip_address_count = (known after apply)
91. + secondary_private_ips = (known after apply)
92. + security_groups = (known after apply)
93. + spot_strategy = "NoSpot"
94. + status = "Running"
95. + subnet_id = (known after apply)
96. + system_disk_category = "cloud_efficiency"
97. + system_disk_performance_level = (known after apply)
98. + system_disk_size = 40
99. + volume_tags = (known after apply)
100. + vswitch_id = (known after apply)
101. }
103. # alicloud_instance.pg-test-3 will be created
104. + resource "alicloud_instance" "pg-test-3" {
105. + availability_zone = (known after apply)
106. + credit_specification = (known after apply)
107. + deletion_protection = false
108. + dry_run = false
109. + host_name = "pg-test-3"
110. + id = (known after apply)
111. + image_id = "centos_7_8_x64_20G_alibase_20200914.vhd"
112. + instance_charge_type = "PostPaid"
113. + instance_name = "pg-test-3"
114. + instance_type = "ecs.s6-c1m1.small"
115. + internet_max_bandwidth_in = (known after apply)
116. + internet_max_bandwidth_out = 0
117. + key_name = (known after apply)
118. + password = (sensitive value)
119. + private_ip = "10.10.10.13"
120. + public_ip = (known after apply)
121. + role_name = (known after apply)
122. + secondary_private_ip_address_count = (known after apply)
123. + secondary_private_ips = (known after apply)
124. + security_groups = (known after apply)
125. + spot_strategy = "NoSpot"
126. + status = "Running"
127. + subnet_id = (known after apply)
128. + system_disk_category = "cloud_efficiency"
129. + system_disk_performance_level = (known after apply)
130. + system_disk_size = 40
131. + volume_tags = (known after apply)
132. + vswitch_id = (known after apply)
133. }
135. # alicloud_security_group.default will be created
136. + resource "alicloud_security_group" "default" {
137. + id = (known after apply)
138. + inner_access = (known after apply)
139. + inner_access_policy = (known after apply)
140. + name = "default"
141. + security_group_type = "normal"
142. + vpc_id = (known after apply)
143. }
145. # alicloud_security_group_rule.allow_all_tcp will be created
146. + resource "alicloud_security_group_rule" "allow_all_tcp" {
147. + cidr_ip = "0.0.0.0/0"
148. + id = (known after apply)
149. + ip_protocol = "tcp"
150. + nic_type = "intranet"
151. + policy = "accept"
152. + port_range = "1/65535"
153. + priority = 1
154. + security_group_id = (known after apply)
155. + type = "ingress"
156. }
158. # alicloud_vpc.vpc will be created
159. + resource "alicloud_vpc" "vpc" {
160. + cidr_block = "10.10.10.0/24"
161. + id = (known after apply)
162. + ipv6_cidr_block = (known after apply)
163. + name = (known after apply)
164. + resource_group_id = (known after apply)
165. + route_table_id = (known after apply)
166. + router_id = (known after apply)
167. + router_table_id = (known after apply)
168. + status = (known after apply)
169. + vpc_name = "pigsty-demo-network"
170. }
172. # alicloud_vswitch.vsw will be created
173. + resource "alicloud_vswitch" "vsw" {
174. + availability_zone = (known after apply)
175. + cidr_block = "10.10.10.0/24"
176. + id = (known after apply)
177. + name = (known after apply)
178. + status = (known after apply)
179. + vpc_id = (known after apply)
180. + vswitch_name = (known after apply)
181. + zone_id = "cn-beijing-k"
182. }
184. Plan: 8 to add, 0 to change, 0 to destroy.
186. Changes to Outputs:
187. + meta_ip = (known after apply)
189. Do you want to perform these actions?
190. Terraform will perform the actions described above.
191. Only 'yes' will be accepted to approve.
193. Enter a value: yes
195. alicloud_vpc.vpc: Creating...
196. alicloud_vpc.vpc: Creation complete after 6s [id=vpc-2zed78z7n5z06o1dmydhj]
197. alicloud_security_group.default: Creating...
198. alicloud_vswitch.vsw: Creating...
199. alicloud_security_group.default: Creation complete after 1s [id=sg-2ze7x7zu8tcdsefroofa]
200. alicloud_security_group_rule.allow_all_tcp: Creating...
201. alicloud_security_group_rule.allow_all_tcp: Creation complete after 0s [id=sg-2ze7x7zu8tcdsefroofa:ingress:tcp:1/65535:intranet:0.0.0.0/0:accept:1]
202. alicloud_vswitch.vsw: Creation complete after 6s [id=vsw-2zejctjdr16ryz194jxz4]
203. alicloud_instance.pg-test-3: Creating...
204. alicloud_instance.pg-test-2: Creating...
205. alicloud_instance.pg-test-1: Creating...
206. alicloud_instance.pg-meta-1: Creating...
207. alicloud_instance.pg-test-3: Still creating... [10s elapsed]
208. alicloud_instance.pg-test-2: Still creating... [10s elapsed]
209. alicloud_instance.pg-test-1: Still creating... [10s elapsed]
210. alicloud_instance.pg-meta-1: Still creating... [10s elapsed]
211. alicloud_instance.pg-meta-1: Creation complete after 16s [id=i-2zef4frw6kezb47339wr]
212. alicloud_instance.pg-test-1: Still creating... [20s elapsed]
213. alicloud_instance.pg-test-2: Still creating... [20s elapsed]
214. alicloud_instance.pg-test-3: Still creating... [20s elapsed]
215. alicloud_instance.pg-test-2: Creation complete after 23s [id=i-2zefzvz0fyl7mloc4v30]
216. alicloud_instance.pg-test-1: Still creating... [30s elapsed]
217. alicloud_instance.pg-test-3: Still creating... [30s elapsed]
218. alicloud_instance.pg-test-3: Creation complete after 33s [id=i-2zeeyodo2pc8b1k2d167]
219. alicloud_instance.pg-test-1: Creation complete after 33s [id=i-2zef4frw6kezb47339ws]
SSH配置与微调
其中,管理机将分配一个按量付费的公网IP,您也可以使用命令terraform output将其打印出来。
1. # 打印公网IP与root密码
2. ssh_pass='PigstyDemo4'
3. public_ip=$(terraform output | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
4. echo "meta node: root:${ssh_pass}@${public_ip}"
接下来,我们先来配置本地登录云端管理机器的SSH配置(默认用户root,密码PigstyDemo4)
1. # 创建 ~/.ssh/pigsty_terraform 文件,包含云端管理机器的SSH定义(可选,好用一点)
2. cat > ~/.ssh/pigsty_terraform <<-EOF
3. Host demo
4. User root
5. HostName ${public_ip}
6. UserKnownHostsFile /dev/null
7. StrictHostKeyChecking no
8. PasswordAuthentication yes
9. EOF
10. chmod 0600 ~/.ssh/pigsty_terraform
12. # 启用该配置
13. if ! grep --quiet "Include ~/.ssh/pigsty_terraform" ~/.ssh/config ; then
14. (echo 'Include ~/.ssh/pigsty_terraform' && cat ~/.ssh/config) > ~/.ssh/config.tmp;
15. mv ~/.ssh/config.tmp ~/.ssh/config && chmod 0600 ~/.ssh/config;
16. fi
然后,您可以通过SSH别名demo访问该云端管理机了。
1. # 添加本地到元节点的免密访问
2. sshpass -p ${ssh_pass} ssh-copy-id demo
然后,您就可以免密从本地访问该节点了,如果只需要进行单节点安装,这样就行了。接下来,在该元节点上完成标准安装
特殊注意事项
阿里云虚拟机CentOS 7.8镜像中运行有 nscd ,锁死了 glibc 版本,会导致安装时出现RPM依赖错误。
在所有机器上执行 yum remove -y nscd 即可解决此问题。
完成上述准备工作后,所有机器准备工作已经就绪,可以开始常规的 Pigsty下载配置安装三部曲啦。
Last modified 2022-06-03: add scaffold for en docs (6a6eded)
