Provisioner
테라폼 프로비저너(provisioner)는 테라폼을 실행할 때 부트스트랩, 구성 관리 또는 정리 작업을 수행하기 위해 로컬 시스템이나 원격 시스템에서 스크립트를 실행하는데 사용된다. 프로비저너에는 로컬 시스템에서 스크립트를 실행하는 local-exec , 원격 리소스에서 스크립트를 실행하는 remote-exec, 원격 리소스에서 셰프 클라이언트를 실행하는 chef 및 원격 리소스로 파일을 복사하는 file 등이 있다.
프로비저너는 terraform apply명령에 대해 생성할 때만 실행되고 그 뒤에 업데이트되거나 하지 않는다. 그래서 provisioner가 실패하면 리소스가 잘못되었다고 판단해 다음 terraform apply할 때 제거하거나 다시 생성한다. provisioner에서 when="destory" 인수를 설정하면 삭제할 때 실행되는 프로비저너가 된다. 삭제할 때 실행되는 프로비저너는 terraform destroy를 실행한 후 그리고 리소스가 삭제되기 직전에 실행된다. 삭제할 때 실행되는 프로비저너를 생성 할 경우 여러번 실행해도 괜찮도록 작성해야 한다.
프로비저는 동일한 리소스에 여러 프로비저너를 지정할 수 있으며 테라폼은 한 번에 하나씩 순서대로 실행한다. on_failure인수를 사용하여 테라폼에 프로비저너의 오류를 처리하는 방법을 지시할 수 있다. 만약 'continue"로 설정하면 테라폼은 오류를 무시하고 리소스 생성 또는 삭제를 계속한다. 'abort'로 설정하면 테라폼은 생성 또는 삭제를 중단한다.
local-exec 프로비저너
주로 로컬에 스크립트나 프로그램을 실행하거나 클라우드에 실행한 IP나 ID같은 정보를 로컬 파일로 만들 때 사용한다.
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
provisioner "local-exec" {
command = "echo \"Hello, World from $(uname -smp)\""
}
}
이 코드에서 terraform apply를 실행하면 'Hello, World from' 문자열 뒤에 uname 명령어를 이용해 로컬 운영체제 세부정보를 출력한다.
remote-exec 프로비저너
local-exec와 달리 리소스를 생성한 후 타겟 머신에서 실행된다. remote-exec는 inline, script, scripts가 있는데 셋 중 한번에 하나만 사용해야 한다. inline을 예시로 살펴보자.
resource "aws_instance" "example" {
# 중략
connection {
type ="ssh"
host =self.public_ip
user="ubuntu"
private_key = tls_private_key.example.private_key_pem
}
provisioner "remote-exec" {
inline = ["echo \"Hello, World from $(uname -smp)\""]
}
}
이처럼 원격에 접속해서 실행하려면 connection을 지정해야 한다. connection은 resource 아래 선언할 수 도있고, provisioner 아래 선언할 수도 있는데 resource 아래 선언하면 해당 리소스의 모든 프로비저너가 선언한 커넥션을 사용하게 된다.
이번엔 script 를 사용해보자.
resource "aws_instance" "example" {
# 중략
connection {
type ="ssh"
host =self.public_ip
user="ubuntu"
private_key = tls_private_key.example.private_key_pem
}
provisioner "remote-exec" {
scrpit ="./apache_install.sh"
}
}
scrpit를 사용하면 로컬에 있는 파일을 원격 서버에 복사한 뒤에 실핸한다. 복잡한 스크립트의 경우 유용하고 scripts는 여러 파일을 실행해야 할 때 사용한다.
null_resource를 사용한 프로비저너
null_resource는 말그대로 빈 리소스를 의미한다. 기존 자원과 관련이 없는 provisioners을 구성할 수 있는 자원이다. 즉 특정 리소스에 연결하지 않고 프로비저너를 실행할 때 사용한다. '실제' 리소스에 연결되지 않기 때문이다.
resource "null_resource" "ssh" {
provisioner "local-exec" {
command = "echo \"Hello, World from $(uname -smp)\""
}
}
*참고
https://www.terraform.io/docs/language/resources/provisioners/syntax.html
'DevOps > Terraform' 카테고리의 다른 글
[NCP] Terraform을 활용한 NCP (Classic) - Server (2), LB(1) 구성 (0) | 2021.08.31 |
---|---|
[NCP] Terraform에서 apply 할 시, Status: 500 Internal Server Error 오류 (1) | 2021.08.30 |
Terraform 이란 (프로비저닝 도구와 코드형 인프라)? (1) | 2021.08.30 |
[NCP] Terraform을 활용한 NCP 서버 이미지,서버 스펙 code 검색하기 (0) | 2021.08.26 |
[NCP] Terraform 0.13.0 설치 + git으로 provider 가져오기 (2) | 2021.08.26 |