Node-RED로 OCI 관리를 간소화 (1) OCI CLI + Node-RED Docker 만들기

소개



필자는 오랫동안 SRE를 해왔지만, 운용을 간단하게 하는 툴을 놀고 싶어요. 이번에는 IoT 클러스터로 유명한 Node-RED를 소개하겠습니다. SRE 업계에서는 아직 익명이어야합니다.

필자가 최근 좋아하는 오라클의 Autonomous Database는 동작중의 스케일 업다운을 할 수 있거나 사용하지 않을 때는 멈추어 두거나 편리한 기능이 붙어 있습니다. 문제는 제가 작업을 끝내고 나서 제대로 CPU수를 줄이거나 하는 조작을 꺼내는 것입니다. 네, 잘 잊기 때문에 도구로 커버하는 것입니다.

회사에 도착하면 Oracle Cloud에 로그인하여 조작하고, 돌아가서 다시 조작하는 것은 아마 무리이므로, 일발 조작의 구조를 만들기로 했습니다. CLI에서 쉘 스크립트를 쓰면 좋지만, 다른 사람에게도 간단하게 사용하고 싶다는 것으로 Node-RED로 그래픽으로 브라우저 조작할 수 있도록 합니다.

이번에는 Docker에 구축하고 있습니다. 장래적으로는 OKE상에 관리용 컨테이너로서 굴려 가겠습니다. 수중의 Macbook Pro에 설정하는 방법도 있었습니다만, 오랫동안 사용하고 있어 환경이 엉망이기 때문에 oci cli가 잘 셋업할 수 없었기 때문에, Docker container상에 구축했습니다.

Node-RED와 비슷한 것은 Apache NiFi 등입니다. 데이터 플로우 개발로 고속으로 간단한 툴을 만들 수 있으므로, SRE의 방법에는 유효 활용해 주셨으면 합니다. 명령이나 API 반환값의 json을 해석해 필요한 것을 꺼내 다른 처리에 거는, 같은 것을 간단하게 할 수 있는 것이 장점입니다. 우선은 Node-RED로 왕따 돌려서, 방법을 알면 jq등의 커멘드로 스크립팅하는 것이 좋은 것이 아닐까요.

쉬운 설정



아래에서 git clone하고 make buildimage ; make createcontainer 하면 사용할 수 있습니다.
먼저 make attach 한 다음 OCI CLI를 설정합니다.

Docker Container 설정 (수동)



Docker가 로컬 PC에서 실행
docker pull oraclelinux
docker run -it -p 1880:1880 --name oci_cli_nodered oraclelinux

Docker내에서 실행 ※나중에 Dockerfile화합니다.
yum groupinstall -y "development tools"
yum install -y bzip2-devel gdbm-devel libffi-devel   libuuid-devel ncurses-devel openssl-devel readline-devel   sqlite-devel tk-devel wget xz-devel zlib-devel
yum install -y vim
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
exec "$SHELL"
source .bash_profile
pyenv install 3.7.2
pyenv global 3.7.2

OCI_CLI 설정



이 안내서에 따라 설정합니다.

Node-RED 설정 (수동 : Docker 내)



Docker의 명령 줄에서 설정합니다.
curl -sL https://rpm.nodesource.com/setup_11.x | bash -

yum install -y nodejs
npm install -g --unsafe-perm node-red
node-red &

===中略===

9 Feb 01:39:33 - [warn] rpi-gpio : Cannot find Pi RPi.GPIO python library
9 Feb 01:39:34 - [info] Settings file  : /root/.node-red/settings.js
9 Feb 01:39:34 - [info] Context store  : 'default' [module=memory]
9 Feb 01:39:34 - [info] User directory : /root/.node-red
9 Feb 01:39:34 - [warn] Projects disabled : editorTheme.projects.enabled=false
9 Feb 01:39:34 - [info] Flows file     : /root/.node-red/flows_14daa05f828b.json
9 Feb 01:39:34 - [warn]

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

9 Feb 01:39:34 - [info] Starting flows
9 Feb 01:39:34 - [info] Started flows
9 Feb 01:39:34 - [info] Server now running at http://127.0.0.1:1880/


이제 Node-RED가 움직이기 시작했습니다.

개인용 비망록 조작 메모. 이제부터 자동 시작을 준비합니다.
Docker起動  docker start <container_id>
Dockerに入る docker exec -it oci_cli_nodered bash


동작 확인



localhost의 1880에, docker의 1880을 바인드 하고 있으므로, 이하 URL을 브라우저로 두드립니다.



콘솔 화면이 나오면 간단한 흐름을 작성합니다. Exec 노드에서 oci compute shape list를 실행하는 샘플입니다. 커멘드의 반환값을 debug 노드로 표시하고 있으므로, 오른쪽 하단에 compute shape 이름이 쭉 나왔습니다.

그리고는 이 상태로, 커멘드를 재기록하면 조작을 timestamp 노드로부터 버튼화하거나 정기 실행을 할 수 있게 됩니다.



Exec node는 이런 느낌입니다. oci 명령이 pyenv로 움직이고 있기 때문에 위치를 지정합니다.

+ Append msg.payload는 체크 박스를 제거합니다.



그리고는, 커멘드의 부분을 재기록해 줘, timestamp 노드를 정기 실행 또는 특정의 시간에 실행해 주면 버튼 조작에서도 정기 실행에서도 간단하게 설정할 수 있습니다. 사실, 어떤 외부 액션을 바탕으로 움직이는 것이 좋습니다.

좋은 웹페이지 즐겨찾기