[Rundeck] Bastion Host Plugin 사용법
[Rundeck] Bastion Host Plugin 사용법
안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 런덱의 플러그인중에 Bastion node excution 플러그인에 대해서 정리를 해보도록 하겠습니다. 필자가 생각하는 실력을 키우는 가장 빠른 방법은 남이 만들어 놓은 소스를 분석하는데서 가장크게 배운다고 생각합니다.
런덱 관련된 포스팅은 아래와 같이 정리되어있으니, 참고하시기 바랍니다.
- 1편 : 런덱 설치 가이드
- 2편 : 런덱 버전 업그레이드 가이드
- 3편 : 런덱을 통한 배포 개선
- 4편 : 런덱 워크플로우 정리
- 5편 : 런덱 플러그인 정리(Bastion Host NodeExecutor)
그래서 이번시간에는 clone coding 비슷한 느낌으로 분석한내용 위주로 정리를 해보도록 하겠습니다.
사실 이번 포스팅을 정리하면서 docker쪽에 좀더 치중을 해서 정리하는 느낌이 될 것 같습니다.
OpenSSH Bastion Host NodeExecutor
1. 설치 방법
설치방법은 꽤나 간단합니다.
- [화면 우측 상단 톱니 바퀴] 클릭 > [Plugins] > [Find Plugins] 클릭
Plugin Repositories 에서 검색을 통해서 설치를 하게 됩니다.
현재 필자 같은 경우는 사전에 설치를 해둬서 Uninstall로 표기가 되고 있습니다. Install버튼을 클릭하여 설치를 완료 하시면됩니다.
2. docker-compose를 통한 테스트 rundeck
플러그인을 만드신 외국형님께서 친절하게도 테스트를 할 수 있도록 docker-compose 파일로 작성을 해두셨습니다. 그래서 간단하게 git clone을 통해서 해당 소스를 받으시고, compose파일을 실행만 시켜두면 됩니다.
해당 소스를 받기 전에 docker + docker-compose가 인스턴스에 설치가 되어있어야 합니다.
설치는 구글에 간단하게 설치 포스팅이 많이 되어있으니, 스킵 하도록 하겠습니다.
https://github.com/rundeck-plugins/openssh-bastion-node-execution/blob/master/docker/docker-compose.yml
컴포오즈 야믈 파일은 다음과 같이 되어있습니다.
version: '2.4'
services:
mysql:
image: mysql:5.7
ports:
- "3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=rundeckdb
- MYSQL_USER=rundeck
- MYSQL_PASSWORD=rundeck123.
networks:
- rundeck
rundeck:
build:
context: ./rundeck
mem_limit: ${mem_limit}
ports:
- "8080:4440"
links:
- mysql
- bastion
environment:
- RUNDECK_GRAILS_URL=http://localhost:8080
- RUNDECK_DATABASE_DRIVER=com.mysql.jdbc.Driver
- RUNDECK_DATABASE_URL=jdbc:mysql://mysql:3306/rundeckdb?autoReconnect=true&useSSL=false
- RUNDECK_DATABASE_USERNAME=rundeck
- RUNDECK_DATABASE_PASSWORD=rundeck123.
volumes:
- ${PWD}/data/bastion_id_rsa:/home/rundeck/.ssh/bastion_id_rsa
- ${PWD}/data/node_id_rsa:/home/rundeck/.ssh/node_id_rsa
networks:
- rundeck
rundeck-ops:
build:
context: ./rundeck-ops
links:
- rundeck
environment:
- RUNDECK_URL=http://localhost:8080
- RUNDECK_NODE_URL=http://rundeck:4440
- RUNDECK_USER=admin
- RUNDECK_PASSWORD=admin
# import projects
- CONFIG_SCRIPT_POSTSTART=scripts/import_project.sh
- PROJECTS_LIST=OpenSSH-Bastiondemo
volumes:
- ${PWD}/projects:/projects
- ${PWD}/data:/data
networks:
- rundeck
bastion:
build:
context: ./ssh
ports:
- "22"
links:
- linux-1
- linux-2
volumes:
- ${PWD}/data/bastion_id_rsa:/home/rundeck/.ssh/id_rsa
- ${PWD}/data/bastion_id_rsa.pub:/home/rundeck/.ssh/id_rsa.pub
networks:
- rundeck
- bastion
linux-1:
build:
context: ./ssh
ports:
- "2223"
environment:
- SSHD_PORT=2223
volumes:
- ${PWD}/data/node_id_rsa:/home/rundeck/.ssh/id_rsa
- ${PWD}/data/node_id_rsa.pub:/home/rundeck/.ssh/id_rsa.pub
networks:
- bastion
linux-2:
build:
context: ./ssh
ports:
- "22"
volumes:
- ${PWD}/data/node_id_rsa:/home/rundeck/.ssh/id_rsa
- ${PWD}/data/node_id_rsa.pub:/home/rundeck/.ssh/id_rsa.pub
networks:
- bastion
volumes:
mariadb_data:
driver: local
networks:
rundeck:
driver: bridge
bastion:
driver: bridge
소스가 상당히 길긴 하지만, 간단하게 다음과 같이 정리가 되엉있습니다.
- mysql
- rundeck-ops
- bastion
- linux-1
- linux-2
예제가 보여주려고 하는 것은 rundeck -> bastion을 통해서 linux-1/linux-2와 연결을 지으려고 하는 것입니다.
실제로 rundeck 서버에서 linux-1/linux-2로의 직접 접속은 불가합니다.
3. yaml 파일 분석
도커 컴포오즈에 대한 야믈 파일을 하나씩 뜯어보면서 어떤식으로 테스트를 하려고했는지 분석해보도록 하겠습니다.
기본적인 포맷이 모두 동일하기 떄문에 공통화해서 정리해 보도록 하겠습니다.
- build
build:
context: ./rundeck
해당 context path로 들어가게되면, Dockerfile이 존재합니다. 이 dockerfile을 이용해서 이미지를 빌드 하게 되고 해당 이미지를 사용한다는 의미입니다.
- ports
ports:
- "8080:4440"
포트에 대한 지정을 이야기 합니다. 8080(외부 노출 포트) -> 4440(런덱 서비스 포트)로 지정을 한다는 이야기 입니다.
- links
links:
- linux-1
- linux-2
링크는 참조할 다른 컨테이너를 지정하는 내용입니다. 가령 application 이 DB를 사용해야 한다면 지정해줄 수 있습니다. 여기서는 rundeck -> bastion -> linux-1/linux-2로 연결이 됩니다.
- volumes
volumes:
- ${PWD}/data/bastion_id_rsa:/home/rundeck/.ssh/id_rsa
- ${PWD}/data/bastion_id_rsa.pub:/home/rundeck/.ssh/id_rsa.pub
볼륨은 host의 볼륨을 그대로 마운트 해주는 내용입니다.
- networks
networks:
rundeck:
driver: bridge
bastion:
driver: bridge
네트워크는 브릿지 타입으로 2가지(rundeck, bastion)을 생성했습니다. rundeck은 rundeck 네트워크를 bastion은 rundeck,bastion네트워크를, linux-1/linux-2는 bastion네트워크를 사용함으로써 네트웤의 연결을 구분 지었습니다.
4. job 테스트
실제 컴포오즈 파일을 올리고 나면, container들이 연달아 올라옵니다.(rudneck, bastion, linux-1, linux-2)
네트웤 연결이 bastion을 통해서 가야되는 와중에 해당 플러그인을 사용하여 linux-1, linux-2에 접근하는 시나리오입니다.
런덱을 올리게 되면, 테스트 job이 2가지가 있는데 Simple-Command 잡으로 보도록 하겠습니다.
해당 job에는 2개의 노드가 연결되어있고, 위에서 정리했다 시피 직접 linux-1, linux-2에는 접근이 되지 않습니다.
Bastion에 대한 셋팅을 플러그인 셋팅을 보면 되는데, 해당 project에서 좌측 하단부에
[Project Settings] > [Edit Configuration] > [Default Node Executor] 클릭 하게 되면,
다음의 내용이 보입니다.
Host *
StrictHostKeyChecking no
Port 22
ProxyCommand ssh -i @bastion_ssh_key@ -o StrictHostKeyChecking=no rundeck@bastion -W %h:%p
IdentityFile @bastion_ssh_key@
프록시 커맨드가 핵심인데, 실제로 프록시(Bastion)을 통해서 연결하고자 하는 노드로 접속을 한다고 보시면 됩니다.
해당 job을 수행하면, 마친 직접 Node가 연결되어있는 것처럼 정상적으로 호출이 됩니다.
5. 마치며..
이번시간에는 런덱 플러그인에 대해서 알아봤는데요. 사실 런덱이라는 오픈소스자체가 아직은 커뮤니티의 기반이 약한 것 같습니다. 런덱의 UI자체가 최근의 부트스트랩기반으로 만들어져서 트렌디해보이지만 기능적으로 부족한 부분이 아직은 많은 것 같습니다.
필자가 이번에 정리한 Bastion 노드 실행자체도 개별 Job에서 사용할 수 있도록 조정이 가능하면 좋은데 플젝 단위로 셋팅이 되기 떄문에 아직은 미흡한 것 같습니다.