런덱은 웹GUI환경, REST API, CLI, 스케쥴러 등을 지원하는 워크플로우 자동화 기능을 가진 오픈소스 소프트웨어이다.
커맨드 명령, 쉘스크립트, 기타 업무툴의 실행 등을 업무 단위로 묶어서 실행하거나 스케쥴러로 자동화 할 수 있으며 업무에 필요한 여러 기능들을 지원한다.
테스트 하면서 약간 CI/CD툴과 같은 느낌도 받았으며 사용할 수 있는 범위가 AWX보다 좀 넓은 것 같다.
본 포스팅에서 테스트 해볼 범위는 github과 ssh-key를 이용해 연동 후 git에 있는 ansible코드를 command명령어로 실행해 보고 ansible plugin의 기능으로 실행해 보는 과정을 테스트 해볼 예정이다.
Docker, Package, JAVA Jre 등 여러 설치방식을 지원하고 있다.
우분투 리눅스에서 apt설치로 진행해 본다.
공식문서 설치페이지 바로가기
설치 환경
OS: Ubuntu 20.04
JDK: OpenJDK 11
자세한 설치방법은 공식문서를 확인하면 되는데 여기서는 Manual install with apt
로 설치했다.
# repo저장소 signing key 추가
$ curl -L https://packages.rundeck.com/pagerduty/rundeck/gpgkey | sudo apt-key add -
# /etc/apt/sources.list.d/rundeck.list 에 내용 추가
$ deb https://packages.rundeck.com/pagerduty/rundeck/any/ any main
$ deb-src https://packages.rundeck.com/pagerduty/rundeck/any/ any main
# apt설치
$ sudo apt-get update
$ sudo apt-get install rundeck
# 서비스 시작
$ sudo systemctl daemon-reload
$ sudo systemctl start rundeckd.service
서비스 시작 후 로그파일을 확인했을 때 마지막에 Grails application running at http://localhost:4440 in environment: production
이라는 문구가 보이면 정상적으로 시작된 것이다.
웹브라우저에서 http://<SERVICE_HOST>:4440
으로 접속 확인한다.
초기 계정은 admin/admin
이다.
계정을 입력하고 로그인을 누르면 로딩화면만 계속 돌아갈 뿐 넘어가지 않는다.
런덱 설정파일에 초기세팅으로 서버 호스트 정보가 localhost로 되어있어서 그렇다.
접속 호스트 설정과 디폴트로 H2 DB로 설정되어 있는걸 운영환경 대비해서 mariadb로 설정한다.
/etc/rundeck/rundeck-config.properties
파일 수정.
grails.serverURL
항목을 수정.dataSource.xxxxx
라인 주석.add data source set - mariadb
영역의 코드 추가.# /etc/rundeck/rundeck-config.properties
#loglevel.default is the default log level for jobs: ERROR,WARN,INFO,VERBOSE,DEBUG
loglevel.default=INFO
rdeck.base=/var/lib/rundeck
#rss.enabled if set to true enables RSS feeds that are public (non-authenticated)
rss.enabled=false
# change hostname here
grails.serverURL=http://<SERVER_HOST>:4440 # Edit Line
#dataSource.dbCreate = none # Comment line
#dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=MONTH,HOUR,MINUTE,YEAR,SECONDS # Comment line
grails.plugin.databasemigration.updateOnStart=true
# Encryption for key storage
rundeck.storage.provider.1.type=db
rundeck.storage.provider.1.path=keys
rundeck.storage.converter.1.type=jasypt-encryption
rundeck.storage.converter.1.path=keys
rundeck.storage.converter.1.config.encryptorType=custom
rundeck.storage.converter.1.config.password=eca322120bee0588
rundeck.storage.converter.1.config.algorithm=PBEWITHSHA256AND128BITAES-CBC-BC
rundeck.storage.converter.1.config.provider=BC
# Encryption for project config storage
rundeck.projectsStorageType=db
rundeck.config.storage.converter.1.type=jasypt-encryption
rundeck.config.storage.converter.1.path=projects
rundeck.config.storage.converter.1.config.password=eca322120bee0588
rundeck.config.storage.converter.1.config.encryptorType=custom
rundeck.config.storage.converter.1.config.algorithm=PBEWITHSHA256AND128BITAES-CBC-BC
rundeck.config.storage.converter.1.config.provider=BC
rundeck.feature.repository.enabled=true
# add data source set - mariadb
dataSource.driverClassName = org.mariadb.jdbc.Driver
dataSource.url = jdbc:mysql://<DATABASE_HOST>:3360/rundeck?autoReconnect=true&useSSL=false
dataSource.username = <DATABASE_USERNAME>
dataSource.password = <DATABASE_PASSWORD>
/etc/rundeck/framework.properties
파일 내용 수정.
framework.ssh.keypath
부분은 ssh-key파일을 설정하는 부분인데 ed25519암호화로 만들거라서 해당 라인도 변경해 주었다.
각자의 환경에 따라 바꿔주면 될 듯.
# /etc/rundeck/framework.properties
# framework.properties -
#
# ----------------------------------------------------------------
# Rundeck server connection information
# ----------------------------------------------------------------
framework.server.name = localhost
framework.server.hostname = localhost
framework.server.port = 4440
framework.server.url = http://localhost:4440
# ----------------------------------------------------------------
# Installation locations
# ----------------------------------------------------------------
rdeck.base=/var/lib/rundeck
framework.projects.dir=/var/lib/rundeck/projects
framework.etc.dir=/etc/rundeck
framework.var.dir=/var/lib/rundeck/var
framework.tmp.dir=/var/lib/rundeck/var/tmp
framework.logs.dir=/var/lib/rundeck/logs
framework.libext.dir=/var/lib/rundeck/libext
# ----------------------------------------------------------------
# SSH defaults for node executor and file copier
# ----------------------------------------------------------------
framework.ssh.keypath = /var/lib/rundeck/.ssh/id_ed25519 # 수정부분
framework.ssh.user = rundeck
# ssh connection timeout after a specified number of milliseconds.
# "0" value means wait forever.
framework.ssh.timeout = 0
# ----------------------------------------------------------------
# Auto generated server UUID: f53cbbee-68ea-477a-954e-860a18795699
# ----------------------------------------------------------------
rundeck.server.uuid = f53cbbee-68ea-477a-954e-860a18795699
수정한 후 런덱 서비스 재시작.
sudo systemctl restart rundeckd.service
아예 ssh-key도 미리 발급받아놓자.
github에 연동할 레파지토리가 private repository일 경우, 접속할 노드 호스트와 ssh통신할 때도 해당 키를 이용해 접근한다.
키 발급 시 경로는 런덱 베이스의 .ssh 폴더로 해준다.
키 발급은 간략하게 기술한다. 자세한 사용법은 따로 알아보는걸로...
$ ssh-keygen -t ed25519 -C "rundeck@dockerhost"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519): /var/lib/rundeck/.ssh/id_ed25519
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/rundeck/.ssh/id_ed25519
Your public key has been saved in /var/lib/rundeck/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:9JR1/vfTgFzswZcnHjLEb49xr4W9+/i6LBUMB5/EoMQ rundeck@dockerhost
The key's randomart image is:
+--[ED25519 256]--+
| ...=+o |
| .E=oBo..|
| . + o=@.o|
| . o . B**o|
| S . o.+O+|
| +.O|
| . ++|
| ...o.|
| .===|
+----[SHA256]-----+
키 파일 소유권한은 rundeck 으로 변경해 준다.
나중에 노드에 접근할 때 키파일 퍼미션 문제로 막히는 문제가 생기니 지금 바꿔준다.
ex) chown rundeck:rundeck id_ed25519*
우선 첫번째로 노드 설정과 키파일을 통한 접근을 테스트 해보기 위해 command 명령 실행을 테스트 해본다.
로그인 후 Create New project
로 프로젝트 생성한다.
Project Name
과Project Display Name
만 입력하고 만들어준다.
만들고 나면 노드 설정 페이지가 나온다.
디폴트로 Local노드가 등록되어 있는데 삭제하고 Add a new Node Source > File
선택한다.
Format은 취향대로 선택하면 되고 FilePath는 <RUNDECK_BASE_DIR>/projects/<PROJECT_NAME>/<RESOURCE_FILENAME>
과 같은 형식으로 넣어준다.
체크박스들 의미
저장 후 Edit 탭으로 이동하면 리소스 파일 기준으로 노드정보가 나온다.
로컬노드가 기본으로 입력되어 있고 여기서는 다른 Mac 장비를 노드로 하나 추가했다.
노드 호스트 추가시 <USERNAME>@<HOSTNAME>
형식으로 입력해 준다.
레프트 메뉴의 Commands
로 이동해서 All Nodes를 세팅하고 명령어는 uname -a
를 입력해 준다.
여기서 로컬노드의 경우는 정상적으로 실행되겠지만 외부 연동한 노드는 ssh-key파일의 소유권을 바꿔주지 않으면 Failed: Unknown: /var/lib/rundeck/.ssh/id_ed25519 (Permission denied)
에러가 날 것이고 소유권을 바꿔준 후에도 Failed: Unknown: Exhausted available authentication methods
오류가 발생한다.
타겟 노드의 /<USER_BASE_DIR>/.ssh/authorized_keys
파일에 아까 만든 공개키(여기서는 id_ed25519.pub)를 입력해 줘야 한다.
해당 키 정보를 가지고 접속하는 호스트는 인증한다 라는 의미..
Run 실행했을때 문제가 없으면 아래와 같은 결과가 나온다.
여기까지 수행했으면 우선 목표로 한 노드로의 접근에는 문제가 없고 커맨드 실행시 정상적으로 작동함을 확인하였다.
레프트 메뉴의 Project Setting > Key Storage
이동해서 Add or Upload a Key
실행.
키 타입은 private과 public이 있다.
패스워드 방식은 사용하지 않을거고 키 인증만 사용할거라 개인키 공개키 둘다 등록한다.
위에서 발급받은 키 중에 pub
확장자가 있는 파일이 공개키이고 없는 파일이 개인키 이다.
해당하는걸 각각 등록해 준다.
** Github에 공개키 세팅
github과 연동을 위해서는 github쪽에서도 공개키의 등록이 필요하다.
Settings > SSH and GPG keys 화면에서 키를 등록해 주면 된다.
이 과정은 검색해보면 자료가 많으니 여기서는 이만 Pass~
레프트 메뉴의 Project Setting > Setup SCM > Git Import
이동.
/var/lib/rundeck/projects/<PROJECT_NAME>/ScmImport
이런 형식으로 런덱 홈디렉토리 하위로 프로젝트 경로를 따라 입력되어 있다.more
를 눌러서 확인해 보면 github에서 제공하는 주소를 그대로 넣으면 안되고 수정해줘야 한다는 내용을 볼 수 있다.ssh://
를 붙이고 중간에 :
를 /
로 바꿔줘야 하는건데 대략 ssh://git@github.com/<PATH>/<REPO_NAME>.git
이런 형태로 입력해야 한다.스크롤을 내리면 Authentication
입력칸이 나오는데 SSH: Strict Host Key Checking
을 no로 선택하고 위에서 등록해 놓은 ssh-key 중 private key를 선택해 준다.(어차피 개인키밖에 선택이 안됨)
여기까지 하고 Setup 마무리하면 git과의 연동작업 완료.
git연동시에 입력했던 디렉토리로 이동해 보면 git clone되어 브랜치의 파일들이 내려받아져 있다.
레프트 메뉴의 Jobs
로 이동 후 Create a New Job
으로 신규 잡 생성.
잡 이름 입력하고 Workflow
탭으로 이동한다.
Command
선택 후 명령어를 입력해 준다.
여기에 경로 입력시에는 full경로를 입력해 줘야 한다.
프로젝트 폴더 기준으로 하니까 파일을 찾지 못하는 오류가 발생한다.
저장하고 실행하면 앤서블 플레이북 로그가 출력되면서 결과를 확인할 수 있다.
새로운 잡 등록 화면으로 가서 워크플로우를 Ansible Playbook Workflow Node Step
으로 선택해서 캡쳐화면과 같이 Ansible binaries directory path
, Ansible base directory path
, Playbook
을 각각 시스템에 맞게 입력해 준다.
그리고 상단 Nodes탭으로 이동한다.
Execute Locally
로 기본선택 되어 있는데 Dispatch to Nodes
선택 후 Ansible을 호스트로 등록한 노드를 필터링 한다.
마지막으로 ansible hosts 설정 파일에 호스트 정보를 등록한다.
일반적으로 ansible의 hosts파일 경로는 /etc/ansible/hosts
이다.
ansible hosts 입력방법도 인터넷에 자료가 많이 있으니 필요하면 확인..
대략 <USER_ID>@<HOSTNAME>
과 같은 형식으로 입력하고 저장.
이후에 Run Job Now
실행하면 일반적으로 prompt상에서 앤서블을 실행했을때와 같은 로그가 나오면서 실행과정을 볼 수 있다.
정상적으로 성공하면 rundeck에서의 ansible실행이 완료되었다.
런덱에서 앤서블을 실행하는 방법은 이 포스트에 나와있는 방법 말고도 많은 방법이 있다.
공식문서의 Integrate with Ansible 에도 나와있다.
노드 추가시 앤서블의 인벤토리에 등록된 호스트 정보를 가지고 하는 방법도 있고 인벤토리와 플레이북 코드를 inline으로 잡 등록시 직접 입력해서 실행하는 방법도 있다.
나한테 필요한 방법으로 사용하면 될 것 같다...나도 해본거 말곤 잘 모르니 더 많이 해봐야지;;;
rundeck에서는 API 방식으로도 이옹할 수 있다.
공식문서의 api reference 에 나와있는 대로 간단히 테스트 해본다.
전부를 알지는 못하지만 웹gui에서 할 수 있는 거의 모든 기능이 api로도 할 수 있다.
api를 사용하기 위해서는 우선 api version을 알아야 한다.
우측 상단 톱니바퀴 아이콘에서 System Report
메뉴로 진입하면 아래 화면이 나온다.
빨간색으로 표시한 부분에 api version이 있다.
현재 45버전으로 나온다.
다음으로 api token이 필요하다.
상단 오른쪽의 사람모양 아이콘에서 Profile
화면으로 진입하면 User API Tokens
항목이 있고 기존에 받은게 없다면 신규 토큰을 발급받는다.
기존에 받았어도 기억이 나지 않는다면 다시 확인할 수 없으니 새로 받아야 한다.
잊지 않도록 잘 보관해 두자.
기본적인 url 형식은 <RUNDECK_SERVER_URL>/api/<API_VERSION>
구조로 되어있고 저 뒤로 사용할 기능에 따라 url이 달라진다.
예를들어 http://localhost:4440/api/45/system/info
와 같은 url이 된다.
api테스트는 postman
으로 했다.
url입력하고 Header에 X-Rundeck-Auth-Token
으로 토큰값을 넣어주고 Send.
결과값이 나온다.
api는 활용도가 좋아보이니 사용법을 잘 익혀두면 좋을 것 같다.