Amazon EC2 Linux 인스턴스용 EC2Rescue 모듈 개발하기

Amazon EC2 Linux 인스턴스용 EC2Rescue 모듈 개발하기

모듈은 데이터 직렬화 표준인 YAML로 작성돼요. 이 절에서 모듈 속성, 환경 변수, YAML 구문, 예시 모듈을 살펴볼게요.

출처: 문서

본문

모듈은 데이터 직렬화 표준인 YAML로 작성돼요. 모듈의 YAML 파일은 모듈과 그 속성을 나타내는 단일 도큐먼트로 구성돼요.

모듈 속성 추가

다음 표는 사용 가능한 모듈 속성을 나열해요.

helptext: !!str |
Collect output from ps for system analysis
Consumes --times= for number of times to repeat
Consumes --period= for time period between repetition
속성 설명
name 모듈의 이름. 이름은 18자 이하여야 해요.
version 모듈의 버전 번호.
title 모듈에 대한 짧고 설명적인 제목. 이 값은 50자 이하여야 해요.
helptext 모듈의 확장 설명. 각 줄은 75자 이하여야 해요. 모듈이 필수 또는 선택 인자(arguments)를 소비한다면 helptext 값에 포함하세요. 예를 들어:
placement 모듈이 실행되어야 하는 단계. 지원 값: prediagnostic, run, postdiagnostic
language 모듈 코드가 작성된 언어. 지원 값: bash, python. 참고: Python 코드는 Python 2.7.9+와 Python 3.2+ 모두와 호환되어야 해요.
remediation 모듈이 개선(remediation)을 지원하는지 여부. 지원 값은 True 또는 False. 이 속성이 없으면 모듈은 False로 기본 설정되며, 개선을 지원하지 않는 모듈에는 선택 속성이 돼요.
content 스크립트 코드 전체.
constraint 제약 값이 포함된 객체의 이름.
domain 모듈이 그룹화되거나 분류되는 방식을 설명하는 설명자. 포함된 모듈 집합은 다음 도메인을 사용해요: application, net, os, performance
class 모듈이 수행하는 작업 유형을 설명하는 설명자. 포함된 모듈 집합은 다음 클래스를 사용해요: collect(프로그램에서 출력 수집), diagnose(일련의 기준에 기반한 pass/fail), gather(파일 복사 및 특정 파일에 쓰기)
distro 이 모듈이 지원하는 Linux 배포판 목록. 포함된 모듈 집합은 다음 배포판을 사용해요: alami(Amazon Linux), rhel, ubuntu, suse
required 모듈이 CLI 옵션에서 소비하는 필수 인자.
optional 모듈이 사용할 수 있는 선택 인자.
software 모듈에서 사용하는 소프트웨어 실행 파일. 이 속성은 기본으로 설치되지 않는 소프트웨어를 지정하기 위한 것이에요. EC2Rescue for Linux 논리는 모듈을 실행하기 전에 이러한 프로그램이 존재하고 실행 가능한지 확인해요.
package 실행 파일의 소스 소프트웨어 패키지. 이 속성은 다운로드하거나 추가 정보를 얻기 위한 URL을 포함해 소프트웨어가 있는 패키지에 대한 추가 세부 정보를 제공하기 위한 것이에요.
sudo 모듈을 실행하는 데 루트 접근이 필요한지 여부. 모듈 스크립트에 sudo 확인을 구현할 필요는 없어요. 값이 true이면 EC2Rescue for Linux 논리는 실행 사용자가 루트 접근 권한이 있을 때만 모듈을 실행해요.
perfimpact 모듈이 실행되는 환경에 상당한 성능 영향을 줄 수 있는지 여부. 값이 true이고 --perfimpact=true 인자가 없으면 모듈을 건너뛰어요.
parallelexclusive 상호 배타성(mutual exclusivity)을 요구하는 프로그램을 지정해요. 예를 들어 "bpf"를 지정하는 모든 모듈은 직렬 방식으로 실행돼요.

환경 변수 추가

다음 표는 사용 가능한 환경 변수를 나열해요.

환경 변수 설명
EC2RL_CALLPATH ec2rl.py의 경로. 이 경로를 사용해 lib 디렉터리를 찾고 vendored Python 모듈을 사용할 수 있어요.
EC2RL_WORKDIR 진단 도구의 기본 tmp 디렉터리. 기본값: /var/tmp/ec2rl
EC2RL_RUNDIR 모든 출력이 저장되는 디렉터리. 기본값: /var/tmp/ec2rl/<date&timestamp>
EC2RL_GATHEREDDIR 수집된 모듈 데이터를 두는 루트 디렉터리. 기본값: /var/tmp/ec2rl/<date&timestamp>/mod_out/gathered/
EC2RL_NET_DRIVER 인스턴스에서 첫 번째, 알파벳순으로 정렬된 비가상 네트워크 인터페이스에 사용 중인 드라이버. 예: xen_netfront, ixgbevf, ena
EC2RL_SUDO EC2Rescue for Linux가 root로 실행 중이면 True, 그렇지 않으면 false.
EC2RL_VIRT_TYPE 인스턴스 메타데이터에서 제공하는 가상화 유형. 예: default-hvm, default-paravirtual
EC2RL_INTERFACES 시스템의 인터페이스 열거 목록. 값은 eth0, eth1 등과 같은 이름을 포함하는 문자열이에요. 이는 functions.bash로 생성되며 그것을 소싱한 모듈에서만 사용할 수 있어요.

YAML 구문 사용

모듈 YAML 파일을 구성할 때 다음 사항에 유의하세요.

  • 삼중 하이픈(---)은 도큐먼트의 명시적 시작을 나타내요.
  • !ec2rlcore.module.Module 태그는 YAML 파서에 데이터 스트림에서 객체를 만들 때 호출할 생성자(constructor)를 알려줘요. 생성자는 module.py 파일 안에서 찾을 수 있어요.
  • !!str 태그는 YAML 파서에 데이터 유형을 결정하려고 하지 말고 내용을 문자열 리터럴로 해석하라고 알려줘요.
  • 파이프 문자(|)는 YAML 파서에 값이 리터럴 스타일 스칼라라고 알려줘요. 이 경우 파서가 모든 공백을 포함해요. 들여쓰기와 줄바꿈 문자가 유지되므로 모듈에 중요해요.
  • YAML 표준 들여쓰기는 두 칸이며 다음 예시에서 볼 수 있어요. 스크립트에 표준 들여쓰기(Python은 네 칸 등)를 유지한 다음 모듈 파일 안에서 전체 내용을 두 칸 들여쓰기하세요.

예시 모듈

예시 1(mod.d/ps.yaml):

--- !ec2rlcore.module.Module
# Module document. Translates directly into an almost-complete Module object
name: !!str ps
path: !!str
version: !!str 1.0
title: !!str Collect output from ps for system analysis
helptext: !!str |
Collect output from ps for system analysis
Requires --times= for number of times to repeat
Requires --period= for time period between repetition
placement: !!str run
package:
- !!str
language: !!str bash
content: !!str |
#!/bin/bash
error_trap()
{
printf "%0.s=" {1..80}
echo -e "\nERROR:\t"$BASH_COMMAND" exited with an error on line ${BASH_LINENO[0]}"
exit 0
}
trap error_trap ERR

# read-in shared function
source functions.bash
echo "I will collect ps output from this $EC2RL_DISTRO box for $times times every $period seconds."
for i in $(seq 1 $times); do
ps auxww
sleep $period
done
constraint:
requires_ec2: !!str False
domain: !!str performance
class: !!str collect
distro: !!str alami ubuntu rhel suse
required: !!str period times
optional: !!str
software: !!str
sudo: !!str False
perfimpact: !!str False
parallelexclusive: !!str

더 알아보기