뭘 하고 싶었냐면…
환경 | 도메인 | Puppet Master | AWS VPC |
---|---|---|---|
Staging | *.si.test.com | puppet.si.test.com | staging |
Production | *.pi.test.com | puppet.pi.test.com | production |
이런 식으로 각 환경(Environment)을 구성했다고 치자. 이때 특정 VPC에 노드를 추가하면 해당 노드가 자신이 어느 환경에 속했는지 스스로 판단하게 하려는 것이다. puppet.conf
에 environment
값을 적어넣지 않더라도 말이다.
참고
- 이 문서는 Puppet 4.2를 기준으로 삼는다.
- 네트워크 구성은 Puppet을 위한 네트워크 구성하기를 읽는다.
이를 구현하기는 그리 어렵지 않은데 삽질하느라 시간은 꽤 걸렸다. 우선, 적당한 경로에 getenv
라는 Bash 스크립트를 작성해 넣는다. 여기서는 /etc/puppetlabs/code/bin/getenv
을 경로로 잡았다.
#!/bin/bash
hostname="$(/opt/puppetlabs/bin/facter fqdn)"
if [[ $hostname =~ .*\.si\..* ]];
then
echo "environment: staging"
exit 0
fi
echo "environment production"
getenv
파일에 실행권한을 부여하는 걸 잊지 말자.
chown +x /etc/puppetlabs/code/bin/getenv
이제 Puppet 서버의 /etc/puppetlabs/puppet/puppet.conf
을 수정해서 [master]
섹션에 두 줄을 써 넣는다.
[master]
node_terminus = exec
external_nodes = /etc/puppetlabs/code/bin/getenv
이제 *.si.*
도메인을 가진 VPC에 속한 노드는 자신이 Staging
환경에 있음을 자동으로 파악한다. 그 외의 VPC의 경우에는 Production
이라고 판단할 것이다.
참고 자료
AWS Rest API
getenv
를 보면 Puppet의 facter
를 이용해 노드의 FQDN을 알아낸다.
hostname="$(/opt/puppetlabs/bin/facter fqdn)"
똑같은 일을 AWS가 제공하는 기능으로도 해낼 수 있다.
hostname="$(/usr/bin/curl --silent http://169.254.169.254/latest/meta-data/local-hostname)"
Puppet이 없는 곳에서는 이 방법이 유용하다.
Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.