Tôi cũng trong tình trạng di cư cơ sở hạ tầng hiện có để AWS Terraform để biên nhằm mục đích cập nhật các câu trả lời như tôi phát triển, xây dựng.
tôi đã dựa rất nhiều vào Terraform chính thức examples và nhiều thử và sai để xác thịt ra lĩnh vực mà tôi đã không chắc chắn trong.
file .tfstate
Terraform cấu hình có thể được sử dụng để cung cấp nhiều hộp trên cơ sở hạ tầng khác nhau, mỗi cái có thể có một trạng thái khác nhau. Vì nó cũng có thể được chạy bởi nhiều người nên trạng thái này ở một vị trí tập trung (như S3) nhưng không phải là git.
Điều này có thể được xác nhận xem tại Terraform .gitignore
.
kiểm soát phát triển
Mục đích của chúng tôi là cung cấp thêm quyền kiểm soát của các cơ sở hạ tầng để phát triển trong khi duy trì một kiểm toán đầy đủ (git log) và khả năng thay đổi kiểm tra sự tỉnh táo (yêu cầu kéo). Với ý nghĩ đó, quy trình làm việc cơ sở hạ tầng mới mà tôi hướng tới là:
- Nền tảng cơ bản của AMI chung bao gồm các mô-đun có thể tái sử dụng, ví dụ: con rối.
- Cơ sở hạ tầng lõi được cung cấp bởi DevOps sử dụng Terraform.
- Nhà phát triển thay đổi cấu hình Terra trong Git khi cần (số phiên bản; VPC mới; bổ sung vùng/vùng khả dụng, v.v.).
- Cấu hình Git được đẩy và yêu cầu kéo được gửi đến để đảm bảo sự an toàn của một thành viên của nhóm DevOps.
- Nếu được chấp thuận, gọi webhook để CI để xây dựng và triển khai (không chắc chắn làm thế nào để phân vùng nhiều môi trường vào thời điểm này)
Sửa 1 - Cập nhật về tình trạng hiện thời
Kể từ khi bắt đầu câu trả lời này tôi có viết rất nhiều mã TF và cảm thấy thoải mái hơn trong tình trạng của chúng ta. Chúng tôi đã gặp lỗi và hạn chế trên đường đi nhưng tôi chấp nhận đây là đặc điểm của việc sử dụng phần mềm thay đổi nhanh chóng.
Layout
Chúng tôi có một cơ sở hạ tầng AWS phức tạp với nhau nhiều của VPC với nhiều mạng con. Chìa khóa để dễ dàng quản lý điều này là xác định phân loại linh hoạt bao gồm khu vực, môi trường, dịch vụ và chủ sở hữu mà chúng tôi có thể sử dụng để tổ chức mã cơ sở hạ tầng của chúng tôi (cả terraform và con rối).
Modules
Bước tiếp theo là tạo ra một kho git duy nhất để lưu trữ các module terraform của chúng tôi. Cơ cấu trình độ dir đầu của chúng tôi cho các module trông như thế này:
tree -L 1 . . ├── README.md ├── aws-asg ├── aws-ec2 ├── aws-elb ├── aws-rds ├── aws-sg ├── aws-vpc └── templates
Mỗi người đặt một số giá trị mặc định lành mạnh nhưng cho thấy chúng như biến có thể được ghi đè bởi "keo" của chúng tôi.
Keo
Chúng tôi có một kho lưu trữ thứ hai với glue
của chúng tôi mà làm cho việc sử dụng các module nêu trên. Nó được đặt ra phù hợp với tài liệu phân loại của chúng tôi:
. ├── README.md ├── clientA │ ├── eu-west-1 │ │ └── dev │ └── us-east-1 │ └── dev ├── clientB │ ├── eu-west-1 │ │ ├── dev │ │ ├── ec2-keys.tf │ │ ├── prod │ │ └── terraform.tfstate │ ├── iam.tf │ ├── terraform.tfstate │ └── terraform.tfstate.backup └── clientC ├── eu-west-1 │ ├── aws.tf │ ├── dev │ ├── iam-roles.tf │ ├── ec2-keys.tf │ ├── prod │ ├── stg │ └── terraform.tfstate └── iam.tf
Bên trong mức khách hàng chúng tôi có AWS chiếm cụ .tf
tập tin mà cung cấp nguồn lực toàn cầu (như vai trò IAM); tiếp theo là cấp vùng với khóa công khai SSH EC2; Cuối cùng trong môi trường của chúng tôi (dev
, stg
, prod
vv) là các thiết lập VPC, tạo cá thể và kết nối ngang hàng, v.v. của chúng tôi được lưu trữ.
Lưu ý bên: Như bạn có thể thấy tôi sẽ đi ngược lại lời khuyên của riêng tôi ở trên giữ terraform.tfstate
trong git. Đây là một biện pháp tạm thời cho đến khi tôi chuyển sang S3 nhưng phù hợp với tôi vì tôi hiện là nhà phát triển duy nhất.
Tiếp bước
này vẫn còn là một quá trình thủ công và không có trong Jenkins nhưng chúng tôi đang porting một khá lớn, cơ sở hạ tầng phức tạp và cho đến nay rất tốt. Giống như tôi đã nói, rất ít lỗi nhưng hoạt động tốt!
Chỉnh sửa 2 - Thay đổi
Đã gần một năm kể từ khi tôi viết câu trả lời ban đầu này và tình trạng của cả hai Terraform và bản thân mình đã thay đổi đáng kể. Bây giờ tôi đang ở một vị trí mới bằng cách sử dụng Terraform để quản lý một cụm Azure và Terraform bây giờ là v0.10.7
.
Nhà nước
dân đã nhiều lần nói với tôi nhà nước nên không đi trong Git - và họ là chính xác. Chúng tôi đã sử dụng điều này như một biện pháp tạm thời với một nhóm gồm hai người dựa vào truyền thông và kỷ luật của nhà phát triển. Với một đội ngũ phân phối lớn hơn, chúng tôi hiện đang tận dụng triệt để trạng thái từ xa trong S3 với locking do DynamoDB cung cấp. Lý tưởng nhất điều này sẽ được di chuyển đến lãnh sự bây giờ nó là v1.0 để cắt các nhà cung cấp đám mây chéo.
Modules
Trước đây chúng tôi tạo ra và sử dụng các module bên trong. Đây vẫn là trường hợp nhưng với sự ra đời và tăng trưởng của Terraform registry chúng tôi cố gắng sử dụng chúng như ít nhất một cơ sở.
cấu trúc file
Vị trí mới có một phân loại đơn giản hơn nhiều với chỉ hai môi trường infx - dev
và prod
. Mỗi biến có các biến và đầu ra của riêng chúng, tái sử dụng các mô đun của chúng ta được tạo ở trên. Nhà cung cấp remote_state
cũng giúp chia sẻ kết quả đầu ra của các tài nguyên được tạo giữa các môi trường. Kịch bản của chúng tôi là tên miền phụ trong các nhóm tài nguyên Azure khác nhau cho một TLD được quản lý toàn cầu.
├── main.tf ├── dev │ ├── main.tf │ ├── output.tf │ └── variables.tf └── prod ├── main.tf ├── output.tf └── variables.tf
Kế hoạch
Một lần nữa với những thách thức thêm của một nhóm phân phối, bây giờ chúng ta luôn luôn lưu lượng của chúng ta về lệnh terraform plan
. Chúng tôi có thể kiểm tra và biết những gì sẽ được chạy mà không có rủi ro của một số thay đổi giữa các giai đoạn plan
và apply
(mặc dù khóa giúp với điều này). Hãy nhớ xóa tệp gói này vì nó có khả năng chứa các biến "bí mật" văn bản thuần túy.
Nhìn chung, chúng tôi rất hài lòng với Terraform và tiếp tục tìm hiểu và cải tiến với các tính năng mới được thêm vào.
Quý vị có bất kỳ may mắn/vấn đề kể từ khi câu trả lời này? Của bạn có vẻ rất giống với những gì tôi đang nhắm tới, nhưng bạn có thể còn hơn cả tôi nữa. –
đẹp! Tôi vẫn không thể thực hiện trên mặt của tôi, chúng tôi đang thanh toán bù trừ một số công cụ khác nhưng thật tuyệt vời khi biết một số điều cần làm/tránh. –
Tôi tò mò là tại sao bạn nghĩ rằng các tập tin tfstate không nên được lưu trữ trong git? Có phải đơn giản là vì trạng thái cũ không đáng để tiết kiệm hay có vấn đề gì khác? – agbodike