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×tamp> |
| EC2RL_GATHEREDDIR | 수집된 모듈 데이터를 두는 루트 디렉터리. 기본값: /var/tmp/ec2rl/<date×tamp>/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