Terraform之申請AWS的EC2

2021-02-15 耶喝運維

啥都不說先上代碼
目錄結構

├── cloud_init.sh  # 開機執行腳本 
├── instance.tf    # 申請資源的主機
├── main.tf        # 主配置文件
├── output.tf      # 輸出變量
├── start.sh       # terraform 命令 
└── variables.tf   # 輸入變量

variables.tf

輸入變量 一個AWS 帳號的基礎信息(PS 大佬告訴我應該用data模塊查詢,先硬編碼,後期再改)

variable "region" {
  type        = string
  description = "請輸入創建的region"
}

variable "region_az" {
  type        = string
  description = "請輸入創建資源所在的AZ"
}

variable "instance_type" {
  type        = string
  default     = "t3.nano"
  #default     = "m5.large"
  description = "請輸入創建的實例類型"
}

variable "tag_name" {
  type        = string
  description = "請輸入機器的名字"
}

variable "tag_project" {
  type        = string
  description = "請輸入計費的tag標籤"
}

variable "storage_number" {
  type        = string
  default     = 1
  description = "請輸入要創建的硬碟數量"
}

variable "key_name" {
  type        = string
  default     = "xxx"
  description = "請輸入連接伺服器使用的ssh名字"
}

variable "iams" {
  type    = map
  default = {
    "us-east-2" = "ami-xxx"
    "ap-northeast-1" = "ami-xxx"
  }
}

variable "vpcs" {
  type    = map
  default = {
    "us-east-2" = "vpc-xxx"
    "ap-northeast-1" = "vpc-xxx"
  }
}

variable "subnetes" {
  type    = map
  default = {
    "us-east-2a" = "subnet-xxx"
    "us-east-2b" = "subnet-xxx"
    "us-east-2c" = "subnet-xxx"
    "ap-northeast-1a" = "subnet-xxx"
    "ap-northeast-1c" = "subnet-xxx"
    "ap-northeast-1d" = "subnet-xxx"
  }
}

variable "storage_dev" {
  type    = map
  default = {
    "0" = "/dev/sdh"
    "1" = "/dev/sdi"
    "2" = "/dev/sdj"
    "3" = "/dev/sdk"
    "4" = "/dev/sdl"
  }
}

main.tf

主配置文件,聲明使用的認證信息

provider "aws" {
  region                  = var.region
  shared_credentials_file = "/opt/terraform/aws/.creds/xxxx"
}

instance.tf

實例配置文件,聲明需要在AWS 上創建的資源

resource "aws_instance" "this_ec2" {
  ami               = var.iams[var.region]
  instance_type     = var.instance_type
  subnet_id         = var.subnetes[var.region_az]
  availability_zone = var.region_az
  key_name          = var.key_name
  user_data = "${file("cloud_init.sh")}"
  tags = {
    Name    = var.tag_name
    Project = var.tag_project 
  }
  volume_tags = {
    Name    = var.tag_name
    Project = var.tag_project
  }
}


resource "aws_ebs_volume" "this_ebs" {
  count = var.storage_number

  availability_zone = var.region_az
  size              = 10
  tags = {
    Name = "${var.tag_name}-disk-${count.index}"
    Project = var.tag_project
  }
}

resource "aws_volume_attachment" "instance_att_sdb" {
  count = var.storage_number

  device_name = var.storage_dev[count.index]
  instance_id = "${aws_instance.this_ec2.id}"
  volume_id   = "${aws_ebs_volume.this_ebs[count.index].id}"
}

resource "aws_eip" "this_elb" {
  instance = "${aws_instance.this_ec2.id}"
  vpc      = true
}

output.tf

輸出的參數,後面自動添加cmdb、jumpserver 等工具使用

output "tag_name" {
  value = var.tag_name
}

output "instance_ip_addr" {
  value       = aws_instance.this_ec2.private_ip
}

output "instance_eip" {
  value       = aws_instance.this_ec2.public_ip
}

使用方法

terraform apply -var="region=us-east-2" -var="region_az=us-east-2a" -var="instance_type=m5.large" -var="tag_name=test" -var="tag_project=test" -var="storage_number=2"


參數說明:
region: EC2 所在的region
region-az: EC2 所在的AZ
instance_type: EC2 的實例類型
tag_name: EC2 的tag Key=Name
tag_project: EC2 的tag Key=Project
storage_number: EC2 附加的硬碟,最多附加五塊

開始拆一下  
instance.tf  
這裡面有四個動作,申請EC2,申請EBS,EC2與EBS綁定,申請EIP與EC2 綁定。好像沒啥好說的,寫完之後發現好簡單。每個方法在官網後面有個output,可以通過定義的方法名.output 的值取到輸出的值

emm.. 沒啥好講的,就是這麼簡單,tf 的難點在於規劃,如何把帳戶,秘鑰,配置,腳本,做好規劃。這個需要折騰一下。

相關焦點

  • Terraform 在英語流利說的實踐
    同時,Terraform 進行與雲廠商交互操作的時候是非常嚴謹,在你更改完代碼後,需要先用 terraform plan 進行變更預覽,你可以看到你的更改會影響到線上的部分,確定後進行 terraform apply,一次變更塵埃落定。
  • Citrix ADC自動化部署之-terraform
    安裝terraform參考官網連結即可,本文環境為centos7安裝最新版Terraform[root@yyds ~]# more /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@yyds ~]# terraform -vTerraform
  • IaC 自動化配置與編排神器 - Terraform 深度解析
    執行 terraform -v 可以看到類似下面的輸出:$ terraform -vTerraform v0.11.1安裝 terraform-provider-qingcloudterraform-provider-qingcloud 同樣是以二進位文件進行發布
  • 五分鐘入門阿里雲Terraform OSS Backend
    Backend 通過關鍵字 backend 來聲明:terraform { backend "oss" { profile = "terraform" bucket = "terraform-oss-backend-1024" key = "prod/terraform.tfstate
  • AWS啟動EC2 部署jupyter notebook
    有AWS educate帳戶的需要通過AWS educate登錄網址:https://www.awseducate.com/signin/SiteLogin跳轉到AWS console 來啟動EC2點擊「AWS count」跳轉到下圖界面,點擊「AWS Educate Starter Account」
  • Terraform中使用prevent_destroy搭配override文件防止誤刪資源
    讓我們執行以下命令來創建資源:$ terraform apply -var 'az=cn-bj2-03' -auto-approveucloud_instance.nosql: Creating...接下來我們再次執行apply,只不過這一次我們修改一下az的值:$ terraform apply -var 'az=cn-bj2-04' -auto-approveucloud_instance.nosql: Refreshing state...
  • aws生產實踐-16:創建efs並掛載到ec2
    目錄:(1).創建efs(2).創建連接點(3).安裝amazon-efs-utils(4).將efs掛載到ec2(5).初衷回顧(1).創建efsEFS是「Amazon Elastic File System可擴展且有彈性的原生雲 NFS 文件系統「的縮寫。
  • AWS成本優化之EBS
    aws磁碟支持動態調整嗎?黎叔負責任地告訴你,aws磁碟能不停機擴容,不能不停機縮容!停機也不能縮容!!就是不支持縮容!!!下面給出EBS盤縮容和自動擴容的原理和步驟供您參考。bootloader版本、/etc/fstab配置3、新建合適大小EBS盤掛上虛機4、新盤分區、創建並mount文件系統5、源盤rsync步到新盤6、新盤grub-install做成啟動盤7、停應用8、源盤增量同步到新盤9、umount新盤10、源盤分區label和UUID克隆到新盤11、ec2
  • VM映像導入成EC2 AMI
    -user,在此RedHat鏡像中也創建一個ec2-user用戶:創建新用戶並設置密碼:[root@localhost ~]# adduser ec2-use[root@localhost ~]# passwd ec2-user新創建的用戶並不能使用sudo命令,需要給他添加授權:
  • AWS EC2的價格模型
    按需實例建議在以下場景中使用:     * 用戶傾向於花費越少越好,不希望預付費,也沒有固定長期需求,並且要求有較高的靈活性;     * 短期高峰不可預測,並且也不能中斷的業務;一般來說,新上的業務,其業務負載波動的可能性較大;     * 首次在Amazon EC2上開發或測試的應用程式;AWS EC2的競價實例,允許你可以以按需實例最低10%的價格,使用aws
  • Ansible如何管理你的雲:AWS、Openstack?你的運維也可以很帥!
    物理機時代的運維,由於設備數量較少,運維人員的壓力不大,工作之餘還能喝點小酒,狀態是這樣的:上了虛擬機後,作業系統數量增加十倍,運維人員嚴陣以待,但仍能抵擋,狀態是這樣的:aws_kms_facts - Gather facts about AWS KMS keysaws_region_facts - Gather facts about AWS regions.aws_s3 - manage objects in S3.
  • 介紹AWS Graviton Ready計劃,用於支持Graviton的軟體產品
    我們很高興宣布新的AWS Graviton Ready計劃(https://aws.amazon.com/ec2/graviton/partners/),該計劃是AWS服務就緒計劃的一部分,該計劃驗證由AWS合作夥伴構建的軟體產品,該軟體產品與特定服務(如AWS Graviton)集成。
  • 你知道AWS的EC2競價實例有多大規模了嗎?
    其中大家比較認同的一組數據來自這篇文章(https://huanliu.wordpress.com/2014/02/26/amazon-ec2-grows-62-in-2-years/)。在這篇文章中,作者對AWS全球數據中心的機櫃數目做了個估算(如下圖):
  • 在 AWS 中使用 Ansible 來管理你的 SSH 密鑰 | Linux 中國
    使用 Ansible 的 ec2_key 模塊,你可以創建一個簡單的 Ansible 劇本來在所有區域中維護你的 SSH 密鑰對。如果你需要增加或者刪除密鑰,在 Ansible 中這就像從文件中添加和刪除行一樣簡單。
  • 手把手教你在AWS雲上搭建HPC集群
    動手實驗1: 搭建基礎雲環境1、 登陸到AWS Console個人用戶可以通過註冊AWS海外免費套餐開啟AWS上雲之旅。stack named: parallelcluster-hpc-clusterStatus: parallelcluster-hpc-cluster-CREATE_COMPLETE                           MasterPublicIP: 3.19.86.5GangliaPublicURL: http://3.19.86.5/ganglia/ClusterUser: ec2