ááŒá¿áá¬áá±á¬ááºážáá
áºáá¯ááᯠááŒá±ááŸááºážááá¯á· áá»áœááºáá±á¬áºáá±ážáá²á·áá²á· CLI tool á¡áá
áºá¡ááŒá±á¬ááºáž ááŒá±á¬ááŒáá»ááºáá«áááºá
ááŒá¿áá¬
Terraform ááẠDevops/Cloud/IT á¡ááá¯ááºá¡áááºážááœáẠá
á¶áááºááŸááºáá»ááºáá
áºáá¯ááŒá
áºáááºááŸá¬ ááŒá¬áá«ááŒá®á á¡ááá¯áá«á¡áá¬ááẠcode á¡ááŒá
áºá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááŸáá·áºáááºáá¶áá¬ááœááºá¡ááœááºá¡áááºááŒá±ááŒá®ážá¡áá¯á¶ážáááºáááºá Terraform ááœáẠáá»á±á¬áºááœáŸááºá
áá¬áá»á¬ážá
áœá¬á¡ááŒáẠáááºáááºážáá»á¬ážá áá»áœááºáááºáá±á¬áá¬ážáá»á¬ážááŸáá·áº ááœááºááŒá
áºáá»á¬ážá
áœá¬ááŸááááºá
Terraform ááŒáá·áº á¡áá¬áá
áºáá»á¬ážááᯠáááºáá®ážááŒá®ážáá±á¬áẠá
á®áá¶ááá·áºááœá²ááŒááºážá ááŒá±á¬ááºážáá²ááŒááºáž ááá¯á·ááá¯áẠáá»ááºááŒááºážááá¯á· ááŒá¯áá¯ááºááẠá¡ááœááºá¡áááºááŒá±áá«áááºá Terraform ááŸáááá·áº áááºáá®ážááá¬ážáá±á¬ Cloud ááœáẠááŒá®ážáá¬ážáá±á¬ á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬áž ááŸááá°áá»á¬ážááẠáá¬áá¯ááºááá·áºááááºážá cloud áá
áºáá¯áá¯á¶ážááᯠááŒááºáááºáá±ážáá¬ážááŒááºážááŸáá·áº ááŒááºáááºáááºáá®ážááŒááºážááẠáá
áºáááºážáááºážááŒáá·áº á
á»á±ážááŒá®ážááŒá®áž á¡áá¹ááá¬ááºááááºážáá«á
á¡áá¯áẠ2 áá¯ááŸá¬ áá®ááŒá¿áá¬ááᯠáá«ááŒá¯á¶áá²á·áááºá á¡ááŸááºážáá¯á¶áž á¥ááá¬á á¡áá¬á¡á¬ážáá¯á¶ážááᯠterraform ááá¯ááºááœá±á¡ááŒá
ẠGit ááŸá¬ áá¬ážáá»ááºáá²á·á¡áá«á áá«áá±ááá·áº áááºážááŸá¬ áá¯á¶ážáá±á«ááºáž 250+ ááŸáááŒá®áž á¡á²áá«ááœá±ááᯠterraform ááŸá¬ áááºáá²á·áá±ážááᬠá¡áá»á¬ážááŒá®ážáá²á
ááŸááá«áááº
áá±áá°áá»á¡á¬ážááŒáá·áº á¡áá¬á¡á¬ážáá¯á¶ážááẠáá¯á¶ááœááºááŒáá¬ážááá·áºá¡ááá¯ááºáž áá¬áááºááŸáááºááá¯á·áá¬ááŸááááºá
ááááá±ážáá»ááºáá»á¬áž- á á¬áá±ážááá¬ááẠáá¯ááŸá¬ážááœáẠáááºáááºážáá áºáááºáá»áŸ ááá±ááá¯ááºáá² áá¯ááŸá¬ážáá¬áá¬ááŒáá·áº á¡áááºážáááºáá±ážáá«áááºá á á¬áá¯á¶ážáá±á«ááºážá¡ááŸá¬ážáá»á¬áž ááááá¬ážáá«á
ááŒá±ááŸááºážáá»ááº
1. AWS á¡ááœáẠá¡áááºááá·áºáá¯ááºááŒá®ážáá¬áž ááŒá±ááŸááºážáá»ááºá¡áá±á¬ááºážááœá± ááŸááááºá
terraforming áááºáá²á·ááá¯á·á¡áá¯ááºáá¯ááºáááº- áááºážááẠAWS SDK ááŸáá±áá¬ááá¯áá°áᬠtemplate áá
áºáá¯ááŸáááá·áº tf ááŸáá·áº tfstate ááá¯áá¯ááºáá±ážáááºá
á€áá±áá¬ááœáẠááŒá¿áᬠá áá¯ááŸááááºá
1. á¡ááºááááºáá»á¬ážááœáẠáá±á¬ááºáá»áá»ááºáá±áááºáááºá
2. tf ááá¯ááºááœá± ááá«ááᶠááœá²ááœááºáá¬áááºá
3. tfstate ááᯠtf á០áá®ážááŒá¬áž á
á¯áá±á¬ááºážáá¬ážááŒá®áž á¡ááŒá²áááºáž á¡ááœááºááá±á¬ááºáá«á
áá±áá°áá»á¡á¬ážááŒáá·áºá á¡ááŒá±á¬ááºážá¡áá²áááŸááᯠ'ááŒá±ááŒááºá¡á
á®á¡á
á¥áº' áááŒá±á¬ááá·áºááááºááá¯áááŸááááºáááºáá²áááºá
2. `terraform import` ááẠterraform ááœáẠbuilt-in command áá
áºáá¯ááŒá
áºáááºá áá«ááááºááá¯áá»áá¯ážá¡áá¯ááºáá¯ááºááá²?
áááºááẠá¡áááºááŸáá·áº áááºážááŒá
Ạá¡áá»áá¯ážá¡á
á¬ážááŒáá·áº á¡ááœáẠTF ááá¯ááºááᯠáá±ážááŒá®áž 'terraform import' ááᯠááœáá·áºááŒá®áž á¡áááºážá¡ááŒá
ẠID ááᯠááŒááºáá«á terraform ááẠáááºáá±á¬ááºááŸá¯áá±ážáá°ááᯠáááºááœááºáááºá áá±áá¬ááᯠáááºáá¶ááŒá®áž tfstate ááá¯ááºáá
áºáᯠááŒá¯áá¯ááºáááºá
á€áá±áá¬ááœáẠááŒá¿áᬠá áá¯ááŸááááºá
1. áá»áœááºá¯ááºááá¯á·ááẠtfstate ááá¯ááºáá
áºáá¯áᬠáááŸáááŒá®áž tf ááẠááá¬ááŒá
áºáá±áááºá áááºážááᯠááá¯ááºááá¯ááºáá±ážááẠááá¯á·ááá¯áẠtfstate á០ááŒá±á¬ááºážááẠááá¯á¡ááºáá«áááºá
2. áá
áºááŒáááºáá»áŸáẠá¡áááºážá¡ááŒá
áºáá
áºáá¯ááŒáá·áºáᬠá¡áá¯ááºáá¯ááºááá¯ááºááŒá®áž á¡áááºážá¡ááŒá
áºá¡á¬ážáá¯á¶ážááᯠááá¶á·ááá¯ážáá«á áá¯á¶áž 250+ áá²á· áá¬ááŒááºáá¯ááºáááá²á
3. á¡áááºážá¡ááŒá
áºáá»á¬ážá ID ááᯠááááẠááá¯á¡ááºááẠ- ááá¯ááá¯áááºááŸá¬ á¡áááºážá¡ááŒá
áºáá»á¬ážá
á¬áááºážááᯠáááŸáááá·áº áá¯ááºááŒáá·áº áá¯ááºááá¯ážáá¬ážááẠááá¯á¡ááºáá«áááºá
áá±áá¯áá»á¡á¬ážááŒáá·áº ááááºááẠáá
áºá
áááºáá
áºááá¯ááºážááŒá
áºááŒá®áž áá±á¬ááºážááœááºá
áœá¬ á¡ááá¯ááºážá¡áá¬áááŸááá«á
áá«á·áá¯á¶ážááŒááºáá»ááº
ááá¯á¡ááºáá»ááºáá»á¬ážááá¯:
1. á¡áááºážá¡ááŒá
áºáá»á¬ážá¡ááœáẠtf ááŸáá·áº tfstate ááá¯ááºáá»á¬ážááᯠáááºáá®ážááá¯ááºááŸá¯á á¥ááá¬á¡á¬ážááŒáá·áºá buckets/security group/load balancer á¡á¬ážáá¯á¶ážááᯠáá±á«ááºážáá¯ááºáá¯ááºááŒá®áž á¡ááŒá±á¬ááºážá¡áá²áááŸááá±á¬ 'terraform plan' ááᯠááŒááºáá±ážáááº
2. GCP + AWS cloud 2 áᯠááá¯á¡ááºáá«áááºá
3. á¡áá»áááºááá¯ááºáž á¡ááºááááºáá¯ááºááẠááœááºáá°áá±á¬ ááá¹áá¬áá¯á¶ážááá¯ááºáᬠááŒá±ááŸááºážáá»ááºááẠá¡áá¯áẠ3 áááºá¡ááœáẠá¡áááºážá¡ááŒá
áºáá
áºáá¯á
á®ááœáẠá¡áá»áááºááŒá¯ááºážááá±áá«á
4. Open Source áá¯ááºáá« - áá°ááá¯ááºážááœáẠáá°áá®áá±á¬ááŒá¿áá¬ááŸááááºá
Go language á áá¬ááá¯á·ááŒáá¯ááºáá²ááá¯áá±á¬á· terraform ááŸá¬áá¯á¶ážáá²á· HCL ááá¯ááºááœá±áááºáá®ážááá¯á·á¡ááœáẠlibrary áá áºáᯠ+ á¡áá¯á¶ážáááºááá¯ááºáá²á· terraform áá²ááŸá¬ code ááœá±á¡áá»á¬ážááŒá®ážáá«áá«áááºá
áááºážááŒá±á¬ááºáž
ááááá¯á¶ážááŒáá¯ážá
á¬ážááŸá¯
ááá¯ážááá¯ážáá¬ážááŸááºážáá²á· á
áááºáá²á·áááºá ááá¯á¡ááºáá±á¬á¡áááºážá¡ááŒá
áºá¡ááœáẠSDK ááŸáá
áºááá·áº cloud ááá¯áááºááœááºááŒá®áž áááºážááᯠterraform á¡ááœáẠáááºáááºáá»á¬ážá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²ááŒááºážá áá¯á¶ááŒá¯á¶áá±ážá¡ááœá²á·ááᯠááŒá±á¬ááºážáá²ááẠ1.5 ááẠ(ááŸáá·áº á¡áááºážá¡ááŒá
áºáá»á¬ážá
áœá¬ááŸááá«áááº) ááᯠáá»áœááºá¯ááºáááŒáá¯ááºáá±á¬ááŒá±á¬áá·áº áá¯á¶ááŒá¯á¶áá±ážá¡ááœá²á·ááœáẠáá»ááºááŒááºážáá±áá¯á¶ážááœá¬ážáá«áááºá á¡áá»áááºá¡áá±á¬áºááŒá¬ááŒá®ážáá±á¬áẠá¡ááœááºáá»á¬ážááᯠááŒá±á¬ááºáž/ááá·áºááá¯ááºáááºá
áá¯áááááŒáá¯ážá
á¬ážááŸá¯
á¡áá°á¡áááᯠá¡ááŒá±áá¶á áá±á¬áºááŒáá¬ážáá«áááºá
á¡áᯠtfstate á០tf á¡ááœáẠconverter áá±ážáá²á· recursive áá
áºáááºážáá¯ááºáá¯á¶á
á¬áá±ááᯠáá¯ááºááŒáá·áºáá¡á±á¬ááºá tfstate ááᯠááááºáá°ážáá°áá»á¬ážá¡ááœáẠJSON ááŒá
áºáá«áááºá ááá¯á·áá±á¬áº á¡áá°ážááŒá
áºáááºá
á€ááœáẠáááºážá á¡áá±ážááŒá®ážáá±á¬ á¡á
áááºá¡ááá¯ááºáž áá¯ááºáá±á¬áºáá»á¬áž ááŒá
áºáá«áááºá
"attributes": {
"id": "default/backend-logging-load-deployment",
"metadata.#": "1",
"metadata.0.annotations.%": "0",
"metadata.0.generate_name": "",
"metadata.0.generation": "24",
"metadata.0.labels.%": "1",
"metadata.0.labels.app": "backend-logging",
"metadata.0.name": "backend-logging-load-deployment",
"metadata.0.namespace": "default",
"metadata.0.resource_version": "109317427",
"metadata.0.self_link": "/apis/apps/v1/namespaces/default/deployments/backend-logging-load-deployment",
"metadata.0.uid": "300ecda1-4138-11e9-9d5d-42010a8400b5",
"spec.#": "1",
"spec.0.min_ready_seconds": "0",
"spec.0.paused": "false",
"spec.0.progress_deadline_seconds": "600",
"spec.0.replicas": "1",
"spec.0.revision_history_limit": "10",
"spec.0.selector.#": "1",
ááŸááááº:
1. id - string
2. áááºáá¬áá±áᬠ- á¡ááœááºá¡á
á¬áž 1 á array áá
áºáá¯ááŒá
áºááŒá®áž áááºážááœáẠá¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ á¡ááœááºáá»á¬ážáá«ááŸááá±á¬ á¡áá¬áá
áºáá¯
3. spec - hash of size 1 and key, value in it
á¡ááá¯áá»á¯ááºááŒá±á¬ááá»áŸáẠáá»á±á¬áºá
áá¬áá¯á¶á
á¶áá
áºáá¯á á¡áá¬á¡á¬ážáá¯á¶ážááẠá¡ááá·áºáá»á¬ážá
áœá¬ áááºáá²ááá¯ááºáááºá
"spec.#": "1",
"spec.0.min_ready_seconds": "0",
"spec.0.paused": "false",
"spec.0.progress_deadline_seconds": "600",
"spec.0.replicas": "1",
"spec.0.revision_history_limit": "10",
"spec.0.selector.#": "1",
"spec.0.selector.0.match_expressions.#": "0",
"spec.0.selector.0.match_labels.%": "1",
"spec.0.selector.0.match_labels.app": "backend-logging-load",
"spec.0.strategy.#": "0",
"spec.0.template.#": "1",
"spec.0.template.0.metadata.#": "1",
"spec.0.template.0.metadata.0.annotations.%": "0",
"spec.0.template.0.metadata.0.generate_name": "",
"spec.0.template.0.metadata.0.generation": "0",
"spec.0.template.0.metadata.0.labels.%": "1",
"spec.0.template.0.metadata.0.labels.app": "backend-logging-load",
"spec.0.template.0.metadata.0.name": "",
"spec.0.template.0.metadata.0.namespace": "",
"spec.0.template.0.metadata.0.resource_version": "",
"spec.0.template.0.metadata.0.self_link": "",
"spec.0.template.0.metadata.0.uid": "",
"spec.0.template.0.spec.#": "1",
"spec.0.template.0.spec.0.active_deadline_seconds": "0",
"spec.0.template.0.spec.0.container.#": "1",
"spec.0.template.0.spec.0.container.0.args.#": "3",
áá±áá°áá»á¡á¬ážááŒáá·áº á¡ááºáá¬áá»á°ážáá
áºáá¯á¡ááœáẠáááá¯ááááºážáááºážááŒá¿áá¬ááᯠááá¯áá»ááºáá«áá á€áá¯ááºáááºážá¡ááœáẠparser áá
áºáá¯áá±ážááẠáá°ááá¯á·ááá¯áᬠáá±á¬ááºážááá¯áá«á
bug ááá«áá² parser áá
áºáá¯ááá¯áá±ážááẠá¡ááŒáááºááŒáááºááŒáá¯ážá
á¬ážááŒá®ážáá±á¬ááºá áááºážáá¡á
áááºá¡ááá¯ááºážááᯠterraform code ááŸáá·áº á¡áá±ážááŒá®ážáá¯á¶ážá¡ááá¯ááºážááœáẠááœá±á·ááŸááá²á·áááºá ááŒá®ážáá±á¬á· á¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±ááœá¬ážáá¯á¶áá²á
áá¯á¶ážáá¯ááŒáá¯ážá
á¬ážáá«á
terraform áááºáá±á¬ááºááŸá¯áá±ážáá°áá»á¬ážááẠcloud API ááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœáẠá¡áááºážá¡ááŒá
áºáá»á¬ážááŸáá·áº áá¯áá¹áááá±áá¡á¬ážáá¯á¶ážáá«ááŸááá±á¬ áá¯ááºáá»á¬ážáá«ááŸááá±á¬ binaries áá»á¬ážááŒá
áºáááºá cloud áá
áºáá¯á
á®ááœáẠáááºážáááá¯ááºááá¯ááºáá¶á·ááá¯ážáá±ážáá°ááŸáááŒá®áž terraform ááá¯ááºááá¯ááºá áááºážááá¯á·ááᯠáá¯ááºáááºážá
ááºááŸá
áºáá¯ááŒá¬ážááŸá RPC protocol ááŸáááá·áºáá¬áá±á«áºááá¯áá«áááºá
ááᯠáá»áœááºá¯ááºááẠRPC áá±á«áºááá¯ááŸá¯áá»á¬ážááŸáá
áºááá·áº terraform áááºáá±á¬ááºááŸá¯áá±ážáá°áá»á¬ážááᯠááá¯ááºááá¯ááºáááºááœááºááẠáá¯á¶ážááŒááºáá²á·áááºá áááºážááẠááŸáá
áœá¬ ááœááºáá±á«áºáá¬ááŒá®áž terraform áááºáá±á¬ááºááŸá¯áá±ážáá°áá»á¬ážááᯠá¡áá
áºáá»á¬ážá¡ááŒá
ẠááŒá±á¬ááºážáá²áᬠáá¯ááºáááŒá±á¬ááºážáá² á¡ááºá¹áá«áááºá¡áá
áºáá»á¬ážááᯠáááŸáá
á±ááá¯ááºáááºá tfstate ááŸá áááºáááºá¡á¬ážáá¯á¶ážááẠtf ááœááºááá¯ááºááá·áºáá²á áááºááá¯á·ááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºáááºáááºážá ááá·áºáááºáá±á¬ááºááŸá¯áá±ážáá°ááᯠá€á¡ááŒá±á¬ááºážáá±ážáá«á ááá¯á·áá±á¬áẠáá¯á¶ááŸááºá¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážá
á¯á
ááºážááŒááºážá áá±á¬ááºáááºáááºááá²áá²áá
áºáááºážáá¯ááºáá¯á¶á
á¬áá±ááᯠá
áááºáá²á·ááŒá®áž á¡ááá·áºááá¯ááºážááœáẠtfstate á¡ááœááºážááŸá ááœááºáááºáá»á¬ážááᯠáááºááŸáá¯ááºážá
áœá¬ááŸá¬ááœá±áá²á·áááºá
á¡áá¯á¶ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠterraform áá¶á·ááá¯ážáá±ážáá°á¡á¬ážáá¯á¶ážá¡ááœáẠáá¯á¶á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá
áºáá¯áá«ááŸááá±á¬ á¡áá¯á¶ážáááºáá±á¬ CLI áááááá¬áá
áºáá¯ááá²á·ááŒá®áž á¡áá
áºáá
áºáá¯ááᯠá¡ááœááºááá°ááá·áºááá¯ááºáááºá ááá¯á·á¡ááŒááºá á¡áááºážá¡ááŒá
áºáá»á¬ážááá·áºááŒááºážááẠáá¯ááºá¡áááºážáááºáá°áááºá ááá¯á·á¡ááŒáẠá¡áááºážá¡ááŒá
áºáá»á¬ážááŒá¬áž áá»áááºáááºááŸá¯áá²á·ááá¯á·áá±á¬ áá±á¬ááºážáá»áá¯ážá¡áá»áá¯ážáá»áá¯ážá áá¯ááºáá«áááºá á¡á¬ážáá¯á¶ážááᯠáá±á¬áºááŒááá¯á·ááááá¯ááºáá²á· ááá°áá®áá²á·ááŒá¿áá¬ááœá± á¡áá»á¬ážááŒá®ážááŸááá²á·áá«áááºá
ááááá
á¹áá¬áẠTerrafomer ááá¯á· áá¬áááºáá±ážááá¯ááºáááºá
áá¬áá»áááá»áž
Terrafomer ááᯠá¡áá¯á¶ážááŒá¯á cloud ááŸá áºáá¯á០tf + tfstate áá¯áẠááá¯ááºážáá±á«ááºáž 500-700 ááᯠáá¯ááºáá¯ááºáá²á·áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááœá±á¡ááŸá áºá¡áá¬áá»á¬ážááᯠáá°ááá¯ááºááŒá®áž á¡áá±á¬ááºážáá¯á¶ážáá±á¬ á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá»á¬ážááœáẠáá¯ááºá¡ááŒá¶áá¬ááºáá»á¬ážáá²á·ááá¯á· terraform ááŒáá·áºáᬠáááºážááá¯á·ááᯠá áááºááááœá±á·ááá¯ááºáá²á·áááºá ááŒá®ážáá¬ážáá±á¬ cloud áá áºáá¯ááᯠáá°á terraform worker files áá¯á¶á á¶ááŒáá·áº á¡ááœá²á·áá áºááœá²á·á០áááºáá¶ááá·áºá¡áá« áááºážááᯠááŸá±á¬áºáááºáá«áááºá ááŒá®ážááẠgrep/replace/git á áááŒáá·áºáá±á«á·á
ááŒá®ážááŒá®áž á
ááºážáá¬ážáááºá ááœáá·áºááŒá¯áá»ááºááá²á·áááºá ááŒá¬áááá±ážáá±á· (02.05.19/XNUMX/XNUMX)ááœáẠáá°ááá¯ááºážá¡ááœáẠGitHub ááœáẠáá¯ááºáá±áá²á·áááºá
ááŒáẠ600 ááᯠáááºáá¶áááŸááá¬ážááŒá®ážá openstack ááŸáá·áº kubernetes á¡ááœáẠáá¶á·ááá¯ážááŸá¯áá±á«ááºážááá·áºááẠáá±á¬ááºážááá¯áá»áẠ2 áá¯á áá±á¬ááºážáá±á¬áá¯á¶á·ááŒááºáá»ááºá áá±áá¯áá»á¡á¬ážááŒáá·áº ááá±á¬áá»ááºááẠáá°áá»á¬ážá¡ááœáẠá¡áá¯á¶ážáááºáááºá
Terraform ááŸáá·áº á
áááºáá¯ááºááá¯ááºááá¯áá°ááá¯ááºážááᯠáááºážá¡ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠááŒááºáááºááá±ážáá«ááẠáá»áœááºá¯áẠá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá
áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá ááá
á¹á
áááºáá»á¬ážá ááŒááºáá»á¬ážááá¯ááœá²áá¯ááºáááºáááºážááŒá±á¬ááºáááá·áºáááºá
Demo
source: www.habr.com