Terraform 是由 HashiCorp 建立的开放原始码「基础架构即程序码」工具。
宣告式编码工具 Terraform 可让开发人员使用名为 HCL(HasHiCorp 配置语言)的高阶配置语言,来进行基础架构的配置,无论是支援主流的云端供应商(AWS、GCP、Azure),或是从事网域注册管理的 GoDaddy,到企业导入的主机自助服务 Nutanix,皆有支援,因为支援度广泛,算是近年来 IT 进行配置的一大利器。
选择写程序码来配置基础架构,主要解决传统上的三大痛点
文件维护不易
传统配置基础架构几乎都是透过原厂提供的 Client 工具
随着工具及硬体升级
往往介面操作不太一样
造成文件无法对齐现有操作
版本控管
以管理域名为例
添加 A Record 及 CName Record 都是简单操作就完成
但透过介面的操作
无法回朔前一个操作
使用 IaC 配置基础架构
程序码进入版控以後
很容易可以查找过去修改历程
学习多套工具
IT 单位从虚拟机械到网域管理
如果每个导入的系统都要学习
则需要熟悉多套工具或熟悉多套软件的 GUI 操作
使用支援广泛的 IaC 工具
则可以使用一套工具
应用於其他地方
昨天我们已经配置好 aws config
也对於 terraform 引入基本的配置和宣告
provider "aws" {
region = "ap-northeast-1"
shared_credentials_file = "~/.aws/credentials"
profile = "default"
}
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~>3.0"
}
}
}
Terraform 的执行只会执行当前位置底下的 .tf 档
标准档案配置为 main.tf、outputs.tf、variables.tf
其中 main.tf 为主要的基础设施配置
outputs.tf 为结果输出
variables.tf 则为常数宣告
如果有自己撰写的模组
则在模组中的 outputs.tf 需要将创建的资源输出
才能在引用模组的地方取得创建出来的资源
(详细概念,等到未来实际操作会再解释)
如果有学过强型别语言的人
可以用这个方式来理解这两个语法
aws_instance gitlab = ....
resource "aws_instance" "gitlab" {
}
aws_instance 为变数型态
gitlab 为变数名称
data 开头的为查询功能
无论是查询我们布建的支援
还是查询其他的可用资源都是用这语法
而大括号内的 {} 则是写查询条件
data "aws_ami" "ubuntu" {
}
在配置基础设施时
可能会使用官方提供现成的模组
或是自己撰写的模组
撰写完後要使用时则需要这样撰写
用 python 来理解 module
像是下列的写法
引用後宣告变数名称为 foo 的模组
from ../modules/ import ithome
foo = ithome(name="bar")
module "foo" {
source = "../modules/ithome"
name = "bar"
}
ithome 模组中
main.tf
resource "aws_instance" "foo" {
name = var.ec2_name
}
variables.tf
variable "ec2_name" {
description = ""
default = "foo-name"
}
使用模组时
我们有宣告 name 为 bar
因此创建出来的资源名称就会是 bar 而不会带入预设值 "foo-name"
module "foo" {
source = "../modules/ithome"
name = "bar"
}
也有一种是抽变数当常数使用
但区域变数或常数通常会用 .tfvars 或 locals
因此 variable 还是比较会用在模组中
程序码的命名上比较推崇使用底线 _
而 aws 上有使用到的名称则建议用 -
以供区别
配置 terraform 程序码中
会习惯将等号对齐
以方便确认配置的资源规格
.tfstate 为执行配置时
记录目前资源使用状态的文件
如果遗失则需要将资源重新 import 近来才有办法管理
里面含有资讯很多
甚至含有创建的 public key和 private key
因此不建议进 Git 版控
但是多人协作时仍会需要 tfstate
不然无法进行配置或修改
此时会用 terraform cloud 或是 aws s3 来存放 tfstate
这部分的使用也会在日後说明
昨天只有新增完档案
但是需要安装延伸模组
才能够识别这 terraform 档案
并对语法上色
模组选择上我们使用官方的 HashiCorp Terraform
检视安装结果
打开昨天写好的 main.tf
如果有自动上色
表示延伸模组有正常运作
没错,今天我们要做的第一件事情
就是我们要安装一台 EC2 并安装 gitlab 版控
有使用过 aws cloud console 的小夥伴们一定不陌生
除了需要选择 AMI
还需要配置硬碟、配置 Security Group
main.tf
data "aws_vpc" "default" {
id = var.default_vpc_id
}
variables.tf
variable "default_vpc_id" {
description = "the default vpc id when inital the aws"
default = "vpc-0c580897ac763ea51"
}
main.tf
data "aws_subnet_ids" "subnet_ids" {
vpc_id = data.aws_vpc.default.id
}
main.tf
resource "aws_security_group" "gitlab" {
name = "gitlab-server"
description = "It used for gitlab server."
vpc_id = data.aws_vpc.default.id
tags = { Name = "Gitlab-Server" }
revoke_rules_on_delete = null
}
resource "aws_security_group_rule" "gitlab_igress_22" {
type = "ingress"
from_port = 22
to_port = 22
cidr_blocks = ["0.0.0.0/0",]
protocol = "tcp"
security_group_id = aws_security_group.gitlab.id
}
resource "aws_security_group_rule" "gitlab_egress_22" {
type = "egress"
from_port = 22
to_port = 22
cidr_blocks = ["0.0.0.0/0",]
protocol = "tcp"
security_group_id = aws_security_group.gitlab.id
}
main.tf
resource "tls_private_key" "gitlab" {
algorithm = "RSA"
rsa_bits = 4096
}
resource "aws_key_pair" "gitlab" {
key_name = "gitlab"
public_key = tls_private_key.gitlab.public_key_openssh
}
上方为在 aws上建立成对金钥
而下方的指令则将 key输出成一个实体的档案
format 则是 terraform 中的一个函式
可以用来组合字串使用
main.tf
resource "local_file" "gitlab" {
content = tls_private_key.gitlab.private_key_pem
filename = format("%s.pem", aws_key_pair.gitlab.key_name)
}
此处为选择一个 ubuntu 20.04 的作业系统
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
根据网路上查找的许多建议
实际上也在安装过程中采过雷
建议使用四核心以上的 EC2
也就是至少使用 t3.xlarge 的规格
不然可能在安装 gitlab 的过程中卡住
因为 aws 上 t 系列的机械
会计算 CPU 使用量
如果使用超规会耗费 CPU Credit
一但 CPU Credit 消耗完
则机械会无法使用
需等待一段时累积 CPU Credit
main.tf
resource "aws_instance" "gitlab" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.xlarge"
subnet_id = sort(data.aws_subnet_ids.subnet_ids.ids)[0]
key_name = aws_key_pair.gitlab.key_name
vpc_security_group_ids = [ "value" ]
disable_api_termination = false
ebs_optimized = true
hibernation = false
tags = {
Name = "Gitlab Server"
Usage = "For SCM"
Creator = "Terraform"
}
root_block_device {
delete_on_termination = true
encrypted = false
throughput = 0
volume_size = 30
volume_type = "gp2"
tags = {
Name = "Gitlab Server"
Attached = "Gitlab Server"
}
}
}
回到 vagrant ssh 进到虚拟机械中
并到切换路径到专案目录
输入指令以执行配置
terraform apply
配置完成後
我们就可以登入 aws cloud console 介面来查看配置的结果
参考:
前言 今天要来更新 JSON data, 并且构建 the Featured view。 实作 更新...
安装 Nginx $ sudo apt-get update $ sudo apt-get inst...
中台作为一种生态系统层级的架构,倚赖业界主流的技术系统,包含开源技术平台与框架: 业务中台:微服务─...
成员到了 17 人,你必须依靠「回报」进行专案控管、公司治理; 这时你发现, 回报不实,不常发生; ...
前言 我们在Object [下]中有提到 getter / setter,由於这个部分在书中的解释是...