Jamf Concepts

Guides

Terraform로 Jamf 구성 관리 소개

~8 min read

클릭스(Click-Ops)에 대한 기존 방식은 많은 조직에서 현대적 SaaS 앱과 엔터프라이즈 서비스를 처리하는 기존 방식이 되고 있습니다. 미래를 대비하고 설정을 체계화하려는 팀은 이러한 시스템을 관리하기 위해 GitOps 친화적 접근 방식을 찾기 시작했습니다.

좋은 이유가 있습니다.

코드형 인프라(IaC) 및 지속적 통합/지속적 배포(CI/CD) 소개

점점 더 많은 조직은 콘솔을 클릭하는 관리자에 의존하는 대신 코드 또는 구성 정의 파일을 통해 변경 사항을 구현하는 것을 선호합니다. CI/CD(또는 "GitOps") 접근 방식에서 원하는 상태는 일반적으로 YAML 파일 또는 다른 잘 정의된 형식으로 정의되며 파일은 Git 분기에 커밋됩니다. 끌어오기 요청은 테스트, 검토 및 승인 워크플로우를 시작하고 그 뒤에 Jamf Pro API를 통해 Jamf에서 변경 사항을 구현하는 분기로의 일련의 병합이 따릅니다. 이러한 기법은 또한 변경을 테스트하고 사용자 수용 단계를 거친 후에 프로덕션에 미칠 영향을 미치는 전체 플릿을 통해 무엇이든 일어나기 전에 전체 플릿의 영향을 미치는 변경 사항을 이동하는 데 사용할 수 있습니다.

구성을 코드로 정의하면 전문적 소프트웨어 개발과 동일한 방식의 잘 정의된 코드 검토, 승인 및 끌어오기 요청 워크플로우가 가능합니다. 이는 환경이 테스트 가능, 반복 가능 및 확장 가능해지면서 변경이 예상치 못한 문제를 야기하는 경우 이전 버전으로 롤백할 수 있는 경로를 제공한다는 의미입니다.

UI와 설명서를 통해 실패한 위치를 이해하기 위해 검색하지 않고도 빠르게 반복하고 빠르게 되돌릴 수 있습니다.

당사 팀은 2025년 Denver의 JNUC 2025에서 이 전체 접근 방식에 대해 이야기했습니다. 이 글쓰기에서 우리는 조금 더 나아가 이를 직접 파고들기 위한 명확한 활주로를 제공하기를 원합니다.

먼저, 우리가 Terraform을 선택한 이유는?

Terraform은 코드형 인프라 세계에서 매우 강력한 도구입니다. 원하는 API에 매핑하도록 만들어질 수 있습니다. 이 전체 접근 방식을 조사하기 시작했을 때 Jamf Pro용 Terraform 공급자를 이미 구축한 Deployment Theory와 연결했습니다. 당사 팀은 이 응용 프로그램을 이해하기 위해 그들과 함께 작업했으며 그 이후로 해당 프로젝트에 많은 기여를 했습니다. 또한 Apple Business 및 Apple School Manager용 자체 공급자를 구축했을 뿐만 아니라 Jamf Platform API용 새로운 공급자를 구축했습니다.

당사는 이러한 항목을 문서화했으며 향후 당사 개발자 사이트에서 이를 계속 업데이트할 것입니다: https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers

더 나아가기 전에 프로덕션 인스턴스에서 이를 테스트하지 마십시오. Terraform은 강력한 도구이므로 테스트 인스턴스를 활용하는 것을 권장합니다. 샌드박스 또는 테스트 인스턴스가 없으면 이 목적을 위해 Jamf 계정에서 베타 Jamf Pro 인스턴스를 획득할 수 있습니다.

이제 Terraform을 사용하여 Jamf Pro에서 리소스 구축을 시작할 준비가 되었습니다.

참고: 간단히 하기 위해 기본 인증을 사용하지만 나중에 OAuth를 사용하도록 전환할 수 있습니다.

Terraform 설치

간단히 하기 위해 Homebrew를 사용하여 Terraform을 설치합니다. Homebrew가 설치되어 있지 않으면 여기의 단계를 따르십시오.

터미널을 열고 다음 단계를 따릅니다:

먼저 HashiCorp 공식 디렉토리에 액세스합니다.

brew tap hashicorp/tap

다음으로 Terraform을 설치합니다.

brew install hashicorp/tap/terraform

마지막으로 모든 것이 제대로 작동하는지 유효성을 검사합니다. 이 명령을 실행하면 설치된 Terraform 버전이 표시되어야 합니다. 그렇지 않으면 위 단계를 다시 시도합니다.

terraform -version

물론 HashiCorp는 여기에서 참조 설치 단계를 문서화했습니다.

Visual Studio Code 설치

Terraform을 작성하기 위해 실제로 모든 텍스트 편집기 또는 통합 개발 환경(IDE)을 사용할 수 있습니다. 그러나 우리는 Visual Studio Code가 문법 강조를 위한 확장을 쉽게 사용할 수 있는 Terraform을 매우 잘 지원한다는 것을 발견했습니다. VS Code도 무료 도구이므로 이 테스트에 권장하기에 이상적입니다.

여기에서 VS Code를 다운로드하고 시스템에 설치를 진행할 수 있습니다.

VS Code를 설치한 후 왼쪽의 확장 탭을 클릭하거나 키보드에서 Shift + Command + X를 입력하고 "HashiCorp Terraform"을 검색할 수 있습니다. 이 확장을 설치하여 전체 Terraform 문법 강조를 받습니다.

Terraform 프로젝트 시작

Terraform 프로젝트 파일에는 시작하고 프로젝트 구축을 시작하는 데 필요한 많은 특정 항목이 포함됩니다. 대부분의 관련 파일은 .tf 또는 .tfvars 같은 파일 확장자로 끝납니다.

기능을 구성하는 많은 구성 요소가 있지만 나중에 이를 다룰 예정입니다.

여기서 시작하기는 좀 어려울 수 있습니다 - 실행하고 시작하기 위해 할 수 있는 많은 일이 있습니다. 그래서 우리는 이를 조금 더 쉽게 만들고 싶었습니다.

먼저 터미널을 열고 Terraform 프로젝트를 저장할 폴더를 만듭니다. 쉽게 액세스할 수 있도록 이 폴더를 사용자 수준에서 만듭니다.

mkdir jamf-terraform

그런 다음 터미널에서 새로 생성된 폴더로 디렉토리를 변경합니다.

cd ~/jamf-terraform

이제 기본 Terraform 모듈 저장소의 템플릿 분기를 복제합니다.

git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform

이를 수행한 후 Jamf Pro 및 Jamf Security Cloud용으로 완전히 기능하는 템플릿 Terraform 프로젝트를 갖게 됩니다.

변수 파일 추가

Git 저장소에 들어가고 싶지 않은 것은 로그인 자격 증명이나 클라이언트 보안입니다. 다행히 Terraform에는 이에 대한 경로가 있습니다.

선택한 텍스트 편집기를 열고 다음 텍스트를 복사합니다:

jamfpro_auth_method   = "basic" ## oauth2 또는 basic
jamfpro_instance_url  = "https://<tenant-name>.jamfcloud.com" 
jamfpro_username      = ""
jamfpro_password      = ""
jamfpro_client_id     = ""
jamfpro_client_secret = ""

## Jamf Protect 계정 세부 사항
jamfprotect_url             = "https://<tenant-name>.protect.jamfcloud.com"
jamfprotect_clientid        = ""
jamfprotect_client_password = ""

## (Jamf Pro) 일반 설정 노브 ##
include_categories = false

이 파일의 이름은 terraform.tfvars이고 새로 복제된 템플릿 저장소의 최상위 수준에 저장됩니다.

이제 새로 만든 terraform.tfvars 파일에 정보를 입력하기 시작할 수 있습니다. 간단하게 하기 위해 인증 방법을 basic으로 설정했지만 나중에 oauth2로 변경할 수 있다는 것을 알고 있습니다. 따라서 지금은 로컬 사용자 이름과 암호를 각각 jamfpro_usernamejamfpro_password 필드에 입력합니다. Jamf Protect 정보도 입력할 수 있습니다. Protect 테넌트에서 API 클라이언트를 만들기만 하면 됩니다.

또한 이 템플릿 저장소에 포함된 모듈 중 하나에 대한 노브를 포함했습니다. 이는 기본적으로 특정 모듈을 적용할지 선언할 수 있게 해주는 간단한 부울 변수입니다. 나중에 구축할 추가 모듈과 함께 이러한 종류의 접근 방식을 사용하도록 선택할 수도 있고 단순히 모든 부울 요구사항을 제거하고 매번 모든 것이 실행되도록 할 수 있습니다.

Terraform State 파일

아직 인스턴스에 실제 리소스를 커밋하지 않았으므로 지금이 Terraform의 state 파일이 무엇인지 이야기하기에 완벽한 시간입니다.

Terraform을 통해 리소스를 추가, 변경 또는 삭제할 때마다 해당 업데이트가 terraform.tfstate라는 파일에 저장되고 terraform.tfstate.backup이라는 파일에 백업됩니다.

이것이 Terraform이 인스턴스에서 수행한 작업을 기억하는 방법이며 향전 기능에 중요합니다. Terraform이 인스턴스에 대해 실행될 때마다 이 state 파일이 참조된 후 무엇이든 수행됩니다. 각 state 파일은 자신의 인스턴스와 연결되어야 하므로 기능성을 유지하고 스트림을 건너뛰는 것을 피하기 위해 이들을 분리된 상태로 유지하는 것이 중요합니다.

Terraform 실행

이제 좋은 위치에 있습니다 - Terraform이 설치되어 있고 템플릿 저장소가 있으며 변수 파일에 자격 증명이 정의되어 있습니다.

이제 템플릿 모듈을 테스트 또는 베타 Jamf Pro 인스턴스에 대해 실행할 준비가 되었습니다. 이렇게 하려면 터미널을 열고 다음 명령을 실행합니다.

terraform init -upgrade

이렇게 하면 Terraform이 초기화되고 이전에 이를 사용한 모든 사람을 위해 필요한 공급자를 최신 버전으로 업그레이드합니다. 또한 주제를 완전히 처음 사용하는 경우 필요한 Terraform 공급자의 초기 설치를 수행합니다.

terraform fmt -recursive

이렇게 하면 로컬 복제된 분기의 모든 Terraform 코드를 반복적으로 형식화하여 모든 것이 올바르게 보이고 제대로 작동할 수 있도록 합니다.

terraform plan

이렇게 하면 테스트 Jamf Pro 인스턴스, Terraform state 파일 및 Terraform 모듈 코드를 보아 인스턴스에서 적용하거나 제거할 변경 사항이나 새로운 것을 찾아 모듈을 완전히 실행할 때 어떤 일이 일어날지에 대한 전체 계획 또는 요약을 반환합니다.

terraform apply

이렇게 하면 먼저 계획을 실행하고 추가, 변경 또는 삭제될 내용을 다시 보고합니다. 그런 다음 이 작업을 확인하도록 요청합니다. 이 필드는 2개의 입력만 수락합니다: yes 또는 no.

terraform apply -parallelism=1

이렇게 하면 생성되는 모든 리소스가 순서대로 진행하고 한 번에 하나씩 진행하도록 강제합니다. 많은 SaaS 앱에는 잠재적 공격을 감지하기 위한 시스템이 있기 때문에 때로는 이것이 Terraform을 실행하는 가장 좋은 방법입니다.

terraform destroy -parallelism=1

이렇게 하면 Terraform의 state 파일에서 참조되는 생성된 리소스가 모두 파괴됩니다.

이후 계획, 적용 또는 제거 명령을 실행할 때마다 state 파일을 참조하고 추가, 변경 또는 삭제해야 할 사항을 평가한 다음 적절한 작업을 실행합니다.

이 특정 모듈 실행

템플릿 모듈을 실행하면 Apollo 미션 11-17 각각으로 명명된 Jamf Pro에서 7개의 범주를 만듭니다. 이는 간단한 테스트입니다.

이들이 추가되면 위의 명령을 사용하여 쉽게 파괴할 수 있습니다.

더 큰 목표는 Terraform의 구조를 보여 주어 환경에 대한 관련 모듈 구축을 시작할 수 있도록 하는 것이며, 이는 이 글쓰기의 다음 섹션을 일으킵니다.

Terraform의 해부학

여기의 기능성의 핵심은 .tf 파일의 계층 구조입니다. 루트 수준 main.tf는 자식 모듈 main.tf에 호출합니다. 이 모듈은 .tfvars 파일 및 variables.tf 파일을 참조합니다. 다음은 스레드의 전체 분석 및 순서입니다:

terraform apply를 실행할 때:

state 파일이 참조됩니다.

루트 main.tf가 요청되는 자식 모듈에 대해 평가됩니다.

루트 variables.tf가 적용되는 자식 모듈에 대한 관련 변수에 대해 스캔됩니다.

terraform.tfvars가 각 자식 모듈을 실행하기 위한 모든 관련 변수에 대해 스캔됩니다.

자식 모듈 main.tf 파일이 관련 로컬 자식 모듈 변수에 대해 자신의 로컬 variables.tf 파일을 참조하여 호출되고 실행됩니다.

그런 다음 각 리소스가 생성되고 참조가 terraform.tfstate에 저장됩니다.

Terraform이 문제 해결에 사용할 수 있는 관련 코드 및 응답 메시징과 함께 성공 또는 실패를 다시 보고합니다.

기억해야 할 사항

자신의 모듈 구축을 시작할 때 포함된 템플릿 모듈을 복사하고 필요에 맞게 변경할 수 있습니다.

각 자식 모듈에는 자신의 main.tfvariables.tf 파일이 있어야 합니다.

각 자식 모듈은 루트 수준 main.tf에서 표현되어야 합니다.

템플릿 저장소의 모듈을 신중하게 읽고 각 부분이 목표를 달성하기 위해 함께 작동하는 방법을 완전히 이해하기 위해 모든 참조 지점을 살펴보십시오.

부울 연산(노브라고도 함)을 terraform.tfvars 파일에서 사용하여 자식 모듈을 호출하거나 단순히 terraform 적용을 실행할 때마다 항상 호출되도록 할 수 있습니다.

변수가 채워지는 것에 따라 모듈 호출이 의존하도록 할 수 있으며 자신의 기준에 따라 모듈이 실행될 때를 결정하기 위해 간단한 포함 또는 제외 문을 설정할 수도 있습니다.

Terraform은 사용할 수 있는 많은 기본 제공 기능이 있는 매우 강력한 도구입니다. 일부는 특정 함수를 구축할 때 필요하며 일부는 사용하지 않지만 모두 https://developer.hashicorp.com/terraform에서 매우 잘 문서화되어 있습니다.

참조

Deployment Theory Jamf Pro 공급자

Jamf Platform 공급자

Jamf Security 공급자

Jamf AutoUpdate 공급자

Jamf 생성 예 및 참조 모듈