하루를 보낼 지형 지식

'Getting through the day'시리즈의 일부로서 본고는 기본적인 지형 지식을 제공할 것이다.GitHub에서 재구매를 관리할 수 있는 Terraform 프로젝트를 만듭니다.
AWS, Azure, Google 클라우드 계정이 있다고 가정하고 싶지 않지만, GitHub 계정이 더 현실적인 것 같습니다.
이 글은 네가 installed Terraform on your system이라고 가정해 봐.

CLI


Terraform이 설치되어 있으므로 터미널에서 terraform을 실행할 수 있습니다.이 자습서의 경우 다음 버전을 실행하겠습니다.
❯ terraform version
Terraform v0.14.10

공급자


Terraform Providers은 타사 공급업체와 통합할 수 있는 확장 팩과 유사합니다.registry을 보고 프로젝트에 필요한 공급자를 선택할 수 있습니다.네가 예상한 바와 같이 모든 주요 클라우드 공급업체가 거기에 있다.
본 강좌에서 우리는 GitHub provider을 사용할 것이다.
지형 코드를 추가하기 시작할 수 있도록 폴더를 계속 만듭니다.
mkdir tf-github-admin
이 폴더에 provider.tf이라는 파일을 만들고 GitHub 제공 프로그램을 정의합니다.다음을 포함하는 파일을 만듭니다.
provider "github" {
  token = var.github_token
  owner = var.github_org
}
여기서 provider 키워드의 값은 github입니다.이 자원 블록에서, 우리는 두 개의 표지부 (왼쪽) 를 정의했는데, 그것들의 값은 두 변수 (오른쪽) 에서 나온다.잠시 후 variables에 대한 더 많은 정보를 제공할 것입니다.
지금 terraform init을 실행하면 Terraform에서 필요한 공급자 코드를 다운로드하고 다음 출력을 표시합니다.
❯ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/github...
- Installing hashicorp/github v4.6.0...
- Installed hashicorp/github v4.6.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

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.lock.hcl 파일을 제출하는 건의에 따라 주십시오.
이제 다음 파일과 폴더가 있어야 합니다.
ls -1a
.
..
.terraform
.terraform.lock.hcl
provider.tf
현재 terraform plan의 출력에서 말한 대로 init을 실행하면 변화가 없는 응답을 볼 수 있습니다.인프라가 최신이다.
변수를 정의하기 시작합시다.

변량


변수 블록을 사용하면 코드에 사용할 변수를 정의할 수 있습니다.다음 구성을 사용하여 vars.tf 파일을 만듭니다.
variable "github_token" {
  type        = string
  description = "The access token to GitHub"
}

variable "github_org" {
  type        = string
  description = "The GitHub organisation"
  default     = "benmatselby" # You should change this to your username!
}

variable "github_repos" {
  type        = map
  description = "All our repos we want to manage using Terraform"
  default = {
    tfgithubadmin = {
      "name" : "tf-github-admin",
      "description" : "The Terraform configuration to manage GitHub repos",
      "topics" : ["terraform", "automation"],
      "archived": false
    },
  }
}
위의 구성에는 세 가지 변수가 정의되어 있습니다.
  • github_token - GitHub에 가입할 수 있는 권한을 부여받은 Personal Access Token (PAT)입니다.
  • github_org - 환매 협의의 소유자로 조직(예를 들어 github)일 수도 있고 사용자(예를 들어 benmatselby)일 수도 있다.GitHub 계정으로 변경되었는지 확인하십시오.
  • github_repos - 이것은 약간 복잡한 변수이다.이것은 일종의 매핑 변수 유형이다.그것은 우리가 관리하고자 하는 모든 환매 협의의 설정을 가지고 있다.
  • type, descriptiondefault 속성을 정의하고 있습니다.이러한 속성은 정의할 필요가 없으며 빈 블록으로 변수를 정의할 수 있습니다.그러나 description 필드에 변수를 명확하게 설명해 보십시오. 이것은 미래에 도움이 될 것입니다.
    이제 GitHub repo를 관리하는 데 필요한 변수가 생겼습니다. GitHub repo를 관리하는 자원 블록을 정의하기 시작합니다.

    자원 블록


    본 강좌의 목적은 Terraform을 통해 GitHub 리콜을 관리하고 위에서 정의한 github_repos 변수 제어 설정을 통해따라서 github_repos 변수를 교체하고 GitHub와 통신할 수 있는 자원 블록을 정의해야 합니다.repos.tf이라는 파일을 만들고 다음을 포함합니다.
    resource "github_repository" "repos" {
      for_each = var.github_repos
    
      name        = each.value["name"]
      description = each.value["description"]
    
      archived = each.value["archived"]
    
      // Settings
      visibility           = "private"
      has_downloads        = true
      has_issues           = true
      has_wiki             = true
      vulnerability_alerts = true
    
      // Merge settings
      allow_merge_commit     = true
      allow_squash_merge     = false
      allow_rebase_merge     = false
      delete_branch_on_merge = true
    
      // Topics
      topics = each.value["topics"]
    }
    
    우리 이 자원 블록을 좀 분해합시다.
    resource "github_repository" "repos" {
    
    }
    
    이것은 resource 유형의 github_repository을 정의했고 명칭은 repos이다.
  • resource은 언어 구조의 일종이다.
  • github_repository 모델은 github 공급업체 wedefined earlier에서 나왔습니다.
  • 마지막으로, repos은 우리가 자원에 지어준 이름입니다.우리는 코드 라이브러리의 다른 곳에서 이 이름을 인용할 수 있다.
  • 다음은 제어문에 대해 논의해야 합니다.
      for_each = var.github_repos
    
      name        = each.value["name"]
    
    나는 왜 그런지 모르겠지만, 내가 처음으로 Terraform을 사용하기 시작했을 때, 나는 이 점을 하기가 매우 어려웠다.괄호가 없어서 그런가?첫 번째 줄은 github_repos에서 정의한 vars.tf 변수를 사용하는 순환을 만드는 것입니다.
    그리고 name 표지부의 값이 each.value["name"]이라는 것을 볼 수 있다.우리의 변수를 바탕으로 순환의 첫 번째 교체는name가 tf-github-admin과 같다.
    리소스 블록에 정의된 기타 식별자는 github Provider에서 제공합니다.만약 VS 코드를 사용한다면, 일부 코드가 기능을 완성하도록 HashiCorp Terraform 플러그인을 설치하는 것을 권장합니다.사실상 Terraform Language Server을 처리하는 모든 편집기는 같은 기능을 제공할 것이다.내가 보기에 코드를 완성하면 이런 것들을 배우는 것이 훨씬 쉬워질 것이다.
    현재 우리는 주요 구성 요소를 정의했으니, 이것을 실행해 봅시다.

    이 일을 관리하다


    여기에는 planapply의 두 가지 명령이 있다.

    계획

    plan 명령은 apply을 사용할 때 Terraform이 무엇을 할 계획인지 설명합니다.이제 코드가 있는 폴더에서 terraform plan을 실행하겠습니다.
    ❯ terraform plan
    var.github_token
      The access token to GitHub
    
      Enter a value: your-pat
    
    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:
    
      # github_repository.repos["tfgithubadmin"] will be created
      + resource "github_repository" "repos" {
          + allow_merge_commit     = true
          + allow_rebase_merge     = false
          + allow_squash_merge     = false
          + archived               = false
          + default_branch         = (known after apply)
          + delete_branch_on_merge = true
          + description            = "The Terraform configuration to manage GitHub repos"
          + etag                   = (known after apply)
          + full_name              = (known after apply)
          + git_clone_url          = (known after apply)
          + has_downloads          = true
          + has_issues             = true
          + has_wiki               = true
          + html_url               = (known after apply)
          + http_clone_url         = (known after apply)
          + id                     = (known after apply)
          + name                   = "tf-github-admin"
          + node_id                = (known after apply)
          + private                = (known after apply)
          + repo_id                = (known after apply)
          + ssh_clone_url          = (known after apply)
          + svn_url                = (known after apply)
          + topics                 = [
              + "automation",
              + "terraform",
            ]
          + visibility             = "private"
          + vulnerability_alerts   = true
        }
    
    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.
    
    여기서 세 가지를 소개하고 싶습니다.
  • var.github_token - 우리는 vars.tf에서 github_token이라는 변수를 정의했는데 이 변수는 기본값이 없다.따라서 terraform plan 명령은 값이 얼마인지 묻습니다.다행히도, 우리는 터미널에서 이 기능을 실행하고 있기 때문에, 우리는 값을 제공할 수 있다.자동화 서버에서 이것을 실행하고 싶다면 terraform plan --var github_token=your-token을 실행할 수 있습니다.이렇게 하면 일시정지가 중지되고 입력이 기다려집니다.
  • 프로그램 - apply을 실행할 때 발생하는 "차이점"을 확인할 수 있습니다.우리의 출력에서 당신은 모든 내용이 +이라는 것을 볼 수 있습니다. 왜냐하면 우리는 처음으로 환매 협의를 창설했기 때문입니다.
  • 주석 - 출력의 밑부분에서 보증 행동에 대해 이야기하고 있는 것을 볼 수 있다.계획을 만들어 파일에 저장하고 나중에 실행할 수 있습니다.
  • 더 많은 옵션은 terraform plan --help을 실행하여 무엇을 할 수 있는지 확인하십시오.

    신청하다.


    기본적으로 apply 명령은 하나의 계획을 출력하기 때문에 매번 terraform plan을 실행할 필요가 없습니다.
    다음 명령을 실행합니다.
    ❯ terraform apply
    var.github_token
      The access token to GitHub
    
      Enter a value: your-pat
    
    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:
    
      # github_repository.repos["tfgithubadmin"] will be created
      + resource "github_repository" "repos" {
          + allow_merge_commit     = true
          + allow_rebase_merge     = false
          + allow_squash_merge     = false
          + archived               = false
          + default_branch         = (known after apply)
          + delete_branch_on_merge = true
          + description            = "The Terraform configuration to manage GitHub repos"
          + etag                   = (known after apply)
          + full_name              = (known after apply)
          + git_clone_url          = (known after apply)
          + has_downloads          = true
          + has_issues             = true
          + has_wiki               = true
          + html_url               = (known after apply)
          + http_clone_url         = (known after apply)
          + id                     = (known after apply)
          + name                   = "tf-github-admin"
          + node_id                = (known after apply)
          + private                = (known after apply)
          + repo_id                = (known after apply)
          + ssh_clone_url          = (known after apply)
          + svn_url                = (known after apply)
          + topics                 = [
              + "automation",
              + "terraform",
            ]
          + visibility             = "private"
          + vulnerability_alerts   = true
        }
    
    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를 입력하고 enter 키를 누르십시오.
    만약 영패가 유효하고 우리가 모든 내용을 정확하게 정의했다면 우리는 다음과 같은 출력을 받아야 한다.
    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
    
    github_repository.repos["tfgithubadmin"]: Creating...
    github_repository.repos["tfgithubadmin"]: Creation complete after 9s [id=tf-github-admin]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    
    GitHub 계정을 찾으면 tf-github-admin이라는 새로운 환매 프로토콜을 볼 수 있을 것입니다.

    잘했어. Terraform을 사용하여 GitHub 환매 프로토콜을 만들었어.
    더 많은 옵션은 terraform apply --help을 실행하여 무엇을 할 수 있는지 확인하십시오.

    구성 업데이트


    이제 어떤 파일이 있는지 살펴보겠습니다.
    ❯ la -1a
    .
    ..
    .terraform
    .terraform.lock.hcl
    provider.tf
    repos.tf
    terraform.tfstate
    vars.tf
    
    지금 보시면 terraform.tfstate 파일이 있습니다.이 글은 주에 깊이 들어가는 것이 너무 많기 때문에 official documentation을 읽으세요.본문에서 우리가 사용하는 것은'지방정부'라는 것을 주의해 주십시오.State는 우리가 만든 자원에 대한 모든 정보를 저장합니다.이 경우 상태 파일은 컴퓨터에 저장됩니다.이 상태 파일을 잃어버리면 재구매를 관리하기 위해 상태를 다시 가져와야 합니다.본고의 목적에서 이 파일을 버전 제어 시스템에 제출할 수 있습니다.
    그럼에도 불구하고 우리가 지금 이 환매협정을 보관할 수 있는지 살펴보자. 그러면 행동상의 변화를 볼 수 있을 것이다.vars.tf 파일을 열고 "archived": false"archived": true으로 변경합니다.
    현재 terraform apply을 실행하고 있습니다.다음 계획을 보셔야 합니다.
    ❯ terraform apply
    var.github_token
      The access token to GitHub
    
      Enter a value: your-pat
    
    github_repository.repos["tfgithubadmin"]: Refreshing state... [id=tf-github-admin]
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
      ~ update in-place
    
    Terraform will perform the following actions:
    
      # github_repository.repos["tfgithubadmin"] will be updated in-place
      ~ resource "github_repository" "repos" {
          ~ archived               = false -> true
            id                     = "tf-github-admin"
            name                   = "tf-github-admin"
          ~ vulnerability_alerts   = false -> true
            # (24 unchanged attributes hidden)
        }
    
    Plan: 0 to add, 1 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 를 입력한 다음 enter 키를 누르십시오.
    그러면 재구매 계약이 아카이브되고 로컬 상태가 업데이트됩니다.

    재구매 계약 삭제


    이 강좌의 마지막 단계는 환매 협의를 삭제하는 것이다.vars.tf을 열고 github_repos 변수를 다음과 같이 업데이트합니다.
    variable "github_repos" {
      type        = map
      description = "All our repos we want to manage using Terraform"
      default = {}
    }
    
    이것은 기본적으로 Terraform에 환매 협의를 취소하라고 알려줄 것이다.
    현재 terraform apply을 실행하고 있습니다.알림이 나타나면 "예"라고 대답하고 enter 키를 누르면 변경 사항을 적용합니다.
    github_repository.repos["tfgithubadmin"]: Destroying... [id=tf-github-admin]
    github_repository.repos["tfgithubadmin"]: Destruction complete after 0s
    
    Apply complete! Resources: 0 added, 0 changed, 1 destroyed.
    
    좋습니다. Terraform에서 자원 관리의 전체 생명 주기: 창설, 업데이트, 삭제를 완료했습니다.

    하급


    만약 당신이 이것을 다음 단계로 끌어올리고 싶다면 당신은 다음과 같이 할 수 있습니다.
  • 이 기능은 선택한 CI/CD 툴에서 실행됩니다.
  • 이해해야 돼 Remote State.
  • GitHub 팀을 관리하는 경우 Terraform에서 팀을 정의할 수 있습니다.
  • GitHub에 분기 보호 기준이 있습니까?만약 그렇다면, 너는 중심 위치에서 그것을 정의할 수 있다.
  • 에피소드

  • 만약 당신이 맥 사용자라면 brew을 통해Terraform을 설치하는 것을 권장합니다.
  • 다양한 버전으로 쉽게 전환할 수 있는 기능이 필요한 경우 tfenv을 참조하십시오.
  • 대형 지형 프로젝트를 시작하면 Terragrunt을 보고 싶을 수도 있습니다.

  • This is a good link Terraform 파일에 대해 알고 싶으면 .gitignore 파일을 사용하십시오.
  • 본고에서 사용한 코드도 a gist이다.
  • 나는 이 문장이 너로 하여금 지형 프로젝트에서 일할 수 있도록 충분한 지식을 제공하기를 바란다.만약 이 점을 따랐다면, GitHub 환매 프로토콜을 관리할 수 있는 코드 라이브러리도 생겼을 것입니다.

    따로 만나다

  • Git commands to get you through the day
  • Docker knowledge to get you through the day
  • Shell commands to get you through the day
  • Terraform language overview
  • Terraform Functions, Expressions, Loops (Examples)

  • 사진 출처: Paweł Czerwiński, Unsplash에서 촬영
  • 좋은 웹페이지 즐겨찾기