استقرار NixOS با استفاده از Terraform
این آموزش فرض میکند که شما با اصول اولیه Terraform آشنا هستید. تا پایان این آموزش، یک نمونه (Instance) در آمازون وب سرویس (AWS) را با استفاده از Terraform آمادهسازی (Provision) خواهید کرد و از نیکس برای استقرار تغییرات افزایشی روی NixOS در حال اجرا روی آن نمونه بهره خواهید برد.
ما بررسی خواهیم کرد که چگونه یک ماشین NixOS را راهاندازی (Boot) کنیم و چگونه تغییرات افزایشی را مستقر سازیم.
راهاندازی تصویر NixOS
- با فراهم کردن فایل اجرایی Terraform شروع کنید:
$ nix-shell -p terraform ۲. ما از Terraform Cloud به عنوان یک بخشسمت سرور (Backend) حالت/قفلکننده استفاده میکنیم:
$ terraform login - مطمئن شوید که یک سازمان ایجاد کنید، مانند
myorganization، در حساب کاربری Terraform Cloud خود. - در داخل
myorganization، با انتخاب CLI-driven workflow یک فضای کاری ایجاد کنید و نامی مانندmyappرا انتخاب کنید. - در داخل فضای کاری خود، در قسمت
Settings / General، حالت اجرا (Execution Mode) را رویLocalتنظیم کنید. - در داخل یک پوشه جدید، یک فایل
main.tfبا محتوای زیر ایجاد کنید. این کار یک نمونه (instance) در AWS با تصویر NixOS با استفاده از یک جفت کلید SSH و یک گروه امنیتی SSH را راهاندازی میکند:
terraform {
backend "remote" {
organization = "myorganization"
workspaces {
name = "myapp"
}
}
}
provider "aws" {
region = "eu-central-1"
}
module "nixos_image" {
source = "git::https://github.com/tweag/terraform-nixos.git//aws_image_nixos?ref=5f5a0408b299874d6a29d1271e9bffeee4c9ca71"
release = "20.09"
}
resource "aws_security_group" "ssh_and_egress" {
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = [ "0.0.0.0/0" ]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "tls_private_key" "state_ssh_key" {
algorithm = "RSA"
}
resource "local_file" "machine_ssh_key" {
sensitive_content = tls_private_key.state_ssh_key.private_key_pem
filename = "${path.module}/id_rsa.pem"
file_permission = "0600"
}
resource "aws_key_pair" "generated_key" {
key_name = "generated-key-${sha256(tls_private_key.state_ssh_key.public_key_openssh)}"
public_key = tls_private_key.state_ssh_key.public_key_openssh
}
resource "aws_instance" "machine" {
ami = module.nixos_image.ami
instance_type = "t3.micro"
security_groups = [ aws_security_group.ssh_and_egress.name ]
key_name = aws_key_pair.generated_key.key_name
root_block_device {
volume_size = 50 # GiB
}
}
output "public_dns" {
value = aws_instance.machine.public_dns
} تنها قطعهکد مخصوص NixOS عبارت است از:
module "nixos_image" {
source = "git::https://github.com/tweag/terraform-nixos.git/aws_image_nixos?ref=5f5a0408b299874d6a29d1271e9bffeee4c9ca71"
release = "20.09"
} نکته
ماژول
aws_image_nixosبا دریافت شماره انتشار NixOS یک AMI مربوط به NixOS را برمیگرداند؛ به طوری که منبعaws_instanceمیتواند در آرگومان instance_type به آن AMI ارجاع دهد.
۵. حتماً اعتبارنامههای AWS را پیکربندی کنید. ۶. اعمال پیکربندی Terraform باید یک NixOS در حال اجرا را برای شما فراهم کند:
$ terraform init
$ terraform apply استقرار تغییرات NixOS
هنگامی که نمونهی AWS در حال اجرای یک تصویر NixOS از طریق Terraform است، میتوانیم به Terraform بیاموزیم که همیشه جدیدترین پیکربندی NixOS را بسازد و آن تغییرات را روی نمونهی شما اعمال کند.
- فایل
configuration.nixرا با محتوای زیر ایجاد کنید:
{ config, lib, pkgs, ... }: {
imports = [ <nixpkgs/nixos/modules/virtualisation/amazon-image.nix> ];
# Open https://search.nixos.org/options for all options
} ۲. قطعه کد زیر را به فایل main.tf خود اضافه کنید:
module "deploy_nixos" {
source = "git::https://github.com/tweag/terraform-nixos.git//deploy_nixos?ref=5f5a0408b299874d6a29d1271e9bffeee4c9ca71"
nixos_config = "${path.module}/configuration.nix"
target_host = aws_instance.machine.public_ip
ssh_private_key_file = local_file.machine_ssh_key.filename
ssh_agent = false
} ۳. استقرار:
$ terraform init
$ terraform apply هشدارها
- ماژول
deploy_nixosمستلزم این است که NixOS روی ماشین مقصد و Nix روی ماشین میزبان نصب شده باشد. - ماژول
deploy_nixosزمانی که معماریهای کاربر (client) و مقصد متفاوت باشند کار نمیکند (مگر اینکه از بیلدهای توزیعشده استفاده کنید). - اگر نیاز دارید مقداری را به درون Nix تزریق کنید، هیچ راهکار ظریفی برای آن وجود ندارد.
- هر ماشین بهطور جداگانه ارزیابی میشود، بنابراین توجه داشته باشید که نیازهای حافظه شما بهصورت خطی با تعداد ماشینها رشد خواهد کرد.
گامهای بعدی
- امکان مهاجرت به Google Compute Engine وجود دارد.
- ماژول
deploy_nixosاز آرگومانهای مختلفی، برای مثال جهت بارگذاری کلیدها، پشتیبانی میکند.