LoadingтАж

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдСрдирд▓рд╛рдЗрди HCL / рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдлреЙрд░реНрдореЗрдЯрд░

рдЯреЗрд░рд╛рдлреЙрд░реНрдо, рдкреИрдХрд░ рдФрд░ рдЕрдиреНрдп рд╣рд╛рд╢реАрдХреЙрд░реНрдк рдЯреВрд▓ рд╕рднреА HCL2 рдмреЛрд▓рддреЗ рд╣реИрдВтАФрдФрд░ рд╡реЗ рд╕рднреА рдмреЗрд╣рддрд░ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬрдм рд▓рдЧрд╛рддрд╛рд░ рдлреЙрд░реНрдореЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ HCL рдлреЙрд░реНрдореЗрдЯрд░ рдЖрдкрдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмреИрдХрдПрдВрдб рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ рдЬреЛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди, рд╕реНрдкреЗрд╕рд┐рдВрдЧ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдкрд░ terraform fmtтАУрд╕реНрдЯрд╛рдЗрд▓ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдХреЛ рдЕрдЫреВрддрд╛ рдЫреЛрдбрд╝рддреЗ рд╣реБрдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд HCL2 рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

  • рдЯреЗрд░рд╛рдлреЙрд░реНрдо-рд╕реНрдЯрд╛рдЗрд▓ рдмреНрд▓реЙрдХреНрд╕, рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯреНрд╕, рд▓рд┐рд╕реНрдЯреНрд╕/рдореИрдкреНрд╕ рдФрд░ рд╣реЗрд░реЗрдбреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП HCL2-рдЕрд╡реЗрдпрд░ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ
  • =, рдХреЙрдорд╛, рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд▓реЙрдХреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕реБрд╕рдВрдЧрдд рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдФрд░ рд╕реНрдкреЗрд╕рд┐рдВрдЧ
  • рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • .tf, .hcl, HCL-рдЖрдзрд╛рд░рд┐рдд .tfvars рдФрд░ рдкреИрдХрд░ .pkr.hcl рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  • рдЖрдЗрдбреЗрдореНрдкреЛрдЯреЗрдВрдЯ рдЖрдЙрдЯрдкреБрдЯ: рдлреЙрд░реНрдореЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдкрд░ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ
  • рдиреНрдпреВрдирддрдо рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░: рдПрдХ рдПрдХрд▓ "рдлреЙрд░реНрдореЗрдЯ" рдХреНрд░рд┐рдпрд╛, рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдЯрд╛рдЗрд▓ рдиреЙрдмреНрд╕ рдирд╣реАрдВ
  • рдПрдбрд┐рдЯрд░ рд╕реЗ рдлреЙрд░реНрдореЗрдЯреЗрдб рдкрд░рд┐рдгрд╛рдо рдХреА рд╡рди-рдХреНрд▓рд┐рдХ рдХреЙрдкреА рдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб
  • рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░-рдмреИрдХреНрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ тАФ рддреНрд╡рд░рд┐рдд рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд┐рдпрд╛; рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп CLI рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ

ЁЯФз HCL рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ for hcl-formatter

1

1. рдЕрдкрдирд╛ рдХреЛрдб рдкреЗрд╕реНрдЯ рдпрд╛ рдбреНрд░реЙрдк рдХрд░реЗрдВ

рдЕрдкрдиреА HCL/Terraform рдлрд╝рд╛рдЗрд▓ (.tf, HCL-рдЖрдзрд╛рд░рд┐рдд .tfvars, .hcl, .pkr.hcl, рдЖрджрд┐) рдЦреЛрд▓реЗрдВ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ, рдпрд╛ рдпрджрд┐ рдЖрдкрдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рддреЛ рдлрд╝рд╛рдЗрд▓ рдбреНрд░реЙрдк рдХрд░реЗрдВред

2

2. "рдлреЙрд░реНрдореЗрдЯ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдлреЙрд░реНрдореЗрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЖрдкрдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмреИрдХрдПрдВрдб рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди, рд╕реНрдкреЗрд╕рд┐рдВрдЧ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП terraform fmt-рд╢реИрд▓реА рдХреЗ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдлреЙрд░реНрдореЗрдЯреЗрдб HCL2 рд▓реМрдЯрд╛рддрд╛ рд╣реИред

3

3. рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдХреЙрдкреА рдХрд░реЗрдВ рдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдЕрдкрдиреЗ IDE рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ рдпрд╛ рдлреЙрд░реНрдореЗрдЯреЗрдб рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрдорд┐рдЯ рдХрд░реЗрдВред

рддрдХрдиреАрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдПрдБ

рдирд┐рд╖реНрдкрд╛рджрди рдореЙрдбрд▓

рдлреЙрд░реНрдореЗрдЯрд░ рд╕рд░реНрд╡рд░-рд╕рдорд░реНрдерд┐рдд рд╣реИ рдФрд░ HCL2 рдХреЗ рд▓рд┐рдП terraform fmt-рд╢реИрд▓реА рд▓реЗрдЖрдЙрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓реВрд╡рд┐рд╡рд░рдг
рдореЛрдбрд╕рд░реНрд╡рд░-рд╕рдорд░реНрдерд┐рдд (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ WASM рдирд╣реАрдВ)
рджрд╛рдпрд░рд╛рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕, рдЗрдВрдбреЗрдВрдЯреЗрд╢рди, рд╕реНрдкреЗрд╕рд┐рдВрдЧ, рдмреБрдирд┐рдпрд╛рджреА рд▓реЗрдЖрдЙрдЯ
рдкреБрдирдГрдХреНрд░рдордгрд╕рдВрд╕рд╛рдзрдиреЛрдВ рдпрд╛ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдХреЛрдИ рд╢рдмреНрджрд╛рд░реНрде рдкреБрдирдГрдХреНрд░рдордг рдирд╣реАрдВ
рд╡рд┐рдХрд▓реНрдкрдХреЛрдИ рдирд╣реАрдВ тАФ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдлреЙрд░реНрдореЗрдЯ рдХреНрд░рд┐рдпрд╛
рд╕реАрдорд╛рдПрдБрд▓рдЧрднрдЧ 1тАУ2 MB рдЗрдирдкреБрдЯ, ~25s рд╕рд░реНрд╡рд░ рдЯрд╛рдЗрдордЖрдЙрдЯ (рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдЕрдзреАрди)
рдкреНрд░рддрд┐рдзрд╛рд░рдгрдХреНрд╖рдгрд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг тАФ рдЗрдирдкреБрдЯ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдХрд┐рд╕реА рднреА рдСрдирд▓рд╛рдЗрди рдЯреВрд▓ рдХреА рддрд░рд╣, рдЙрддреНрдкрд╛рджрди рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ terraform fmt рдпрд╛ packer fmt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рднрд╛рд╖рд╛ рдХрд╡рд░реЗрдЬ

Terraform рдФрд░ рдЕрдиреНрдп HashiCorp рдЯреВрд▓реНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп HCL2 рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИред

рдирд┐рд░реНрдорд╛рдгрдЙрджрд╛рд╣рд░рдгрдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдмреНрд▓реЙрдХреНрд╕resource, variable, output, module, locals, job, taskрдиреЗрд╕реНрдЯреЗрдб рдмреНрд▓реЙрдХ рд╕рдВрд░рдЪрдирд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБname = "web", count = 2= рдХреЗ рдЖрд╕рдкрд╛рд╕ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реНрдкреЗрд╕рд┐рдВрдЧ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд
рд╕рдВрдЧреНрд░рд╣[1, 2, 3], { key = value }рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ/рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХрд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ
рд╣реЗрд░реЗрдбреЙрдХреНрд╕<<-EOF ... EOFрдорд╛рд░реНрдХрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд; рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ# рдФрд░ // рд╢реИрд▓реА рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБрдЗрд░рд╛рджрд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рдВрд░рдХреНрд╖рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ рд░рдЦреА рдЧрдИ

рдорд┐рдиреА рдкрд╣рд▓реЗ/рдмрд╛рдж

рдПрдХ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдФрд░ рд╕реНрдкреЗрд╕рд┐рдВрдЧ рд╕рдлрд╛рдИ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдгред

# рдкрд╣рд▓реЗ
resource "aws_s3_bucket" "b"{bucket="demo"
  tags={Name="demo"}}

# рдмрд╛рдж
resource "aws_s3_bucket" "b" {
  bucket = "demo"

  tags = {
    Name = "demo"
  }
}
рдХреЗрд╡рд▓ рд▓реЗрдЖрдЙрдЯ рдкрд░рд┐рд╡рд░реНрддрди: рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдФрд░ рд╕рдВрджрд░реНрдн рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВред

рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдФрд░ рдПрдЬ рдХреЗрд╕

рдпрджрд┐ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рд╡рд┐рдлрд▓ рд╣реЛрддреА рд╣реИ рдпрд╛ рддреНрд░реБрдЯрд┐ рджреЗрддреА рд╣реИ, рддреЛ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ HCL2 рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред

рд▓рдХреНрд╖рдгрд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдгрдХреНрдпрд╛ рдЬрд╛рдБрдЪреЗрдВ
рдХреЛрдИ рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ / рдкрд╛рд░реНрд╕ рддреНрд░реБрдЯрд┐рдЕрдирдХреНрд▓реЛрдЬреНрдб рдмреНрд░реЗрд╕, рдмреНрд░реИрдХреЗрдЯ рдпрд╛ рдкреИрд░реЗрдиреНрдереЗрд╕рд┐рд╕рдорд┐рд▓рд╛рди { }, [ ], ( ) рдЬреЛрдбрд╝реЗ рдЧрд┐рдиреЗрдВ рдФрд░ рд╕рднреА рдмреНрд▓реЙрдХ рдмрдВрдж рдХрд░реЗрдВ
рд╣реЗрд░реЗрдбреЙрдХ рд╕рдорд╕реНрдпрд╛рдПрдБрдЧрд╛рдпрдм рдпрд╛ рдмреЗрдореЗрд▓ рдЯрд░реНрдорд┐рдиреЗрдЯрд░рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ EOF рдЬреИрд╕реЗ рдорд╛рд░реНрдХрд░ рдмрд┐рд▓реНрдХреБрд▓ рдФрд░ рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдВ
рдорд┐рд╢реНрд░рд┐рдд рд╢реИрд▓рд┐рдпрд╛рдБрдЯреИрдм/рд╕реНрдкреЗрд╕ рдпрд╛ рдЖрд╡рд╛рд░рд╛ рд╡рд░реНрдгрдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ, рдЖрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╡рд░реНрдг рд╣рдЯрд╛рдПрдБ
.tfvars рднреНрд░рдоJSON рдмрдирд╛рдо HCL рд╕рд┐рдВрдЯреИрдХреНрд╕*.tfvars.json рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП JSON рдлреЙрд░реНрдореЗрдЯрд░ рдпрд╛ terraform fmt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк

рджреИрдирд┐рдХ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрдЬрд╝ рдХреЛрдб рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдФрд░ CI рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕ рдСрдирд▓рд╛рдЗрди рдЯреВрд▓ рдХреЛ рддреНрд╡рд░рд┐рдд рдПрдб-рд╣реЙрдХ рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рд░рдЦреЗрдВред

macOS / Linux

Terraform: рдЬрдЧрд╣ рдореЗрдВ рдлреЙрд░реНрдореЗрдЯ рдХрд░реЗрдВ

terraform fmt

рд╡рд░реНрддрдорд╛рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ .tf рдФрд░ HCL-рдЖрдзрд╛рд░рд┐рдд .tfvars рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИред

Terraform: рдкреБрдирд░рд╛рд╡рд░реНрддреА CI рдЬрд╛рдБрдЪ (рдХреЛрдИ рд▓реЗрдЦрди рдирд╣реАрдВ)

terraform fmt -check -recursive

рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдиреЙрди-рдЬрд╝реАрд░реЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ тАФ CI рдФрд░ рдкреНрд░реА-рдХрдорд┐рдЯ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ред

Packer: рдЯреЗрдореНрдкрд▓реЗрдЯ рдлреЙрд░реНрдореЗрдЯ рдХрд░реЗрдВ

packer fmt path/to/template.pkr.hcl

рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрдХрд░ HCL рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬрдЧрд╣ рдореЗрдВ рдлреЙрд░реНрдореЗрдЯ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдВрдбреЛрдЬрд╝ (PowerShell)

рд╕рднреА Terraform рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдлреЙрд░реНрдореЗрдЯ рдХрд░реЗрдВ

Get-ChildItem -Recurse -Filter *.tf | ForEach-Object { terraform fmt $_.FullName }

рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдкрд╛рдИ рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ .tf рдлрд╝рд╛рдЗрд▓ рдкрд░ terraform fmt рдЪрд▓рд╛рддрд╛ рд╣реИред

CI-рд╢реИрд▓реА рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдЬрд╛рдВрдЪ

terraform fmt -check -recursive

рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдкреБрд░рд╛рдиреА рд╣реЛ рддреЛ рд╡рд┐рдлрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

GitHub Actions

рдпрджрд┐ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдмрд┐рд▓реНрдб рдХреЛ рд╡рд┐рдлрд▓ рдХрд░реЗрдВ

steps:
  - uses: hashicorp/setup-terraform@v3
  - run: terraform fmt -check -recursive

рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ Terraform рдлрд╝рд╛рдЗрд▓ рдареАрдХ рд╕реЗ рдлреЙрд░реНрдореЗрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдкреБрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ (рд╡реИрдХрд▓реНрдкрд┐рдХ)

steps:
  - run: terraform fmt -recursive
  - run: git diff --quiet || (git config user.name "bot" && git config user.email "bot@example" && git commit -am "chore: terraform fmt" && git push)

terraform fmt рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ-рдХреЗрд╡рд▓ рдХрдорд┐рдЯ рдХреЛ рдмреНрд░рд╛рдВрдЪ рдореЗрдВ рд╡рд╛рдкрд╕ рдкреБрд╢ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдирд┐рдпрдорд┐рдд рдпрд╛ рдЧреЛрдкрдиреАрдп рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп CLI рдЯреВрд▓реНрд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ рдФрд░ рдСрдирд▓рд╛рдЗрди рдлреЙрд░реНрдореЗрдЯрд░ рдХреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рдмрдЬрд╛рдп CI рдореЗрдВ `terraform fmt -check -recursive` рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

PR рд╕реНрд╡рдЪреНрдЫрддрд╛ рдФрд░ рд╕рдореАрдХреНрд╖рд╛рдПрдВ

рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдФрд░ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рдореАрдХреНрд╖рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВред

  • рдкреБрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдЦреЛрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдЪрд▓рд╛рдПрдВ
  • Terraform рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓ рд╕рдВрдмрдВрдзреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░реЗрдВ
  • git рдбрд┐рдлреНрд╕ рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рд╕рд╛рд░реНрдердХ рд░рдЦреЗрдВ

Terraform рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдХрд╛рд╕

рдЯреАрдореЛрдВ, рд░реЗрдкреЛ рдФрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпреЛрдВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реБрд╕рдВрдЧрдд рд░рдЦреЗрдВред

  • рд╕рд╛рдЭрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдмреНрд▓реЙрдХ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ рд╣реА рд╣рд╛рдЙрд╕ рд╕реНрдЯрд╛рдЗрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ

CI рдЧреЗрдЯрдХреАрдкрд┐рдВрдЧ

рд╕рдордп рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рдЗрд▓ рдбреНрд░рд┐рдлреНрдЯ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП CI рдореЗрдВ terraform fmt рдЬрд╛рдВрдЪреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

  • `terraform fmt -check -recursive` рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
  • рд╕рднреА .tf рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдлреЙрд░реНрдореЗрдЯ рд╣реЛрдиреЗ рддрдХ рдорд░реНрдЬ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ

рдСрдирдмреЛрд░реНрдбрд┐рдВрдЧ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг

рдкрдардиреАрдп рдЙрджрд╛рд╣рд░рдг рдирдП рдЯреАрдо рд╕рджрд╕реНрдпреЛрдВ рдХреЛ Terraform рдФрд░ рд╣рд╛рдЙрд╕ рд╕реНрдЯрд╛рдЗрд▓ рджреЛрдиреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реАрдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред

  • README рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдлреЙрд░реНрдореЗрдЯ рдХрд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ
  • рдЖрдВрддрд░рд┐рдХ Terraform рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рддреНрд░реЛрдВ рдореЗрдВ рд╕рд╛рдл рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

тЭУ Frequently Asked Questions

ЁЯФТрдХреНрдпрд╛ рдореЗрд░рд╛ рдХреЛрдб рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рд╣реЛрддрд╛ рд╣реИ?

рдирд╣реАрдВред рдпрд╣ HCL рдлреЙрд░реНрдореЗрдЯрд░ рд╕рд░реНрд╡рд░-рд╕рдорд░реНрдерд┐рдд рд╣реИ: рдЖрдкрдХрд╛ рдЗрдирдкреБрдЯ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореА HCL рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдпрд╛ рд╡рд┐рдирд┐рдпрдорд┐рдд рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ `terraform fmt` (рдпрд╛ `packer fmt`) рдЪрд▓рд╛рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВред

ЁЯЫбя╕ПрдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдВ рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╣рдо рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдСрдирд▓рд╛рдЗрди рдЯреВрд▓ рдореЗрдВ рдкреНрд░реЛрдбрдХреНрд╢рди рд╕реАрдХреНрд░реЗрдЯреНрд╕ рдкреЗрд╕реНрдЯ рди рдХрд░реЗрдВред рднрд▓реЗ рд╣реА рд╕реЗрд╡рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдХреНрд╖рдгрд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓реЛрдВ, рд╕реАрдХреНрд░реЗрдЯ рд╕реНрдЯреЛрд░реНрд╕ рдпрд╛ CI рд╡реЙрд▓реНрдЯреНрд╕ рдореЗрдВ рд░рд╣рдиреА рдЪрд╛рд╣рд┐рдП тАФ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреВрд▓реНрд╕ рдореЗрдВ рдирд╣реАрдВред

ЁЯзйрдХреНрдпрд╛ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рддреА рд╣реИ?

рдирд╣реАрдВред рдлреЙрд░реНрдореЗрдЯрд░ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ: рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕, рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдФрд░ рд╕реНрдкреЗрд╕рд┐рдВрдЧред рд░рд┐рд╕реЛрд░реНрд╕ рдмреНрд▓реЙрдХреНрд╕, рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯреНрд╕, рдПрдХреНрд╕рдкреНрд░реЗрд╢рдиреНрд╕ рдФрд░ рд░реЗрдлрд░реЗрдиреНрд╕реЗрд╕ рд╡рд╣реА рд░рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдореВрд▓ HCL рд╡реИрдз рдерд╛ред

ЁЯУДрдХреНрдпрд╛ рдореИрдВ .tfvars рдлрд╝рд╛рдЗрд▓реЗрдВ рдлреЙрд░реНрдореЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╣рд╛рдВ, рдЬрдм рддрдХ .tfvars рдлрд╝рд╛рдЗрд▓ HCL рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред Terraform `.tfvars.json` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ JSON-рдЖрдзрд╛рд░рд┐рдд рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ; рд╡реЗ JSON рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ JSON рдлреЙрд░реНрдореЗрдЯрд░ рдпрд╛ `terraform fmt` рджреНрд╡рд╛рд░рд╛ рдмреЗрд╣рддрд░ рд╕рдВрднрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред

тЪЩя╕Прдпрд╣ `terraform fmt` рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ?

`terraform fmt` Terraform рдХреЗ рд╕рд╛рде рд╢рд┐рдк рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдХреИрдиреЛрдирд┐рдХрд▓ рдлреЙрд░реНрдореЗрдЯрд░ рд╣реИ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдФрд░ CI рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИред рдпрд╣ рд╡реЗрдм рдЯреВрд▓ рддреНрд╡рд░рд┐рдд, рдПрдб-рд╣реЙрдХ рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ CLI рд╣рд╛рде рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

ЁЯзпрдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рд╡рд┐рдлрд▓ рдХреНрдпреЛрдВ рд╣реБрдИ?

рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдлрд▓рддрд╛рдПрдВ рдкрд╛рд░реНрд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ: рдЕрдирдХреНрд▓реЛрдЬреНрдб рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдпрд╛ рдмреНрд░реИрдХреЗрдЯреНрд╕, рдЦрд░рд╛рдм рд╣реЗрд░реЗрдбреЙрдХреНрд╕, рдпрд╛ JSON-рд╕реНрдЯрд╛рдЗрд▓ tfvars рдХреЛ HCL рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдирд╛ред рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (рдпрд╛ рд╕рд╣реА рдбрд╛рдпрд▓реЗрдХреНрдЯ/рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

Pro Tips

CI Tip

рдмрдбрд╝реЗ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАрдЬ рдореЗрдВ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдбреНрд░рд┐рдлреНрдЯ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП CI рдореЗрдВ `terraform fmt -check -recursive` рд▓рд╛рдЧреВ рдХрд░реЗрдВред

Best Practice

рдСрдирд▓рд╛рдЗрди рдЯреВрд▓реНрд╕ рдореЗрдВ рд╕реАрдХреНрд░реЗрдЯреНрд╕ рдпрд╛ рд╕реНрдЯреЗрдЯ-рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ; рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реИрдирд┐рдЯрд╛рдЗрдЬреНрдб рд░рдЦреЗрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп CLI рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдЪрд▓рд╛рдПрдВред

Best Practice

рдЕрдкрдиреЗ рдПрдбрд┐рдЯрд░ рдореЗрдВ рдЯреНрд░реЗрд▓рд┐рдВрдЧ рдиреНрдпреВрд▓рд╛рдЗрдиреНрд╕ рдФрд░ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ рддрд╛рдХрд┐ Terraform рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдореНрд╕ рдореЗрдВ рд╕рд╛рдл, рд╕реНрдерд┐рд░ рдбрд┐рдлреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

Best Practice

рдПрдХ рдкреНрд░реА-рдХрдорд┐рдЯ рд╣реБрдХ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ `terraform fmt` рдЪрд▓рд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреБрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлреЙрд░реНрдореЗрдЯреЗрдб рдЖрдПрдВ рдФрд░ рд░рд┐рд╡реНрдпреВ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдЬреЛрдЦрд┐рдо рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд░рд╣ рд╕рдХреЗрдВред

Additional Resources

Other Tools