개 introduction
Terraform 출력은 프로젝트 상태에서 인프rastructure 리소스에 대한 정보를 추출하는 데 사용되며, Terraform이 사용하는 Hashicorp Configuration Language(HCL)의 다른 기능을 사용하여 리소스 정보를 조회하고 리스트나 맵과 같은 더 複雑한 데이터 구조로 변환할 수 있습니다. 출력은 생성된 인프rastructure 리소스에 대해 작업을 수행할 수 있는 외부 소프트웨어에 정보를 제공하는 데 유용합니다.
이 튜토리얼에서는 Droplet을 배포하는 간단한 인프rastructure를 만들고, Terraform 출력 문법과 그 パラ미터에 대해 배울 것입니다. 또한 JSON으로 변환하여 프로그램적으로 출력을 해석할 것입니다.
전requrieds
- DigitalOcean에서 통합 的面板을 통해 생성할 수 있는 DigitalOcean 개인 접근 토큰입니다. DigitalOcean 제품 문서에서 개인 접근 토큰 생성하는 방법에 대한 지침을 찾을 수 있습니다.
- Terraform이 로컬 컴퓨터에 설치되었고, DigitalOcean 프로ividر를 사용한 프로젝트가 설정되었습니다. Step 1 및 Step 2의 Terraform과 DigitalOcean를 사용하는 방법 튜orial을 완료하세요. 프로젝트 폴더를
terraform-outputs
로 이름을 지정하고,loadbalance
를 사용하지 마십시오. Step 2에서는pvt_key
변수와 SSH 키 자원을 포함하지 마십시오. - HCL 데이터 유형과 루프에 대한 이해。자세한 정보는 Terraform 변수, 의존성, 및 条件als을 사용하여 靈Exibility를 향상시키는 방법 튜orial을 보십시오.
주의:이 튜orial은 Terraform 1.0.2
로 specifically 시험되었습니다.
Outputs 정의
이 부분에서, 드롭LET을 선언하고 云에 배포하고, Droplet의 IP 주소를 보여주는 Outputs를 정의하여 배경색을 배울 것입니다.
이전에 준비 사항으로 생성한 terraform-outputs
디렉터리에서 droplets.tf
파일을 생성하고 열기를 하세요:
다음과 같은 드롭LET 자원과 Outputs 정의를 추가하세요:
다음은 아래의 코드를 한국어로 번역하는 것입니다. 단계별로 설명을 나타내겠습니다.
1. 다음과 같이 Droplet 자원을 선언합니다. 실제 이름은 test-droplet
로 지정되고, région은 fra1
로 지정되며 Ubuntu 20.04를 실행합니다.
2. 다음으로, 출력을 선언합니다. 출력은 구성된 자원들에서 생성된 値들을 보여주기 위해 사용됩니다. 여기서는 선언時에는 unknown이라고 표시되지만, 실제로 배치될 때에는 이미 알 수 있는 것으로 변경될 것입니다. 이 예는 선언時에는 未知의 値을 넣어 놓고, 실제로 배치할 때에는 실제 値가 나오게 만들어 준다. 출력은 모든 자원의 상태와 정보를 보여주는데 사용되며, 모든 자원이 배치되면 마지막에 보여줍니다.
3. 파일을 저장하고 프로젝트를 배치하려면 다음 명령을 입력합니다:
“`bash
yes
“`
입력시 다음과 같은 결과가 나올 것임:
이는 새로운 Droplet가 배치되었음을 나타내며, 배치 후에 모든 자원의 속성과 정보가 availble 状態로 보여진다. 만약 droplet_ip_address
출력을 사용하지 않았다면, Terraform은 단지 배치 완료 즉, Droplet가 배치되었다는 것만 보여주고, 더 많은 정보는 없습니다. 그러므로, 출력을 사용하면 배치 후에도 자원의 상태와 정보를 보여주는데 사용할 수 있습니다.
4. 프로젝트를 배치한 뒤, 다음과 같은 방법으로 출력을 보여보세요:
“`bash
terraform output
“`
이는 프로젝트에서 선언된 모든 출력을 보여주는데 사용합니다.
Outputdroplet_ip_address = ip_address
다음과 같이 특정 출력을 조회하려면 이름을 매개변수로 指定할 수 있습니다:
“`bash
terraform output -name droplet_ip_address
“`
이는 특정 출력만 보여주는데 사용합니다. 이 예는 다음과 같습니다:
Outputip_address
“`bash
…
droplet_ip_address = “192.168.0.1”
“`
이는 특정 출력에 대한 실제 値만 보여주는데 사용합니다. 만약 특정 출력을 조회하지 않았다면, 다른 출력들은 보여지지 않습니다. 만약 특정 출력을
- 설명: 출력에 대한 단계별 documentation을 보여주는데 사용됩니다.
depends_on
: 각 자원에 availablenmeta parameter로써, output가 自動으로 deduction되지 않아서 explicitly specifying resources를 Permit 합니다.sensitive
: boolean value를 받습니다, 만약true
라면, 실제로 배포 후에도 output의 내용은 log 또는 다른 채널에서 보이지 않습니다.
sensitive 매개변수는 ublicly available 로그 시, 출력 내용을 숨기고 싶어야 합니다. 이를 위해 Droplet 자원 정의에 sensitive 매개변수를 추가합니다.
droplets.tf 파일을 편집하십시오 및 다음과 같은 行을 추가합니다:
저장 및 닫기 완료 后, 다시 프로젝트를 部署 할 수 있습니다. 다음으로 실행합니다:
Enter yes
當提示時. 당신은 다음과 같은 결과를 보게 될 것입니다:
即使它被标记为 sensitive
,输出及其内容仍然可以通过其他渠道获得,例如查看Terraform状态或直接查询输出。
在接下来的步骤中,您将创建一个新的Droplet并输出结构,所以现在删除当前部署的实例,运行:
最後一行將會是:
Output...
Destroy complete! Resources: 1 destroyed.
你已经声明并部署了一个Droplet,并且创建了一个输出,显示其IP地址。你将学习如何使用输出来显示更复杂的结构,如列表和地图。
복잡한 구조의 출력
이 섹션에서는 count
キー워드를 사용하여 같은 정의로 여러 ド랍롤을 배포하고, 그들의 IP 주소를 여러 형식으로 출력할 것입니다.
for 루프를 사용하여
ド랍롤 자원 정의를 수정하고자 하면, 편집기에 열어주세요:
이렇게 수정하면 됩니다:
tre 드랍롤을 세 개 생성하도록 count
키를 사용하고, 현재 인덱스를 드랍롤 이름에 추가하여 later 에서 它们를 구별할 수 있도록 했습니다. 아래에 있는 기존 출력을 제거합니다. 完成后, 파일을 저장하고 닫으세요.
코드를 적용하기 위해서는 다음과 같이 실행합니다:
Terraform은 编号의 세 개의 드랍롤을 생성하고 test-droplet-0
, test-droplet-1
, test-droplet-2
로 이름づけ할 것입니다. 이 과정을 완료하기 위해서는 yes
를 입력하십시오. 결과적으로, 다음과 같은 출력이 보여집니다:
Output...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
这意味着 모든 세 개의 드랍롤이 성공적으로 배포되었고, 그들의 정보는 프로젝트 상태에 저장되었습니다.
자신의 자원 속성을 접근하는 가장 쉬iest 方式은 输出来使用하는 것이지만, 각 Droplet에 대해 하나씩 생성하는 것은 스케일ability가 없습니다. 해결 方法은 for
루프를 사용하여 Droplets의 목록을 돌면서 그들의 속성을 모으거나, 대신 splat expressions (이 단계 나중에 배울 것)을 사용하는 것입니다.
まず, three Droplets의 IP addresses를 输出来 정의하고 그들의 이름과 함께 输出来 하는 것을 시작하십시오. droplets.tf
을 수정하기 위해 개 aperture을 오픈하십시오.:
다음과 같은 行을 추가하십시오.:
droplet_ip_addresses
输出的 价值은 for
루프를 사용하여 구성되었습니다. 界定자로 둘러싸여 있으므로 결과 형태는 맵입니다. 루PE가 Droplets의 목록을 돌며, 각 인스턴스에 대해 그의 이름과 IP address를 짝을 이어 결과 맵에 추가합니다.
파일을 저장하고 닫으십시오., 그 다음 项目을 다시 적용합니다.:
prompted에 의해 yes
를 입력하십시오. 그렇게 하면 결과를 终极에 받을 수 있습니다.:
droplet_ip_addresses
输出的 상세는 three deployed droplets의 IP addresses를 보여줍니다.
Terraform output
명령어를 사용하여 输出来의 내용을 JSON로 얻을 수 있습니다. 그 명령어 인자를 사용하십시오.:
결과는 다음과 비슷하게 나타낼 것입니다.:
JSON 분석은 널리 사용되고 여러 프로그래밍 언어에서 지원되는 것입니다. 이 방법을 사용하여 배포된 Droplet 자원에 대한 정보를 프로그램적으로 분석할 수 있습니다.
Splat Expressions 사용
Splat expressions는 리스트의 모든 요소를 이용해 iteration하며 각 요소의 attribute의 내용을 수집하여 리스트로 나오는 간단한 방법을 제공합니다. 三部의 배포 드랩leton의 IP 주소를 추출하는 Splat expression은 다음과 같은 문법을 가지고 있습니다:
왼쪽의 리ference가 자신self에 대한 리스트가 아니면, 그것이 가지고 있는 attribute의 내용을 이용해 변경되며, 오른쪽에 지정된 것으로 해석됩니다.
`droplets.tf`를 편집하고 다음 各行을 수정하여 이 것을 구현할 수 있습니다:
파일을 저장한 다음, 프로젝트를 적용하기 위해 다음 명령어를 실행합니다:
이제 输出行은 리스트로 변해 있고, 이 리스트는 드랩leton의 IP 주소만 가지고 있습니다:
JSON 형태로 输出行을 받으시려면 다음 명령어를 실행합니다:
输出行은 단일 array가 됩니다:
배포 드랩leton의 IP 주소를 추출하기 위해 outputs를 사용하고 Splat expressions와 for
loop를 사용했습니다. 또한 输出行 내용을 JSON로 받았고, jq
를 사용하여 이를 해석할 것입니다. jq
는 주어진 expressions에 따라 JSON을 동적으로 필터링하는 도구입니다.
JSON 문서 수정 도구 jq를 이용한 출력 해석
이 단계에서는 Terraform 프로젝트의 출력을 해석하는 데 사용하고자 하는 jq 도구를 설치하고 기본적인 사용方法을 배울 것입니다.
Ubuntu를 사용하고 있다면, jq
를 설치하기 위한 다음 명령어를 실행합니다:
macOS에서는 Homebrew를 사용하여 설치할 수 있습니다:
jq
는 주어진 인pu를 통해 사용할 수 있는 처리 표현식을 적용하여 입력값을 가공합니다.
jq
의 가장 간단한 任务은 입력값을 기 gorgeous하게 출력하는 것입니다:
identity 연산자(.
)를 통해 입력으로부터 구성된 전체 JSON 문서를 수정하지 않고 출력하는 것을 의미합니다:
IP地址의 두 번째 값을 얻기 위해 배열 괄호 표현法을 사용하여 zero-based counting를 실시합니다:
출력 결과는 다음과 같습니다:
처리 결과를 배열로 만들기 위해 표현식을 괄호로 WRAP하십시오:
이렇게 예쁜 JSON 배열을 얻을 수 있습니다:
배열의 일부를 단일 요소를 대신하여 얻기 위해 괄호 안에 인덱스의 범위를 지정할 수 있습니다:
0:2
범위는 첫 두 요소를 반환합니다 – 범위의 위쪽(2
)은 포함되지 않으므로, only elements at positions 0
and 1
are fetched.
이제 배포된 자원을 삭제하기 위해 다음을 실행할 수 있습니다.:
이 단계에서, 您已经安装了jq
并使用它解析并操作了Terraform项目的输出,该项目部署了三个Droplets.
결론
您已经学习了Terraform 输出,使用它们来显示有关已部署资源的信息,以及将数据结构导出以供稍后外部处理。您还使用输出显示单个资源的特点,以及显示包含资源属性的构建地图和列表。
关于jq
特性的更详细信息,请访问官方文档。
이 教程은 Terraform를 사용하여 인프라STRUCTURE 관리하는 How To Manage Infrastructure with Terraform 시리즈의 일부입니다。 시리즈는 Terraform의 여러 주제에 대해 자세히 다룹니다,從第一次安装Terraform到管理複雑한 프로젝트에 있어서。