مقدمة إلى Terraform للمبتدئين – دروس Terraform

أتساءل ما هو Terraform؟ دعنا نتعرف على ذلك.

البنية التحتية كرمز (IaC) هي مصطلح واسع الانتشار بين محترفي DevOps. إنها عملية إدارة وتزويد البنية التحتية الكاملة لتكنولوجيا المعلومات (التي تضم كلًا من الأجهزة المادية والظاهرية) باستخدام ملفات تعريف قابلة للقراءة آليًا. إنه نهج هندسة البرمجيات تجاه العمليات. يساعد في أتمتة مركز البيانات الكامل باستخدام البرامج النصية للبرمجة.

مع كل الميزات التي توفرها البنية التحتية مثل Code ، فإنها تواجه تحديات متعددة:

  • بحاجة إلى تعلم البرمجة
  • لا أعرف تأثير التغيير.
  • تحتاج إلى التراجع عن التغيير
  • لا يمكن تعقب التغييرات
  • لا يمكن أتمتة مورد
  • بيئات متعددة للبنية التحتية

تم إنشاء Terraform لحل هذه التحديات.

ما هو Terraform؟

Terraform هي بنية تحتية مفتوحة المصدر كأداة كود تم تطويرها بواسطة HashiCorp. يتم استخدامه لتحديد البنية التحتية الكاملة وتوفيرها باستخدام لغة تعريفية سهلة التعلم.

إنها أداة توفير البنية التحتية حيث يمكنك تخزين إعداد البنية التحتية السحابية كرموز. إنه مشابه جدًا لأدوات مثل تشكيل السحابة، والتي ستستخدمها لأتمتة البنية التحتية لـ AWS الخاصة بك ، ولكن لا يمكنك استخدامها إلا على AWS. مع Terraform ، يمكنك استخدامه على منصات سحابية أخرى أيضًا.

فيما يلي بعض فوائد استخدام Terraform.

  • هل التنسيق ، وليس فقط إدارة التكوين
  • يدعم العديد من المزودين مثل AWS و Azure و GCP و DigitalOcean وغيرها الكثير
  • توفير بنية تحتية غير قابلة للتغيير حيث يتغير التكوين بسلاسة
  • يستخدم لغة سهلة الفهم ، HCL (لغة تكوين HashiCorp)
  • سهل النقل إلى أي مزود آخر
  • يدعم بنية العميل فقط ، لذلك لا حاجة إلى إدارة تكوين إضافية على الخادم

مفاهيم Terraform الأساسية

فيما يلي المفاهيم / المصطلحات الأساسية المستخدمة في Terraform:

  • المتغيرات: تُستخدم أيضًا كمتغيرات إدخال ، وهي عبارة عن زوج قيم مفتاح تستخدمه وحدات Terraform للسماح بالتخصيص.
  • المزود: هو مكون إضافي للتفاعل مع واجهات برمجة التطبيقات للخدمة والوصول إلى الموارد ذات الصلة.
  • الوحدة النمطية: هو مجلد به قوالب Terraform حيث يتم تحديد جميع التكوينات
  • الحالة: تتكون من معلومات مخزنة مؤقتًا حول البنية التحتية التي يديرها Terraform والتكوينات ذات الصلة.
  • الموارد: يشير إلى كتلة واحدة أو أكثر من كائنات البنية التحتية (مثيلات الحساب ، والشبكات الافتراضية ، وما إلى ذلك) ، والتي تُستخدم في تكوين البنية التحتية وإدارتها.
  • مصدر البيانات: يتم تنفيذه من قبل مقدمي الخدمات لإرجاع المعلومات حول الكائنات الخارجية للتهيئة.
  • قيم الإخراج: هذه هي قيم إرجاع وحدة نمطية يمكن استخدامها بواسطة تكوينات أخرى.
  • الخطة: هي إحدى المراحل التي تحدد فيها ما يجب إنشاؤه أو تحديثه أو تدميره للانتقال من الحالة الحقيقية / الحالية للبنية التحتية إلى الحالة المطلوبة.
  • تطبيق: وهي إحدى المراحل التي يتم فيها تطبيق التغييرات الحقيقية / الحالية للبنية التحتية من أجل الانتقال إلى الحالة المطلوبة.

دورة حياة Terraform

تتكون دورة حياة Terraform من – init ، تخطيط ، تطبيق ، تدمير.

  • يهيئ Terraform init دليل العمل الذي يتكون من جميع ملفات التكوين
  • تُستخدم خطة Terraform لإنشاء خطة تنفيذ للوصول إلى الحالة المرغوبة للبنية التحتية. يتم إجراء التغييرات في ملفات التكوين من أجل تحقيق الحالة المطلوبة.
  • يتم تطبيق Terraform ثم يقوم بإجراء التغييرات في البنية التحتية على النحو المحدد في الخطة ، وتأتي البنية التحتية إلى الحالة المطلوبة.
  • يتم استخدام Terraform destruction لحذف جميع موارد البنية التحتية القديمة ، والتي يتم تمييزها بأنها ملوثة بعد مرحلة التطبيق.

كيف يعمل Terraform؟

يتكون Terraform من مكونين رئيسيين يشكلان بنيته:

Terraform كور

يستخدم Terraform core مصدرين من مصادر الإدخال للقيام بعمله.

مصدر الإدخال الأول هو تكوين Terraform الذي تقوم أنت ، كمستخدم ، بتكوينه. هنا ، تحدد ما يجب إنشاؤه أو توفيره. ومصدر الإدخال الثاني هو حالة يحافظ فيها terraform على الحالة المحدثة لكيفية ظهور البنية التحتية الحالية.

لذا ، ما يقوم به terraform core هو أنه يأخذ المدخلات ، ويحدد خطة ما يجب القيام به. يقارن الحالة ، ما هي الحالة الحالية ، وما هو التكوين الذي تريده في النتيجة النهائية. يكتشف ما يجب القيام به للوصول إلى الحالة المطلوبة في ملف التكوين. إنه يوضح ما يجب إنشاؤه ، وما يحتاج إلى تحديث ، وما يجب حذفه لإنشاء البنية التحتية وتوفيرها.

  ما هو التركيز على التراص؟

الموفرون

المكون الثاني للهندسة المعمارية هم مقدمو تقنيات محددة. قد يكون هذا موفري السحابة مثل AWS أو Azure أو GCP أو بنية أساسية أخرى كمنصة خدمة. كما أنه مزود لمزيد من المكونات عالية المستوى مثل Kubernetes أو غيرها من أدوات النظام الأساسي كخدمة ، وحتى بعض البرامج كأداة خدمة ذاتية.

يمنحك إمكانية إنشاء بنية تحتية على مستويات مختلفة.

على سبيل المثال – أنشئ بنية أساسية لـ AWS ، ثم انشر Kubernetes فوقها ثم أنشئ خدمات / مكونات داخل مجموعة Kubernetes.

تمتلك Terraform أكثر من مائة مزود لتقنيات مختلفة ، ومن ثم يمنح كل مزود للمستخدم إمكانية الوصول إلى موارده. لذلك من خلال موفر AWS ، على سبيل المثال ، يمكنك الوصول إلى مئات من موارد AWS مثل مثيلات EC2 ومستخدمي AWS وما إلى ذلك. مع مزود Kubernetes ، يمكنك الوصول إلى السلع والموارد مثل الخدمات وعمليات النشر ومساحات الأسماء ، إلخ.

لذلك ، هذه هي الطريقة التي يعمل بها Terraform ، وبهذه الطريقة ، يحاول مساعدتك في توفير وتغطية إعداد التطبيق الكامل من البنية التحتية وصولاً إلى التطبيق.

لنفعل بعض الأشياء العملية. 👨‍💻

سنقوم بتثبيت Terraform على Ubuntu ونوفر بنية تحتية أساسية للغاية.

تثبيت Terraform

قم بتنزيل أحدث حزمة terraform.

الرجوع إلى صفحة التحميل الرسمية للحصول على أحدث إصدار لنظام التشغيل المعني.

[email protected]:~$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
--2020-08-14 16:55:38--
https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.153.183, 2a04:4e42:24::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.153.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 34851622 (33M) [application/zip]
Saving to: ‘terraform_0.13.0_linux_amd64.zip’

terraform_0.13.0_linux_amd64.zip
100%[=================================================================>] 33.24M
90.3KB/s in 5m 28s

2020-08-14 17:01:06 (104 KB/s) - ‘terraform_0.13.0_linux_amd64.zip’ saved [34851622/34851622]

قم باستخراج الحزمة التي تم تنزيلها.

[email protected]:~$ unzip terraform_0.13.0_linux_amd64.zip
Archive:
terraform_0.13.0_linux_amd64.zip
inflating: terraform

انقل ملف terraform القابل للتنفيذ إلى المسار الموضح أدناه. تحقق من نسخة terraform.

[email protected]:~$ sudo mv terraform /usr/local/bin/
[sudo] password for admingate.org:
[email protected]:~$ terraform -v
Terraform v0.13.0

يمكنك أن ترى هذه هي الأوامر المتوفرة في terraform للتنفيذ.

[email protected]:~$ terraform
Usage: terraform [-version] [-help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
apply Builds or changes infrastructure
console Interactive console for Terraform interpolations
destroy Destroy Terraform-managed infrastructure
env Workspace management
fmt Rewrites config files to canonical format
get Download and install modules for the configuration
graph Create a visual graph of Terraform resources
import Import existing infrastructure into Terraform
init Initialize a Terraform working directory
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Read an output from a state file
plan Generate and show an execution plan
providers Prints a tree of the providers used in the configuration
refresh Update local state file against real resources
show Inspect Terraform state or plan
taint Manually mark a resource for recreation
untaint Manually unmark a resource as tainted
validate Validates the Terraform files
version Prints the Terraform version
workspace Workspace management

All other commands:
0.12upgrade Rewrites pre-0.12 module source code for v0.12
0.13upgrade Rewrites pre-0.13 module source code for v0.13
debug Debug output management (experimental)
force-unlock Manually unlock the terraform state
push Obsolete command for Terraform Enterprise legacy (v1)
state Advanced state management

قم بتوفير مثيل AWS EC2 باستخدام Terraform

في هذا العرض التوضيحي ، سأطلق مثيل AWS EC2 جديدًا باستخدام Terraform.

إنشاء دليل عمل لهذا العرض التوضيحي Terraform.

[email protected]:~$ mkdir terraform_demo

انتقل إلى الدليل وأنشئ ملف تكوين terraform حيث تحدد الموفر والموارد لتشغيل مثيل AWS EC2.

[email protected]:~$ cd terraform_demo/
[email protected]:~/terraform_demo$ gedit awsec2.tf

provider "aws" {
access_key = "B5KG6Fe5GUKIATUF5UD"
secret_key = "R4gb65y56GBF6765ejYSJA4YtaZ+T6GY7H"
region = "us-west-2"
}

resource "aws_instance" "terraform_demo" {
ami = "ami-0a634ae95e11c6f91"
instance_type = "t2.micro"
}

ملاحظة: لقد قمت بتغيير مفاتيح الوصول والمفاتيح السرية 😛 ، فأنت بحاجة إلى استخدام مفتاحك الخاص.

من التكوين المذكور أعلاه ، يمكنك أن ترى أنني أذكر المزود مثل AWS. داخل الموفر ، أمنح بيانات اعتماد مستخدم AWS والمناطق التي يجب إطلاق المثيل فيها.

في الموارد ، أعطي تفاصيل AMI عن Ubuntu (ami-0a634ae95e11c6f91) ويجب أن يكون ذكر نوع المثيل t2.micro

  كيفية إضافة قواعد إلى خادم الفتنة

يمكنك معرفة مدى سهولة وقراءة ملف التكوين ، حتى لو لم تكن مبرمجًا متشددًا.

تهيئة terraform

الآن ، الخطوة الأولى هي تهيئة terraform.

[email protected]:~/terraform_demo$ terraform init

Initializing the backend...

Initializing provider plugins...
- Using previously-installed hashicorp/aws v3.2.0

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.

* hashicorp/aws: version = "~> 3.2.0"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

خطة terraform

التالي هو مرحلة الخطة ؛ سيُنشئ الرسم البياني للتنفيذ لإنشاء البنية التحتية وتوفيرها.

[email protected]:~/terraform_demo$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)

+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}

+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}

+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}

+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}

+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

تطبيق terraform

ستقوم مرحلة التقديم بتنفيذ ملف التكوين وتشغيل مثيل AWS EC2. عند تشغيل تطبيق الأمر ، سيسألك ، “هل تريد تنفيذ هذه الإجراءات؟” ، فأنت بحاجة إلى كتابة نعم والضغط على إدخال.

[email protected]:~/terraform_demo$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)

+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}

+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}

+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}

+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}

+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

aws_instance.terraform_demo: Creating...
aws_instance.terraform_demo: Still creating... [10s elapsed]
aws_instance.terraform_demo: Still creating... [20s elapsed]
aws_instance.terraform_demo: Still creating... [30s elapsed]
aws_instance.terraform_demo: Still creating... [40s elapsed]
aws_instance.terraform_demo: Creation complete after 44s [id=i-0eec33286ea4b0740]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

انتقل إلى لوحة معلومات AWS EC2 الخاصة بك ، وسترى مثيلًا جديدًا بمعرف المثيل المذكور في نهاية أمر التطبيق قد تم إنشاؤه.

  المستند التقني - ماذا والغرض وأنواع وكيفية كتابته

لقد نجحت في تشغيل مثيل AWS EC2 باستخدام Terraform.

تدمير الأرض

أخيرًا ، إذا كنت تريد حذف البنية التحتية ، فأنت بحاجة إلى تشغيل أمر التدمير.

[email protected]:~/terraform_demo$ terraform destroy
aws_instance.terraform_demo: Refreshing state... [id=i-0eec33286ea4b0740]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy

Terraform will perform the following actions:

# aws_instance.terraform_demo will be destroyed
- resource "aws_instance" "terraform_demo" {
- ami = "ami-0a634ae95e11c6f91" -> null
- arn = "arn:aws:ec2:us-west-2:259212389929:instance/i-0eec33286ea4b0740" -> null
- associate_public_ip_address = true -> null
- availability_zone = "us-west-2c" -> null
- cpu_core_count = 1 -> null
- cpu_threads_per_core = 1 -> null
- disable_api_termination = false -> null
- ebs_optimized = false -> null
- get_password_data = false -> null
- hibernation = false -> null
- id = "i-0eec33286ea4b0740" -> null
- instance_state = "running" -> null
- instance_type = "t2.micro" -> null
- ipv6_address_count = 0 -> null
- ipv6_addresses = [] -> null
- monitoring = false -> null
- primary_network_interface_id = "eni-02a46f2802fd15634" -> null
- private_dns = "ip-172-31-13-160.us-west-2.compute.internal" -> null
- private_ip = "172.31.13.160" -> null
- public_dns = "ec2-34-221-77-94.us-west-2.compute.amazonaws.com" -> null
- public_ip = "34.221.77.94" -> null
- secondary_private_ips = [] -> null
- security_groups = [
- "default",
] -> null
- source_dest_check = true -> null
- subnet_id = "subnet-5551200c" -> null
- tags = {} -> null
- tenancy = "default" -> null
- volume_tags = {} -> null
- vpc_security_group_ids = [
- "sg-b5b480d1",
] -> null

- credit_specification {
- cpu_credits = "standard" -> null
}

- metadata_options {
- http_endpoint = "enabled" -> null
- http_put_response_hop_limit = 1 -> null
- http_tokens = "optional" -> null
}

- root_block_device {
- delete_on_termination = true -> null
- device_name = "/dev/sda1" -> null
- encrypted = false -> null
- iops = 100 -> null
- volume_id = "vol-0be2673afff6b1a86" -> null
- volume_size = 8 -> null
- volume_type = "gp2" -> null
}
}

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

aws_instance.terraform_demo: Destroying... [id=i-0eec33286ea4b0740]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 10s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 20s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 30s elapsed]
aws_instance.terraform_demo: Destruction complete after 34s

Destroy complete! Resources: 1 destroyed.

إذا قمت بإعادة فحص لوحة معلومات EC2 ، فسترى أنه تم إنهاء المثيل.

استنتاج

أعتقد أن ما ورد أعلاه يمنحك فكرة لتبدأ مع Terraform. انطلق وجرب المثال الذي عرضته للتو.

يجب عليك أيضًا التحقق من برامج أتمتة البنية التحتية هذه.

إذا كنت مهتمًا بمعرفة المزيد ، فأقترح التحقق دورة تعلم DevOps مع Terraform.