Terraform fandrika

Terraform fandrika
Andeha hanasongadina fandrika vitsivitsy, ao anatin'izany ireo mifandray amin'ny tadivavarana, raha ny fanambarana sy ny teknika fametrahana, ary koa ireo olana ankapobeny izay misy fiantraikany amin'ny Terraform amin'ny ankapobeny:

  • manana fetra ny isa sy ny_parametera tsirairay;
  • mametra ny fametrahana aotra midina;
  • na dia ny drafitra tsara aza dia mety hahomby;
  • refactoring dia mety manana ny fandrika;
  • ny cohérence nahemotra dia mifanaraka... amin'ny fanemorana.

Misy fetra ny isa sy ny_isaky ny masontsivana

Ny ohatra ato amin'ity toko ity dia mampiasa be dia be ny isa isa sy ny for_each expression amin'ny tadivavarana sy ny lojika misy fepetra. Manatanteraka tsara izy ireo, saingy manana fetra lehibe roa tokony ho fantatrao.

  • Ny isa sy ny_isaky ny tsirairay dia tsy afaka manondro ireo fari-pahalalana mivoaka avy amin'ny loharanon-karena.
  • count sy for_each dia tsy azo ampiasaina amin'ny fanamafisana module.

count sy for_each dia tsy afaka manondro fari-pamokarana loharanon-karena

Alaivo sary an-tsaina hoe mila manaparitaka mpizara EC2 maromaro ianao ary noho ny antony tsy tianao ny hampiasa ASG. Mety ho toy izao ny kaodinao:

resource "aws_instance" "example_1" {
   count             = 3
   ami                = "ami-0c55b159cbfafe1f0"
   instance_type = "t2.micro"
}

Andeha hojerentsika tsirairay izy ireo.

Koa satria napetraka amin'ny sanda static ny mari-pamantarana isa, dia hiasa tsy misy olana ity kaody ity: rehefa mihazakazaka ny baiko fampiharana ianao dia hamorona mpizara EC2 telo. Ahoana anefa raha te hametraka mpizara iray isaky ny Faritra Availability (AZ) ao amin'ny faritra AWS misy anao ianao? Azonao atao ny mametraka ny kaodinao lisitry ny faritra avy amin'ny loharano angon-drakitra aws_availability_zones ary avy eo dia mamakivaky ny tsirairay ary mamorona mpizara EC2 ao anatin'izany amin'ny alàlan'ny fanisam-bahoaka sy ny fidirana amin'ny index array:

resource "aws_instance" "example_2" {
   count                   = length(data.aws_availability_zones.all.names)
   availability_zone   = data.aws_availability_zones.all.names[count.index]
   ami                     = "ami-0c55b159cbfafe1f0"
   instance_type       = "t2.micro"
}

data "aws_availability_zones" "all" {}

Hiasa tsara ihany koa ity kaody ity, satria ny mari-pamantarana isa dia afaka manondro loharanom-baovao tsy misy olana. Inona anefa no mitranga raha miankina amin'ny vokatra azo avy amin'ny loharanon-karena sasany ny isan'ny lohamilina mila mamorona? Mba hampisehoana izany, ny fomba tsotra indrindra dia ny fampiasana ny loharano random_integer, izay, araka ny soso-kevitry ny anarana, dia mamerina integer kisendrasendra:

resource "random_integer" "num_instances" {
  min = 1
  max = 3
}

Ity kaody ity dia miteraka isa kisendrasendra eo anelanelan'ny 1 sy 3. Andeha hojerentsika izay mitranga raha manandrana mampiasa ny vokatra avy amin'ity loharano ity amin'ny mari-pamantarana fanisana ny loharano aws_instance isika:

resource "aws_instance" "example_3" {
   count             = random_integer.num_instances.result
   ami                = "ami-0c55b159cbfafe1f0"
   instance_type = "t2.micro"
}

Raha mampiasa drafitra terraform amin'ity kaody ity ianao dia hahazo ity hadisoana manaraka ity:

Error: Invalid count argument

   on main.tf line 30, in resource "aws_instance" "example_3":
   30: count = random_integer.num_instances.result

The "count" value depends on resource attributes that cannot be determined until apply, so Terraform cannot predict how many instances will be created. To work around this, use the -target argument to first apply only the resources that the count depends on.

Ny Terraform dia mitaky ny isa sy ny_isaky ny kajy mandritra ny dingana fandrindrana, alohan'ny hamoronana loharanon-karena rehetra. Midika izany fa ny count sy for_each dia afaka manondro litera, miovaova, loharano angon-drakitra, ary na lisitry ny loharano aza (raha mbola azo faritana ny halavany amin'ny fotoanan'ny fandaharam-potoana), fa tsy amin'ny fari-pamokarana loharanon-karena kajy.

count sy for_each dia tsy azo ampiasaina amin'ny fanamafisana module

Indray andro any dia mety halaim-panahy ianao hampiditra mari-pamantarana isa amin'ny fandrindrana mody anao:

module "count_example" {
     source = "../../../../modules/services/webserver-cluster"

     count = 3

     cluster_name = "terraform-up-and-running-example"
     server_port = 8080
     instance_type = "t2.micro"
}

Ity kaody ity dia manandrana mampiasa isa ao anaty maody iray mba hamoronana dika telo amin'ny loharanon-tranonkala-tranonkala. Na azonao atao ny manao ny fampifandraisana môdôly tsy voatery mifototra amin'ny fepetra Boolean sasany amin'ny fametrahana ny mari-pamantarana fanisana azy ho 0. Mety ho toy ny kaody mitombina izany, saingy ho azonao ity hadisoana ity rehefa manao drafitra terraform:

Error: Reserved argument name in module block

   on main.tf line 13, in module "count_example":
   13: count = 3

The name "count" is reserved for use in a future version of Terraform.

Indrisy anefa, amin'ny Terraform 0.12.6, ny fampiasana count na for_each ao amin'ny loharano module dia tsy tohanana. Araka ny naoty famoahana Terraform 0.12 (http://bit.ly/3257bv4), HashiCorp dia mikasa ny hanampy izany fahaiza-manao izany amin'ny ho avy, ka miankina amin'ny fotoana mamaky ity boky ity dia mety efa misy izany. Mba ho fantatra marina, vakio eto ny Terraform changelog.

Famerana ny Fametrahana Aotra Miato

Ny fampiasana ny bloc create_before_destroy miaraka amin'ny ASG dia vahaolana tsara amin'ny famoronana fametrahana aotra amin'ny fotoana tsy ampoizina, afa-tsy ny fampitandremana iray: tsy tohanana ny fitsipika autoscaling. Na ny marimarina kokoa, izany dia mamerina ny haben'ny ASG ho min_size isaky ny fametrahana, izay mety ho olana raha mampiasa fitsipika autoscaling ianao mba hampitomboana ny isan'ny mpizara mandeha.

Ohatra, ny module webserver-cluster dia misy loharano aws_autoscaling_schedule, izay amin'ny 9 maraina dia mampitombo ny isan'ny mpizara ao amin'ny cluster ho roa ka hatramin'ny folo. Raha toa ianao ka mametraka amin'ny, ohatra, amin'ny 11 maraina, ny ASG vaovao dia hanomboka amin'ny mpizara roa fotsiny fa tsy folo ary hijanona ho toy izany hatramin'ny 9 maraina ny ampitso.

Ity famerana ity dia azo adika amin'ny fomba maro.

  • Ovay ny mari-pamantarana miverimberina ao amin'ny aws_autoscaling_schedule manomboka amin'ny 0 9 * * * ("mihazakazaka amin'ny 9 ora maraina") ho toy ny 0-59 9-17 * * * (" mihazakazaka isaky ny minitra manomboka amin'ny 9 ora maraina ka hatramin'ny 5 ora hariva"). Raha efa manana mpizara folo ny ASG dia tsy hanova na inona na inona ny fampandehanana an'io fitsipika autoscaling io, izay no tadiavintsika. Fa raha vao haingana no niparitaka ny ASG, io fitsipika io dia hiantoka fa ao anatin'ny iray minitra farafahatarany dia hahatratra folo ny isan'ny mpizara azy. Tsy fomba kanto tanteraka izany, ary mety hiteraka olana ho an'ny mpampiasa ihany koa ny fitsambikinana lehibe avy amin'ny mpizara folo ka hatramin'ny roa.
  • Mamorona script manokana izay mampiasa ny AWS API hamaritana ny isan'ny mpizara mavitrika ao amin'ny ASG, antsoy izany amin'ny fampiasana loharano angona ivelany (jereo ny "Loharano angona ivelany" ao amin'ny pejy 249), ary apetraho amin'ny sanda naverin'ny ASG ny script. Amin'izany fomba izany, ny instance ASG vaovao tsirairay dia hihazakazaka amin'ny fahafaha-manao mitovy amin'ny code Terraform efa misy ary manasarotra ny fitazonana azy.

Mazava ho azy fa ny Terraform dia mety manana fanohanana naorina ho an'ny fametrahana tsy misy fiatoana, saingy tamin'ny Mey 2019, ny ekipa HashiCorp dia tsy nanana fikasana hampiditra io fampiasa io (antsipiriany - eto).

Ny drafitra marina dia mety tsy mahomby

Indraindray ny baikon'ny drafitra dia mamokatra drafitra fametrahana marina tsara, fa ny baiko fampiharana dia mamerina hadisoana. Andramo, ohatra, ampio ny loharano aws_iam_user miaraka amin'ny anarana mitovy amin'ny nampiasanao ny mpampiasa IAM noforoninao teo aloha tao amin'ny Toko 2:

resource "aws_iam_user" "existing_user" {
   # Подставьте сюда имя уже существующего пользователя IAM,
   # чтобы попрактиковаться в использовании команды terraform import
   name = "yevgeniy.brikman"
}

Ankehitriny, raha mitantana ny baikon'ny drafitra ianao, Terraform dia hamoaka drafitra fametrahana toa mitombina:

Terraform will perform the following actions:

   # aws_iam_user.existing_user will be created
   + resource "aws_iam_user" "existing_user" {
         + arn                  = (known after apply)
         + force_destroy   = false
         + id                    = (known after apply)
         + name               = "yevgeniy.brikman"
         + path                 = "/"
         + unique_id         = (known after apply)
      }

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

Raha mihazakazaka ny baiko fampiharana ianao dia hahazo ity hadisoana manaraka ity:

Error: Error creating IAM User yevgeniy.brikman: EntityAlreadyExists:
User with name yevgeniy.brikman already exists.

   on main.tf line 10, in resource "aws_iam_user" "existing_user":
   10: resource "aws_iam_user" "existing_user" {

Ny olana, mazava ho azy, dia efa misy mpampiasa IAM manana io anarana io. Ary mety hitranga izany tsy amin'ny mpampiasa IAM ihany, fa amin'ny loharano rehetra. Mety hisy olona namorona ity loharano ity amin'ny tanana na mampiasa ny baikon'ny baiko, saingy na izany na tsy izany, miteraka fifandirana ny ID mifanandrify. Betsaka ny fiovaovana amin'ity hadisoana ity izay matetika manaitra ireo vao tonga ao amin'ny Terraform.

Ny hevi-dehibe dia ny baikon'ny drafitra terraform dia tsy mandray afa-tsy ireo loharano voalaza ao amin'ny rakitra fanjakana Terraform. Raha noforonina amin'ny fomba hafa ny loharanon-karena (ohatra, amin'ny alàlan'ny fanindriana ny console AWS), dia tsy hiafara amin'ny rakitra fanjakana izy ireo ary noho izany dia tsy horaisin'i Terraform rehefa manatanteraka ny baikon'ny drafitra. Vokatr'izany, ny drafitra izay toa marina raha vao jerena dia tsy hahomby.

Misy lesona roa azo tsoahina avy amin’izany.

  • Raha efa nanomboka niasa tamin'ny Terraform ianao dia aza mampiasa zavatra hafa. Raha mitantana ny ampahany amin'ny fotodrafitrasanao amin'ny Terraform dia tsy azonao ovaina amin'ny tanana intsony izany. Raha tsy izany, tsy vitan'ny hoe mampidi-doza ny fahadisoana Terraform hafahafa ianao, fa mandà ihany koa ny tombontsoa maro amin'ny IaC satria ny kaody dia tsy ho fanehoana marina amin'ny fotodrafitrasanao intsony.
  • Raha efa manana fotodrafitrasa sasantsasany ianao dia ampiasao ny baiko fanafarana. Raha manomboka mampiasa Terraform miaraka amin'ny fotodrafitrasa efa misy ianao dia azonao ampidirina amin'ny rakitra fanjakana izany amin'ny alàlan'ny baiko import terraform. Amin'izany fomba izany no hahafantaran'ny Terraform izay fotodrafitrasa tokony hokarakaraina. Ny baiko fanafarana dia maka hevitra roa. Ny voalohany dia ny adiresin'ny loharano ao amin'ny fisie-nao. Ny syntax eto dia mitovy amin'ny rohy loharano: _. (toy ny aws_iam_user.existing_user). Ny tohan-kevitra faharoa dia ny ID ny loharano hohafarana. Andeha hatao hoe ny resource ID aws_iam_user dia ny anaran'ny mpampiasa (ohatra, yevgeniy.brikman), ary ny resource ID aws_instance dia ny EC2 server ID (toy ny i-190e22e5). Ny fomba fanafarana loharano dia matetika aseho ao amin'ny antontan-taratasy eo amin'ny farany ambany amin'ny pejiny.

    Ity ambany ity ny baiko fanafarana izay mampifanaraka ny loharanon'ny aws_iam_user izay nampidirinao tamin'ny fikirakirana Terraform anao miaraka amin'ny mpampiasa IAM ao amin'ny Toko 2 (manoloana ny anaranao ho yevgeniy.brikman, mazava ho azy):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    Ny Terraform dia hiantso ny AWS API hahitanao ny mpampiasa IAM anao ary hamorona fikambanan'ny fisie fanjakana eo aminy sy ny loharano aws_iam_user.existing_user ao amin'ny fikirakiranao Terraform. Manomboka izao, rehefa mihazakazaka ny baikon'ny drafitra ianao, dia ho fantatry ny Terraform fa efa misy ny mpampiasa IAM ary tsy hanandrana hamorona azy intsony.

    Tsara ny manamarika fa raha efa manana loharanon-karena maro tianao hampidirina ao amin'ny Terraform ianao, dia mety ho manahirana ny fanoratana an-tànana ny kaody ary ny fanafarana tsirairay tsirairay avy. Noho izany dia ilaina ny mijery fitaovana toy ny Terraforming (http://terraforming.dtan4.net/), izay afaka manafatra kaody sy fanjakana ho azy avy amin'ny kaontinao AWS.

    Ny refactoring dia mety manana ny fandrika

    Refactoring dia fanao mahazatra amin'ny fandaharana izay hanovanao ny rafitra anatiny amin'ny kaody raha mamela ny fihetsika ivelany tsy miova. Izany dia mba hahatonga ny kaody ho mazava kokoa, milamina kokoa ary mora kokoa ny mitazona azy. Refactoring dia teknika tena ilaina izay tokony hampiasaina tsy tapaka. Saingy raha ny momba ny Terraform na ny fitaovana IaC hafa, dia mila mitandrina tsara ianao amin'ny tianao holazaina amin'ny "fitondran-tena ivelany" amin'ny fehezan-dalàna iray, raha tsy izany dia hisy olana tsy ampoizina.

    Ohatra, ny karazana refactoring mahazatra dia manolo ny anaran'ny variables na asa amin'ny anarana azo takarina kokoa. IDE maro no manana fanohanana naorina ho an'ny refactoring ary afaka manova anarana ho azy ireo fari-pitsipika sy fiasa mandritra ny tetikasa. Amin'ny fiteny fandaharana amin'ny tanjona ankapobeny, fomba fanao tsy misy dikany izay mety tsy hoeritreretinao izany, fa ao amin'ny Terraform dia mila mitandrina tsara ianao amin'izany, raha tsy izany dia mety hitera-doza ianao.

    Ohatra, ny module webserver-cluster dia manana cluster_name variable input:

    variable "cluster_name" {
       description = "The name to use for all the cluster resources"
       type          = string
    }

    Alaivo sary an-tsaina hoe nanomboka nampiasa ity môdely ity ianao mba hametrahana microservice antsoina hoe foo. Taty aoriana dia te hanova ny anaranao ho bar ianao. Mety ho toa tsy misy dikany izany fiovana izany, saingy raha ny tena izy dia mety hiteraka fanelingelenana ny serivisy.

    Ny zava-misy dia ny module webserver-cluster dia mampiasa ny cluster_name variable amin'ny loharano maromaro, anisan'izany ny anaran'ny vondrona fiarovana roa sy ny ALB:

    resource "aws_lb" "example" {
       name                    = var.cluster_name
       load_balancer_type = "application"
       subnets = data.aws_subnet_ids.default.ids
       security_groups      = [aws_security_group.alb.id]
    }

    Raha ovainao ny mari-pamantarana anarana amin'ny loharano iray, dia hofafan'ny Terraform ny dikan-teny taloha amin'io loharano io ary hamorona iray vaovao hisolo azy. Fa raha ALB io loharano io, eo anelanelan'ny famafana azy sy ny fampidinana dikan-teny vaovao, dia tsy hanana rafitra hamerenana ny fifamoivoizana mankany amin'ny mpizara tranonkalanao ianao. Toy izany koa, raha voafafa ny vondrona fiarovana iray, dia hanomboka handà ny fifamoivoizana amin'ny tambajotra ny lohamilinao mandra-pamorona vondrona vaovao.

    Karazana refactoring hafa mety hahaliana anao dia ny fanovana ny ID Terraform. Andao horaisina ho ohatra ny loharano aws_security_group ao amin'ny module webserver-cluster:

    resource "aws_security_group" "instance" {
      # (...)
    }

    Ny famantarana an'io loharano io dia antsoina hoe ohatra. Alao sary an-tsaina fa nandritra ny refactoring dia nanapa-kevitra ny hanova izany ho azo takarina kokoa ianao (araka ny hevitrao) anarana cluster_instance:

    resource "aws_security_group" "cluster_instance" {
       # (...)
    }

    Inona no hitranga amin'ny farany? Marina izany: fanakorontanana.

    Ampifandraisin'i Terraform amin'ny ID mpamatsy rahona ny ID loharano tsirairay. Ohatra, iam_user dia mifandray amin'ny AWS IAM mpampiasa ID, ary aws_instance dia mifandray amin'ny AWS EC2 mpizara ID. Raha manova ny ID loharano ianao (milaza ohatra amin'ny cluster_instance, toy ny amin'ny aws_security_group), amin'ny Terraform dia ho toy ny hoe nofafanao ny loharano taloha ary nanampy vaovao. Raha mampihatra ireo fanovana ireo ianao, dia hamafa ny vondrona fiarovana taloha ny Terraform ary hamorona iray vaovao, raha toa ka manomboka mandà ny fifamoivoizana amin'ny tambajotra ny mpizara anao.

    Ireto misy lesona efatra lehibe tokony horaisinao amin'ity fifanakalozan-kevitra ity.

    • Ampiasao foana ny baiko plan. Izy io dia afaka manambara ireo snag rehetra ireo. Avereno jerena tsara ny vokatra azony ary tandremo ny toe-javatra misy ny Terraform mikasa hamafa loharano izay azo inoana fa tsy tokony hofafana.
    • Mamorona alohan'ny hamafanao. Raha te hanolo loharano ianao dia eritrereto tsara raha mila mamorona fanoloana ianao alohan'ny hamafa ny tany am-boalohany. Raha eny ny valiny dia afaka manampy ny create_before_destroy. Ny vokatra mitovy amin'izany dia azo atao amin'ny tanana amin'ny fanaovana dingana roa: voalohany, ampio loharano vaovao amin'ny fandrindrana ary tanteraho ny baiko fampiharana, ary esory ny loharano taloha amin'ny fanamafisana ary ampiasao indray ny baiko fampiharana.
    • Mitaky fanovana fanjakana ny fanovana famantarana. Raha te hanova ny ID mifandray amin'ny loharano iray ianao (ohatra, ovao ny aws_security_group avy amin'ny ohatra ho cluster_instance) nefa tsy mamafa ilay loharano ary mamorona dikan-teny vaovao, dia tsy maintsy manavao ny rakitra fanjakana Terraform ianao. Aza manao izany amin'ny tanana mihitsy - ampiasao ny baiko fanjakana terraform. Rehefa manonona anarana anarana ianao dia tokony hampandeha ny baiko mv terraform state, izay manana ity syntax manaraka ity:
      terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>

      ORIGINAL_REFERENCE dia fitenenana manondro ny loharano amin'ny endriny ankehitriny, ary NEW_REFERENCE no toerana tianao hamindra azy. Ohatra, rehefa manonona anarana ny vondrona aws_security_group avy amin'ny ohatra ho cluster_instance dia mila manatanteraka ity baiko manaraka ity ianao:

      $ terraform state mv 
         aws_security_group.instance 
         aws_security_group.cluster_instance

      Izany dia milaza amin'ny Terraform fa ny fanjakana izay nifandray taloha tamin'ny aws_security_group.instance dia tokony hifandray amin'ny aws_security_group.cluster_instance. Raha toa ka tsy misy fiovana ny fanovana anarana sy ny fampandehanana ity baiko terraform plan ity, dia nataonao tsara ny zava-drehetra.

    • Tsy azo ovaina ny toe-javatra sasany. Tsy azo ovaina ny mason'ny loharano maro. Raha manandrana manova azy ireo ianao, dia hamafa ny loharano taloha i Terraform ary hamorona vaovao hisolo azy. Ny pejy loharano tsirairay dia matetika manondro ny zava-mitranga rehefa manova toe-javatra manokana ianao, koa aoka ho azo antoka ny manamarina ny antontan-taratasy. Ampiasao foana ny baikon'ny drafitra ary diniho ny fampiasana ny paikady create_before_destroy.

    Mifanaraka amin'ny fanemorana ny tsy fitoviana nahemotra

    Ny API sasany mpanome rahona, toy ny AWS, dia tsy mifanandrify ary nanemotra ny tsy fitoviana. Ny asynchrony dia midika fa afaka mamerina valiny avy hatrany ny interface nefa tsy miandry ny hetsika nangatahana ho vita. Ny tsy fitovian'ny fahatarana dia midika fa ny fiovana dia mety haka fotoana hiparitaka manerana ny rafitra; Raha mbola mitranga izany dia mety tsy mifanaraka ny valinteninao ary miankina amin'ny replika loharano angona mamaly ny antsonao API.

    Alaivo sary an-tsaina, ohatra, fa manao antso API amin'ny AWS ianao mangataka azy hamorona mpizara EC2. Ny API dia hamerina valiny "tafita" (201 Noforonina) saika eo no ho eo, tsy miandry ny lohamilina mihitsy no noforonina. Raha miezaka mifandray aminy avy hatrany ianao dia azo antoka fa tsy hahomby izany satria amin'io fotoana io dia mbola manomboka loharanon-karena ny AWS na, raha tsy izany, mbola tsy boot ny mpizara. Ankoatra izany, raha manao antso hafa ianao mba hahazoana vaovao momba ity mpizara ity, dia mety hahazo hadisoana ianao (404 Not Found). Ny zava-misy dia ny fampahalalana momba an'io mpizara EC2 io dia mety mbola hiparitaka manerana ny AWS alohan'ny hahatongavany eny rehetra eny, tsy maintsy miandry segondra vitsy ianao.

    Isaky ny mampiasa API asynchronous miaraka amin'ny tsy fitoviana malaina ianao, dia tsy maintsy averinao tsindraindray ny fangatahanao mandra-pahavitan'ny hetsika sy miparitaka manerana ny rafitra. Indrisy anefa, ny AWS SDK dia tsy manome fitaovana tsara ho an'izany, ary ny tetikasa Terraform dia nijaly be dia be toy ny 6813 (https://github.com/hashicorp/terraform/issues/6813):

    $ terraform apply
    aws_subnet.private-persistence.2: InvalidSubnetID.NotFound:
    The subnet ID 'subnet-xxxxxxx' does not exist

    Raha lazaina amin'ny teny hafa dia mamorona loharano ianao (toy ny subnet) ary avy eo manandrana maka vaovao momba izany (toy ny ID ny subnet vao noforonina), ary tsy hitan'i Terraform izany. Ny ankamaroan'ireo bibikely ireo (anisan'izany ny 6813) dia raikitra, saingy mbola mipoitra tsindraindray izy ireo, indrindra rehefa manampy karazana loharano vaovao ny Terraform. Mahasosotra izany, saingy amin'ny ankamaroan'ny tranga dia tsy miteraka fahavoazana. Rehefa mampiasa terraform indray ianao dia tokony hiasa ny zava-drehetra, satria amin'izao fotoana izao dia efa miparitaka manerana ny rafitra ny fampahalalana.

    Ity ampahany ity dia naseho avy amin'ny boky nosoratan'i Evgeniy Brikman "Terraform: fotodrafitrasa eo amin'ny ambaratonga kaody".

Source: www.habr.com

Add a comment