ბიბლიოთეკა
00/07 · ~32 წთ
GUIDEDECK · პროვიჟენინგი, რომელიც განიხილება და ვერსირდება

ინფრასტრუქტურა
როგორც კოდი
— განმეორებადი ჩანაფიქრით.

32-წუთიანი სამუშაო სესია იმაზე, როგორ აღვწეროთ სერვერები, ქსელები და მონაცემთა ბაზები ტექსტად, რომელსაც git-ში აკომიტებთ — რომ მთელი გარემო გახდეს ის, რისი დაგეგმვაც, განხილვაც და ხელახლა აგებაც შეგიძლიათ, და არა ხელით აწყობილი და ლოცვაზე დამყარებული რამ.

~32 წთდამწყები → საშუალოინსტრუმენტისგან დამოუკიდებელი
გადაახვიეთ
01 · ინფრასტრუქტურა კოდად — რატომ 4 წთ

შეწყვიტეთ კლიკები. დაიწყეთ
ინფრასტრუქტურის კომიტება.

ყველა ღრუბლოვანი ანგარიში ერთნაირად იწყება: ვიღაც კონსოლში დააკლიკებს, აწყობს სერვერსა და მონაცემთა ბაზას და ეს მუშაობს. ექვსი თვის შემდეგ აღარავის ახსოვს ზუსტად, რას აკლიკებდა, სტეიჯინგის გარემო პროდაქშენს დაშორდა, ხოლო ნულიდან აღდგენა ერთი დღის არქეოლოგიაა. IaC ამ ყველაფერს აქცევს ფაილად, რომელსაც წაიკითხავთ, განიხილავთ და ხელახლა გაუშვებთ.

Infrastructure as Code (IaC) — თქვენი სერვერების, ქსელების, მონაცემთა ბაზებისა და უფლებების აღწერა მანქანურად წასაკითხ ფაილებში, რის შემდეგაც ინსტრუმენტი ქმნის და აახლებს რეალურ რესურსებს ამ აღწერის მიხედვით. იგივე ღრუბლოვანი რესურსები, რომლებსაც ხელითაც შექმნიდით — გამოთვლა, საცავი, დატვირთვის ბალანსერები — ხდება ტექსტი ვერსიების კონტროლის ქვეშ. კონსოლი კი ხდება read-only დაფა და არა ჭეშმარიტების წყარო.

ClickOps vs. კოდი

  • ClickOps — ინფრასტრუქტურას ხელით აწყობთ ვებკონსოლში. სწრაფია ერთი რამის ერთხელ გასაკეთებლად; შეუძლებელია გამეორება, განხილვა ან აუდიტი.
  • IaC — სასურველ კონფიგურაციას წერთ ტექსტად. ინსტრუმენტი კითხულობს მას და რეალობას მას არგებს. მეორე ასლი გჭირდებათ? კიდევ ერთხელ გაუშვით.
  • განსხვავება იმ დღეს ჩანს, როცა სტეიჯინგი ზუსტად პროდაქშენს უნდა ჰგავდეს — ან როცა ავარიის შემდეგ ყველაფერი თავიდან უნდა ააგოთ.

ერთი კონსოლის სესია ერთ უნიკალურ ფიფქს ქმნის. ერთი ფაილი კი იმდენ იდენტურ გარემოს, რამდენიც გჭირდებათ.

განმეორებადი

იდენტური გარემო წუთებში — dev, სტეიჯინგი, სარეზერვო რეგიონი — ერთი და იმავე წყაროდან.

განხილვადი

ინფრასტრუქტურის ცვლილებები pull request-ის სახით მოდის. კოლეგა კითხულობს დიფს მანამ, სანამ ის პროდაქშენს შეეხება.

ვერსირებული

ყოველი ცვლილება კომიტია. ხედავთ, ვინ რა შეცვალა, როდის და რატომ — და ისევე დააბრუნებთ უკან, როგორც ნებისმიერ სხვა კოდს.

თვითდოკუმენტირება

ფაილები თავად არის დოკუმენტაცია. აღარაა მოძველებული ვიკი, რომელიც აღწერს კონსოლს, რომელსაც არავინ ხსნის.

02 · დეკლარაციული vs იმპერატიული და იდემპოტენტობა 5 წთ

აღწერეთ დანიშნულება,
და არა ყოველი მოხვევა.

კომპიუტერს ორნაირად შეიძლება ვუთხრათ, რომ რაღაც ააგოს. ან ჩამოთვლით ზუსტ ნაბიჯებს თანმიმდევრობით (იმპერატიული), ან აღწერთ საბოლოო შედეგს და ნაბიჯებს ინსტრუმენტი თავად მოძებნის (დეკლარაციული). თითქმის ყველა თანამედროვე IaC დეკლარაციულია — და სწორედ ეს არჩევანი ხდის ხელახალ გაშვებას უსაფრთხოს.

დეკლარაციული — თქვენ აცხადებთ სასურველ საბოლოო შედეგს; ინსტრუმენტი კი ითვლის, რა ქმედებებია საჭირო მის მისაღწევად. იმპერატიული პირიქითაა: ყოველ ნაბიჯს თავად წერთ. ინფრასტრუქტურაში დეკლარაციული იმარჯვებს, რადგან ინსტრუმენტს შეუძლია შეადაროს სასურველი უკვე არსებულს და მხოლოდ სხვაობა შეასრულოს.
იმპერატიული — ნაბიჯების სია
# do exactly these steps, in this order aws ec2 run-instances --image-id ami-123 --count 1 aws ec2 create-tags --tags Key=env,Value=prod # re-run this? you get a SECOND server. # server already exists? the script errors out.
დეკლარაციული — სასურველი შედეგი
# I want ONE server tagged prod to exist. resource "aws_instance" "web" { ami = "ami-123" instance_type = "t3.micro" tags = { env = "prod" } } # re-run? already matches → nothing happens.

ძრავა ადარებს სასურველს რეალურთან და მოქმედებს მხოლოდ სხვაობაზე — სწორედ ეს ხდის მეორე გაშვებას უსაფრთხოს.

იდემპოტენტობა — რას გვაძლევს

იდემპოტენტური — ერთი და იმავე ოპერაციის ერთხელ თუ ასჯერ გაშვება სისტემას ერთსა და იმავე საბოლოო მდგომარეობაში ტოვებს. გაუშვით apply თქვენს კონფიგურაციაზე; გაუშვით ისევ; ზედმეტი არაფერი მოხდება.
  • ზემოთ მოცემული იმპერატიული სკრიპტი არ არის იდემპოტენტური — ხელახალი გაშვება მეორე სერვერს შექმნის.
  • დეკლარაციული კონფიგურაცია კი არის — ის უკვე ემთხვევა რეალობას, ამიტომ ინსტრუმენტი წერს "no changes".
  • სწორედ ეს თვისება ხდის IaC-ის ავტომატურ გაშვებას უსაფრთხოს ყოველ დეპლოიზე, CI-ში.
03 · state და დრიფტი — კონცეფცია, რომელიც ყველას აბნევს 5 წთ

როგორ იცის ინსტრუმენტმა, რა
უკვე ეკუთვნის.

აი, კითხვა, რომელიც ყველა დამწყებს აბნევს: თქვენი კოდი ამბობს "ერთი სერვერი", ღრუბელში კი სერვერი დგას — მაგრამ საიდან იცის ინსტრუმენტმა, რომ ეს სერვერი სწორედ თქვენი კოდის შექმნილია და არა სხვისი? პასუხია state: ჩანაწერი, რომელიც თქვენს კოდში არსებულ ყოველ რესურსს ღრუბელში არსებულ რეალურ ობიექტს უკავშირებს.

State — ფაილი, რომელსაც ინსტრუმენტი აწარმოებს და რომელიც თქვენი კონფიგურაციის ყოველ რესურსს უკავშირებს მის მიერ შექმნილ რეალურ ობიექტს (ღრუბლის ID-ით). მის გარეშე ინსტრუმენტი ვერ გაარჩევდა "განაახლე არსებული სერვერი"-ს და "შექმენი სულ ახალი"-ს. state არის ინსტრუმენტის მეხსიერება იმისა, რაც მას ეკუთვნის.

state არის საძიებო ცხრილი: თქვენს კოდში არსებული რესურსი web არის ღრუბლის ობიექტი i-0ab9.

რატომ არის state პრაქტიკაში მნიშვნელოვანი

  • ის ძვირფასია. დაკარგეთ state ფაილი და ინსტრუმენტი დაივიწყებს, რა ეკუთვნის — შეიძლება უკვე არსებული რესურსების ხელახლა შექმნა სცადოს.
  • მას შეუძლია სეკრეტების შენახვა. პაროლები და გასაღებები ხშირად ღია ტექსტით ხვდება state-ში — სწორედ ამიტომ უნდა ინახებოდეს უსაფრთხოდ (ნაწილი 7).
  • ის საერთო უნდა იყოს. თუ ორი ინჟინერი საკუთარ ასლს დაიჭერს, ისინი ერთმანეთს შეეჯახებიან. აქედან მოდის დისტანციური state, ისევ ნაწილი 7.

დრიფტი — როცა რეალობა კოდს აღარ ემთხვევა

დრიფტი — სხვაობა, რომელიც ჩნდება, როცა რეალური ინფრასტრუქტურა თქვენი კოდის გარეთ იცვლება — ვიღაც კონსოლში პარამეტრს არედაქტირებს, ან ინციდენტის შესწორება ხელით ხდება. ახლა ღრუბელი აღარ ემთხვევა იმას, რასაც თქვენი ფაილები ამბობს.

ვიღაცამ სერვერი ხელით გაზარდა. შემდეგი plan შეუსაბამობას ამჩნევს და გთავაზობთ, რეალობა კოდს დაუბრუნოს.

როგორ მუშავდება დრიფტი

  • ინსტრუმენტი state-ს განაახლებს, ხედავს, რომ რეალობა განსხვავდება, და შემდეგ გაშვებაზე დრიფტს შემოთავაზებული ცვლილების სახით აჩვენებს.
  • თქვენ წყვეტთ: კოდმა გაიმარჯვოს (ხელით შეტანილი ცვლილება უკან დაბრუნდეს) თუ კოდი განახლდეს ახალი რეალობის შესაბამისად.
  • ქრონიკული დრიფტის წამალი: კოდი გახადეთ ინფრასტრუქტურის შეცვლის ერთადერთი გზა — ჩაკეტეთ კონსოლში ჩაწერის უფლება.
  • იღებთ უკვე ხელით აგებულ რესურსებს? გაუშვით მათზე import state-ში, რომ ინსტრუმენტმა თვალყურის დევნება დაიწყოს.
04 · plan და apply ვორქფლოუ 5 წთ

ჯერ ნახეთ ცვლილება,
მერე გააკეთეთ.

საუკეთესო ჩვევა, რომელსაც IaC გაძლევთ: არაფერი იცვლება, სანამ არ წაიკითხავთ ზუსტ ანონსს იმისა, რა შეიცვლება. ძირითადი ციკლია plan (მშრალი გაშვება — მაჩვენე დიფი), შემდეგ კი apply (გააკეთე). სწორედ ეს ანონსი აქცევს "იმედია იმუშავებს"-ს განხილვად, მოსაწყენ დეპლოიდ.

Plan — მშრალი გაშვება, რომელიც ადარებს თქვენს კოდს state-სა და რეალურ ინფრასტრუქტურას და ბეჭდავს, ზუსტად რას დაამატებდა, შეცვლიდა ან გაანადგურებდა — არაფერს რომ არ შეხებოდა. შემდეგ apply ასრულებს ამ გეგმას. წაიკითხეთ plan როგორც დიფი; სიმბოლოები მთელ ამბავს ჰყვება.
# a dry run — nothing has changed yet + aws_instance.web # create ~ aws_security_group.sg # update in place port: 80 -> 443 - aws_s3_bucket.old # DESTROY Plan: 1 to add, 1 to change, 1 to destroy.

ყოველდღიური ციკლი: write → init → plan → apply, ყოველ ცვლილებაზე გამეორებით. destroy კი ბოლოს ყველაფერს სუფთად ანგრევს.

+ ემატება

რესურსი, რომელიც თქვენს კოდშია, მაგრამ ჯერ არ არსებობს. ინსტრუმენტი შექმნის მას.

~ ცვლილება

რესურსი, რომელიც არსებობს, მაგრამ განსხვავდება. ყურადღება მიაქციეთ იმათ, რომლებიც ადგილზე რედაქტირების ნაცვლად ჩანაცვლდება — ეს მოცდენას ნიშნავს.

- განადგურება

რესურსი, რომელიც კოდს აღარ სურს. ეს ხაზები ყველაზე ყურადღებით წაიკითხეთ — შემთხვევითმა destroy-მ მონაცემთა ბაზა შეიძლება წაშალოს.

plan არის განხილვის არტეფაქტი

  • გუნდში plan-ის შედეგი pull request-ზე იდება, რომ ადამიანმა ზუსტი დიფი დაამტკიცოს apply-მდე.
  • გეგმა მოულოდნელი წაშლებით გაჩერების ნიშანია — გამოიძიეთ, სანამ apply-ს აკრეფდეთ.
  • ამის პაიპლაინში გაშვება (plan pull request-ზე, apply მერჯზე) არის ხიდი CI/CD ინსტრუმენტებამდე — ეს ნაწილ 7-შია.
  • ჩამოტვირთავს პროვაიდერებს — პლაგინებს, რომლებმაც იციან, როგორ ესაუბრონ AWS-ს, Azure-ს, GCP-ს, Cloudflare-ს და ასე შემდეგ.
  • აწყობს ბექენდს, სადაც state ინახება (ლოკალური ფაილი ან დისტანციური ბაკეტი).
  • შემოაქვს ყველა მოდული, რომელსაც თქვენი კოდი მიმართავს (შემდეგი სექცია). გაუშვით ერთხელ თითო ჩექაუთზე და ისევ პროვაიდერის ან მოდულის დამატების შემდეგ.
05 · მოდულები, გამეორება 4 წთ

დაწერეთ პატერნი ერთხელ,
გამოიყენეთ ყველგან.

როცა ერთი გარემო უკვე კოდში გაქვთ აღწერილი, მოგინდებათ მეორე, რომელიც თითქმის იგივეა. ფაილების კოპირება ხაფანგია — ახლა ყოველი შესწორება სამ ადგილას უნდა გააკეთოთ. მოდული ინფრასტრუქტურის ნაწილს ერთხელ ალაგებს და საშუალებას გაძლევთ, სხვადასხვა შემავალი პარამეტრით დაბეჭდოთ იგი.

მოდული — რესურსების ხელახლა გამოსაყენებელი, პარამეტრიზებული კრებული, რომელსაც შემავალი მნიშვნელობებით იძახებთ და შედეგებს იღებთ — იგივე იდეა, რაც ფუნქცია ჩვეულებრივ კოდში. აღწერეთ "ქსელი ორი საბქსელითა და გეითვეით" ერთხელ, შემდეგ კი გამოიძახეთ dev-ისთვის, სტეიჯინგისთვის და პროდაქშენისთვის სხვადასხვა ზომებით. ეს არის DRY ინფრასტრუქტურისთვის.
# call one module twice with different inputs module "network" { source = "../modules/network" cidr = "10.0.0.0/16" env = "prod" } module "db" { source = "../modules/database" size = "large" # prod gets the big one }

root მოდული ერთმანეთს უკავშირებს შვილობილ მოდულებს; თითოეული შვილი ყველა გარემოში სხვადასხვა პარამეტრით გამოიყენება.

ინფუთი და აუთფუთი

მოდული იღებს ცვლადებს (ზომა, რეგიონი, სახელი) და გამოაქვს შედეგები (მონაცემთა ბაზის ენდპოინტი), რომ გამომძახებლებმა ისინი ერთმანეთს დაუკავშირონ — ზუსტად როგორც ფუნქციის ხელმოწერა.

ზედმეტი მოდულარიზაცია

ერთი რესურსის შემომსაზღვრელი მოდული მხოლოდ ზედმეტ შუამავალ ფენას ამატებს. მიმართეთ მოდულს მაშინ, როცა რესურსების ჯგუფი მეორდება — და არა რეფლექსით.

საჯარო რეესტრები

Terraform / OpenTofu Registry-ს აქვს ბრძოლაში გამოცდილი მოდულები (VPC-ები, EKS კლასტერები). მიამაგრეთ ვერსია და წაიკითხეთ კოდი, სანამ პროდაქშენში ენდობით.

თითქოს  სტანდარტული ოთახის ნახაზი — დახატეთ ერთხელ, შემდეგ კი ააშენეთ სამ სართულზე სხვადასხვა საღებავითა და ავეჯით. Kubernetes კლასტერის აწყობა კლასიკური ამოცანაა კარგად ტესტირებული მოდულისთვის და არა ხელით დაწერილი რესურსებისთვის.

06 · ინსტრუმენტების რუკა 5 წთ

Terraform, Pulumi,
CloudFormation — და როდის რომელი.

ინსტრუმენტები ძირითადად ორ კითხვაზე იყოფა: სპეციალურ საკონფიგურაციო ენას წერთ თუ ნამდვილ საპროგრამო ენას, და ერთ ღრუბელზე ხართ მიბმული თუ ბევრზე. არცერთი არაა "საუკეთესო" — თითოეული სწორი არჩევანია სხვადასხვა ადგილას. აი, პატიოსანი კომპრომისები.

შენიშვნა სახელებზე: 2023 წელს Terraform source-available ლიცენზიაზე გადავიდა და საზოგადოებამ ბოლო ღია ვერსია OpenTofu-დ დაფორკა (ახლა Linux Foundation-ის ქვეშ). ისინი კვლავ თითქმის სრულად თავსებადია და HCL ენას იზიარებენ, ამიტომ ეს დეკი მათ ერთად განიხილავს.

Terraform / OpenTofu — დეკლარაციული ნაგულისხმევი არჩევანი

# HCL — სპეციალურად შექმნილი კონფიგურაციის ენა resource "aws_s3_bucket" "assets" { bucket = "my-app-assets" } resource "cloudflare_record" "www" { name = "www" type = "CNAME" } # ერთი ინსტრუმენტი, ბევრი ღრუბლოვანი პროვაიდერი

დეკლარაციული HCL. ინდუსტრიის ნაგულისხმევი არჩევანი პროვაიდერების ყველაზე დიდი ეკოსისტემით — მას თითქმის ნებისმიერი ღრუბლის ან SaaS-ის მართვა შეუძლია და არა მხოლოდ AWS-ის.

დადებითი — მრავალღრუბლოვანი, უზარმაზარი მოდულების რეესტრი, დეკლარაციული და წასაკითხად ადვილი; დე-ფაქტო სტანდარტი.

უარყოფითი — HCL ცალკე ენაა შეზღუდული ლოგიკით; რთული პირობები მოუხერხებელი ხდება.

აირჩიეთ, როცა გინდათ პორტატული, დეკლარაციული სტანდარტი ერთზე მეტი პროვაიდერისთვის — უსაფრთხო ნაგულისხმევი არჩევანი.

Pulumi — ნამდვილი ენები, დეკლარაციული შედეგი

// ინფრა TypeScript / Python / Go / C#-ზე const bucket = new aws.s3.Bucket("assets") // ნამდვილი ციკლები, ტიპები, IDE-ის დახმარება for (const env of ["dev", "prod"]) { new aws.s3.Bucket(`logs-${env}`) }

ინფრასტრუქტურას ზოგადი დანიშნულების ენაზე წერთ, ძრავა კი მაინც დეკლარაციულად მუშაობს — state, plan და apply, ზუსტად ისე, როგორც Terraform-ში.

დადებითი — ენის სრული ძალა: ციკლები, ფუნქციები, ტიპები, ტესტები, IDE-ის ავტოშევსება; შესანიშნავია რთული ლოგიკისთვის.

უარყოფითი — ეს ძალა სირთულეს იწვევს; ეკოსისტემა უფრო პატარაა; გუნდმა ენა უნდა იცოდეს.

აირჩიეთ, როცა ინფრას დეველოპერები ფლობენ და ნამდვილი კოდი უნდათ — აბსტრაქციები, უნიტ-ტესტები და საერთო ბიბლიოთეკები.

CloudFormation & CDK — AWS-ის მშობლიური ვარიანტი

// CDK: კოდი, რომელიც CloudFormation-ს აგენერირებს new s3.Bucket(this, "Assets", { versioned: true, }) // CloudFormation თავად YAML/JSON შაბლონებია, // რომელსაც AWS მართავს — state ფაილზე ზრუნვა არ გჭირდებათ.

CloudFormation არის AWS-ის მშობლიური დეკლარაციული შაბლონები; CDK კი საშუალებას გაძლევთ, ნამდვილი კოდი დაწეროთ, რომელიც ამ შაბლონებს აგენერირებს. state-ს AWS თქვენ ნაცვლად ინახავს.

დადებითი — ღრმა, პირველივე დღიდან AWS ინტეგრაცია; AWS მართავს state-სა და როლბექებს; დამატებითი ინსტრუმენტები არ გჭირდებათ.

უარყოფითი — მხოლოდ AWS, სრული მიბმა; ნედლი შაბლონები სიტყვამრავალია; განახლებები შეიძლება ნელი იყოს.

აირჩიეთ, როცა სრულად AWS-ზე ხართ და გინდათ პირველი მხარის, სრულად მართული ინსტრუმენტი მესამე მხარის გარეშე.

Ansible — კონფიგურაციის მართვა და არა პროვიჟენინგი

# თითქმის პროცედურული: ამოცანები ზემოდან ქვემოთ მიდის - name: install and start nginx apt: { name: nginx, state: present } - name: ensure it is running service: { name: nginx, state: started } # ბრწყინავს არსებული სერვერების კონფიგურაციაში

Ansible ამოცანებზეა აგებული და იმპერატიულობისკენ იხრება (ნაბიჯების სია), თუმცა კარგი მოდულები იდემპოტენტურია. მისი ძლიერი მხარეა მანქანების კონფიგურაცია და არა ღრუბლოვანი რესურსების პროვიჟენინგი.

დადებითი — აგენტის გარეშე (მხოლოდ SSH), მარტივი YAML, შესანიშნავია პროგრამების დაყენებისა და კონფიგურაციისთვის.

უარყოფითი — სუსტია ღრუბლოვანი რესურსების სასიცოცხლო ციკლის მართვაში; არ აქვს Terraform-ის მსგავსი state/plan მოდელი.

აირჩიეთ სერვერის შიგნით კონფიგურაციისთვის — ხშირად Terraform-თან ერთად: ერთით ქმნით, მეორით აკონფიგურირებთ.

დეკლარაციული ბანაკი

Terraform / OpenTofu და CloudFormation: თქვენ აცხადებთ საბოლოო შედეგს. უფრო ადვილი წასაკითხია, უფრო უსაფრთხოა ხელახლა გასაშვებად და ბუნებრივად ერგება ღრუბლოვანი რესურსების პროვიჟენინგს. სწორედ აქედან უნდა დაიწყოს გუნდების უმეტესობამ.

რა კომპრომისი აწონოთ

ნამდვილ ენებზე აგებული ინსტრუმენტები (Pulumi, CDK) და იმპერატიულები (Ansible) მეტ ძალასა და მოქნილობას გაძლევთ — იმის ფასად, რომ მეტი გზა გაქვთ ისეთი ჭკვიანური რამის დასაწერად, რომელსაც შემდეგი ადამიანი ვეღარ გაჰყვება. ძალას მაშინ მიმართეთ, როცა უბრალო საკონფიგურაციო ენა ნამდვილად ვერ გამოხატავს საჭიროს.

07 · კარგი პრაქტიკა + შეჯამება 4 წთ

კოდი გახადეთ
ერთადერთი შესასვლელი.

IaC მაშინ ამართლებს, როცა კოდი ჭეშმარიტების ერთადერთი წყაროა და პროდაქშენს ხელით არავინ არედაქტირებს. სამი პრაქტიკა მიგიყვანთ იქამდე: შეინახეთ state დისტანციურად და უსაფრთხოდ, სეკრეტები ფაილებს გარეთ დატოვეთ და ყველაფერი პაიპლაინში გაატარეთ, რომ ყოველი ცვლილება განიხილებოდეს.

დაშორებული state

საერთო, ჩაკეტილი, დარეზერვებული

შეინახეთ state საერთო ბექენდში — S3 ბაკეტში, Azure Blob-ში, GCS-ში ან მართულ სერვისში, როგორიცაა HCP Terraform — ლოკით, რომ ორი apply ერთდროულად ვერ გაეშვას, და ვერსირებით, რომ აღდგენა შეძლოთ. არასოდეს დააკომიტოთ state git-ში.

სეკრეტები

არასოდეს ჩაწეროთ ისინი კოდში

არ ჩასვათ პაროლები .tf ფაილებში. წამოიღეთ ისინი სეკრეტების მენეჯერიდან (Vault, AWS Secrets Manager) გაშვების დროს. გახსოვდეთ, state-ს შეუძლია სეკრეტები ღია ტექსტით შეინახოს — ამიტომ დაშიფრეთ ბექენდი და შეზღუდეთ, ვის შეუძლია მისი წაკითხვა.

IaC CI-ში / GitOps

plan pull request-ზე, apply მერჯზე

გაუშვით plan ავტომატურად ყოველ pull request-ზე, გამოაქვეყნეთ დიფი განსახილველად და გაუშვით apply მხოლოდ მერჯის შემდეგ — არასოდეს ლეპტოპიდან. პაიპლაინის მექანიკისთვის იხილეთ Developer Tooling.

GitOps — git როგორც ჭეშმარიტების წყარო

GitOps — თქვენი ინფრასტრუქტურის სასურველი მდგომარეობა git რეპოზიტორიაში ცხოვრობს, ავტომატური პროცესი კი რეალობას იმას არგებს, რაც დამერჯილია. ინფრასტრუქტურის ცვლილება არის pull request: განხილული, დამტკიცებული, დამერჯილი და პაიპლაინის მიერ შესრულებული — და არა კონსოლთან წვდომის მქონე ადამიანის მიერ.

pull request-ზე განიხილება გეგმა; მერჯი კი apply-ს უშვებს. პროდაქშენს პირდაპირ ადამიანი არ ეხება.

1აღწერეთ დანიშნულება და არა ნაბიჯები. დეკლარაციულობა + იდემპოტენტობა ხდის IaC-ს უსაფრთხოდ გასაშვებს ყოველ დეპლოიზე.
2პატივი ეცით state-ს. ის ინსტრუმენტის მეხსიერებაა — შეინახეთ დისტანციურად, ჩაკეტეთ, დაარეზერვეთ და git-ს გარეთ დატოვეთ.
3ყოველთვის წაიკითხეთ plan. განიხილეთ დიფი apply-მდე; შემთხვევითი destroy არის ზღვარი დეპლოისა და ავარიას შორის.
4გამოიყენეთ მოდულები, ოღონდ ზედმეტად ნუ ჩაახლართავთ. შეფუთეთ რესურსების განმეორებადი ჯგუფები; ერთი რესურსის შემოსახვევი გამოტოვეთ.
5კოდი გახადეთ ერთადერთი კარი. ჩაკეტეთ კონსოლში ჩაწერა, ყველაფერი CI-ში გაატარეთ და დრიფტი აღარ იქნება პრობლემა, რომელსაც ებრძვით.
  • ახლა იწყებთ ან მრავალღრუბლოვანი ხართ? → Terraform / OpenTofu. პორტატული, დეკლარაციული ნაგულისხმევი არჩევანი.
  • სრულად AWS-ზე ხართ და პირველი მხარე გინდათ? → CloudFormation, ან CDK, თუ გუნდს ნამდვილი კოდი ურჩევნია.
  • ინფრას დეველოპერები ფლობენ და ნამდვილი აბსტრაქციები და ტესტები გინდათ? → Pulumi.
  • უკვე არსებულ სერვერებზე პროგრამებს აკონფიგურირებთ? → Ansible, ხშირად Terraform-თან ერთად.
  • როცა ეჭვი გაქვთ, აირჩიეთ უფრო მარტივი, დეკლარაციული ვარიანტი — ძალას მოგვიანებით დაამატებთ, როცა ნამდვილად დაგჭირდებათ.
ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი სწრაფი კითხვა დეკლარაციულ IaC-ზე, state-ზე, დრიფტზე, plan/apply-ზე და ინსტრუმენტების რუკაზე — მყისიერი პასუხი, ავტორიზაციის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ისრებით ან სქროლით · ბიბლიოთეკაში დაბრუნება