✔️ 인스턴스 구성하기
본 실습의 아키텍처(Architecture)는 다음과 같다.
Ansible -> Bastion 으로 SSH 접속할 때와, Bastion -> Private Instance로 SSH 접속할 때 다른 키 페어를 사용할 예정이다.
1. Ansible Controller에서 공개키 복사
- (편의를 위해) controller에 생성되어있는 공개키 ~/.ssh/id_rsa.pub를 사용
[vagrant@controller ~]$ cat .ssh/id_rsa.pub
...키 내용...
2. AWS에서 [작업] - [키 페어 가져오기]
- 복사한 키를 붙여넣기
3. Private Subnet 생성
- default vpc 에서 생성
4. Bastion Host로 사용할 AWS EC2 인스턴스 생성하기
- 좀 전에 생성한 mycontroller key 사용
- default vpc public subnet에 생성
- 보안을 위해 내IP에서의 SSH 트래픽만 허용
5. ~/.ssh/config 파일 작성 및 권한 변경
[vagrant@controller ~]$ cat ~/.ssh/config
Host bastion
Hostname 52.79.235.84
User ec2-user
Port 22
IdentityFile ~/.ssh/id_rsa
- 권한 변경
[vagrant@controller ~]$ sudo chmod 600 .ssh/config
6. Bastion Host에서 키 생성하기
- Bastion Host -> Private Subnet EC2 접속할 때 사용할 키 페어
[ec2-user@ip-172-31-41-176 ~]$ ssh-keygen
- 공개키 내용 복사
[ec2-user@ip-172-31-41-176 ~]$ cat ~/.ssh/id_rsa.pub
[키 내용]
7. AWS에서 [작업] - [키 페어 가져오기]
- 2번 작업과 같이 붙여 넣기 후 키페어 생성
8. Private Subnet EC2 인스턴스 생성하기
- 이전에 생성한 private subnet my-private-subnet 선택
- 7번에서 생성한 키 페어 선택
9. Bastion Host에서 키 파일 복사
[ec2-user@ip-172-31-41-176 ~]$ cat ~/.ssh/id_rsa
10. Controller에 키 붙여넣기
- test_rsa
[vagrant@controller ~]$ vim ~/.ssh/test_rsa
11. 키 파일 test_rsa 권한 변경
[vagrant@controller ~]$ chmod 600 ~/.ssh/test_rsa
12. Controller -> Bastion -> Private Instance 접속 테스트
- Controller(Ansible) -> Bastion
[vagrant@controller ~]$ ssh bastion
Last login: Thu Apr 14 09:56:03 2022 from 1.236.233.38
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-41-176 ~]$
- Bastion -> Private Instance
[ec2-user@ip-172-31-41-176 ~]$ ssh ec2-user@172.31.65.195
Last login: Thu Apr 14 10:30:23 2022 from ip-172-31-41-176.ap-northeast-2.compute.internal
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-65-195 ~]$
- 정상적으로 접속됨을 확인할 수 있음
✔️ 첫번째 방법(ProxyJump)
첫번째 방법은 ~/.ssh/config 파일에 ProxyJump를 정의하는 방법이다.
1) Controller의 ~/.ssh/config 파일 수정
[vagrant@controller ~]$ cat ~/.ssh/config
Host bastion
Hostname 52.79.235.84
User ec2-user
Port 22
IdentityFile ~/.ssh/id_rsa
Host node
Hostname 172.31.65.195
User ec2-user
Port 22
Identityfile ~/.ssh/test_rsa
ProxyJump bastion #Bastion Host를 점프해서 들어가게됨
2) SSH 점프 접속 테스트
- 정상적으로 접속되는 것을 확인할 수 있음
[vagrant@controller ~]$ ssh node
Last login: Thu Apr 14 09:58:25 2022 from ip-172-31-41-176.ap-northeast-2.compute.internal
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-65-195 ~]$
3) (편의를 위해) inventory파일에 node(private ec2) 추가
[vagrant@controller ~]$ cat inventory.ini
[ec2]
node
4) ansible 명령어로 private subnet의 ec2 인스턴스 id 확인해보기
- 정상적으로 작동하는 것을 확인할 수 있음
- -i 옵션으로 inventory 파일을 지정해주지 않는 것은 ansible 설정 파일 /home/vagrant/.ansible.cfg 에 inventory를 지정해뒀기 때문
[vagrant@controller ~]$ ansible ec2 -m command -a id
[WARNING]: Platform linux on host node is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
node | CHANGED | rc=0 >>
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)
💧 ProxyJump는 설정이 편하나 되는 경우도 있고, 안되는 경우도 있어서(ansible client 설정이 잘 안되는 겨우가 있음) 일반적으로는 아래의 두번째 방법을 더 많이 사용함
✔️ 두번째 방법(Inventory 파일)
두번째 방법은 Inventory 파일에 ansible_ssh_common_args 변수를 정의하여 jump하는 방법이다.
- Sample
- ansible_ssh_common_args 변수를 정의하면 ssh 접속을 할 때마다 변수의 값(설정)이 적용됨(옵션이 붙게됨)
- -p : Port
- -w : stdin과 sdout을 해당되는 호스트(%h)와 포트(%p)로 넘겨줌
- 실질적으로 접속할 Target(여기서는 private instance)의 호스트와 포트 정보
[proxy]
bastion.example.com
[nodes]
private-server-1.example.com
private-server-2.example.com
private-server-3.example.com
[nodes:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -p 2222 -W %h:%p -q username@bastion.example.com"
1) ~/.ssh/config 파일 수정
- 1번째 방법을 시도했다면, ~/.ssh/config 파일의 ProxyJump로 인해 Jump가 되는것이 아님을 증명하기 위해 ProxyJump 정의를 삭제
[vagrant@controller ~]$ vim ~/.ssh/config
[vagrant@controller ~]$ cat ~/.ssh/config
Host bastion
Hostname 52.79.235.84
User ec2-user
Port 22
IdentityFile ~/.ssh/id_rsa
Host node
Hostname 172.31.65.195
User ec2-user
Port 22
Identityfile ~/.ssh/test_rsa
2) inventory 파일 수정하기
- inventory.ini
- -q 옵션 뒤에는 Bastion Host의 IP
[vagrant@controller ~]$ cat inventory.ini
192.168.100.11
192.168.100.12
[wp]
192.168.100.11
[ec2]
node
[ec2:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -p 22 -W %h:%p -q ec2-user@52.79.235.84"'
3) ansible 명령어로 private subnet의 ec2 인스턴스 id 확인해보기
- 정상적으로 jump되어 작동되는 것을 확인할 수 있음
[vagrant@controller ~]$ ansible ec2 -m command -a id
[WARNING]: Platform linux on host node is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
node | CHANGED | rc=0 >>
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)
출처 : [Ansible] Ansible SSH Jump : Public Bastion to Private Instance (tistory.com)
'IT > CLOUD(AWS,Azure,GCP,Docker)' 카테고리의 다른 글
[Ansible] Variables 요약 (0) | 2023.11.20 |
---|---|
playbook에 파일 포함하기 및 가져오기 (0) | 2023.11.20 |
[Ansible] 앤서블(Ansible) 개념과 설치/사용법 (w/ CentOS 7.6) (0) | 2023.11.20 |
[Ansible] Playbooks 요약 정리 (0) | 2023.11.20 |
ansible 에러 Failed to connect to the host via ssh: Permission denied (0) | 2023.11.19 |