JavaScript is required to for searching.
탐색 링크 건너뛰기
인쇄 보기 종료
Oracle® ZFS Storage Appliance 관리 설명서
Oracle 기술 네트워크
라이브러리
PDF
인쇄 보기
피드백
search filter icon
search icon

문서 정보

이 설명서 사용

 1 Oracle ZFS Storage Appliance 개요

 2 상태

 3 초기 구성

 4 네트워크 구성

 5 스토리지 구성

 6 SAN(Storage Area Network) 구성

 7 사용자 구성

 8 ZFSSA 환경 설정

 9 경보 구성

 10 클러스터 구성

 11 ZFSSA 서비스

 12 공유, 프로젝트 및 스키마

 13 복제

 14 섀도우 마이그레이션

 15 CLI 스크립트 작성

액세스 자동화

명령 일괄 처리

명령 스크립트 작성

스크립트 환경

시스템과 상호 작용

run 함수

get 함수

list 함수

children 함수

choices 함수

출력 생성

오류 처리

 16 유지 관리 워크플로우

 17 통합

색인

시스템과 상호 작용

물론, 시스템 전체와 상호 작용할 수 없는 스크립트는 활용도가 떨어집니다. 스크립트가 시스템과 상호 작용할 수 있게 하는 내장 함수가 많이 있습니다.

표 15-1  시스템 상호 작용을 지원하는 내장 함수
함수
설명
get
지정된 등록 정보의 값을 가져옵니다. 이 함수는 고유한 형식(예: 날짜는 Date 객체로 반환됨)으로 값을 반환합니다.
list
현재 컨텍스트의 동적 자식 항목에 해당하는 토큰 어레이를 반환합니다.
run
셸의 지정 명령을 실행하여 모든 출력을 문자열로 반환합니다. 출력에 여러 행이 포함된 경우 반환되는 문자열에 내장된 개행이 포함됩니다.
props
현재 노드의 등록 정보 이름 어레이를 반환합니다.
set
지정된 등록 정보를 지정된 값으로 설정하며 두 문자열 인수를 사용합니다.
choicies
값 세트가 확인되고 열거 가능한 등록 정보에 대해 유효한 등록 정보 값 어레이를 반환합니다.

run 함수

스크립트가 대형 시스템과 상호 작용하는 가장 간단한 방법은 "run" 함수를 사용하는 것입니다. 이 함수는 실행할 명령을 사용하고 해당 명령의 출력을 문자열로 반환합니다. 예를 들어, 다음과 같습니다.

dory:> configuration version script dump(run('get boot_time'))
'                     boot_time = 2009-10-12 07:02:17\n'

내장 dump 함수는 내장된 개행을 확장하지 않고 인수를 외부로 덤프합니다. ECMAScript의 문자열 처리 기능을 사용하여 출력을 분할할 수 있습니다. 예를 들어, 공백으로 위를 분할하면 다음과 같습니다.

dory:> configuration version script dump(run('get boot_time').split(/\s+/))
['', 'boot_time', '=', '2009-10-12', '07:02:17', '']

get 함수

run 함수는 충분히 강력하므로 출력 구문 분석에 전적으로 의존하여 시스템에 대한 정보를 가져오려고 할 수도 있습니다. 그러나 이렇게 하면 앞으로 변경되거나 변경되지 않을 수 있으며 사람이 읽을 수 있는 출력을 구문 분석하는 스크립트가 남는다는 명확한 단점이 있습니다. 시스템에 대한 정보를 보다 강력하게 수집하려면 내장 "get" 함수를 사용합니다. boot_time 등록 정보의 경우 이는 문자열 대신 ECMAScript Date 객체를 반환하여 등록 정보 값을 프로그래밍적으로 조작할 수 있게 됩니다. 예를 들어, boot_time 등록 정보를 현재 시간과 함께 사용하여 부트 이후 경과한 시간을 확인할 수 있습니다.

script
       run('configuration version');
       now = new Date();
       uptime = (now.valueOf() - get('boot_time').valueOf()) / 1000; 
       printf('up %d day%s, %d hour%s, %d minute%s, %d second%s\n',
           d = uptime / 86400, d < 1 || d >= 2 ? 's' : '',
           h = (uptime / 3600) % 24, h < 1 || h >= 2 ? 's': '',
           m = (uptime / 60) % 60, m < 1 || m >= 2 ? 's': '',
           s = uptime % 60, s < 1 || s >= 2 ? 's': '');

위를 "uptime.aksh"로 저장하면 다음과 같이 실행할 수 있습니다.

% ssh root@dory < uptime.aksh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: 
up 2 days, 10 hours, 47 minutes, 48 seconds

의사 단말기 할당에 대한 메시지는 SSH 클라이언트 때문입니다. 이 메시지가 나타내는 문제는 SSH에 "-T" 옵션을 지정하여 처리할 수 있습니다.

list 함수

동적 자식 항목이 있는 컨텍스트에서는 이러한 자식 항목을 프로그래밍적으로 반복하면 매우 유용할 수 있습니다. 이렇게 하려면 동적 자식 항목 어레이를 반환하는 list 함수를 사용합니다. 예를 들어, 다음은 소비한 공간과 사용 가능한 공간을 인쇄하며 모든 프로젝트의 모든 공유를 반복하는 스크립트입니다.

script
       run('shares');
       projects = list();

       for (i = 0; i < projects.length; i++) {
               run('select ' + projects[i]);
               shares = list();

               for (j = 0; j < shares.length; j++) {
                       run('select ' + shares[j]);
                       printf("%s/%s %1.64g %1.64g\n", projects[i], shares[j],
                           get('space_data'), get('space_available'));
                       run('cd ..');
               }

               run('cd ..');
       }

이름이 "space.aksh"인 파일에 저장된 경우 스크립트를 실행하면 출력이 다음과 같습니다.

% ssh root@koi < space.aksh
Password: 
admin/accounts 18432 266617007104
admin/exports 18432 266617007104
admin/primary 18432 266617007104
admin/traffic 18432 266617007104
admin/workflow 18432 266617007104
aleventhal/hw_eng 18432 266617007104
bcantrill/analytx 1073964032 266617007104
bgregg/dashbd 18432 266617007104
bgregg/filesys01 26112 107374156288
bpijewski/access_ctrl 18432 266617007104
...

이 출력의 "출력 꾸미기"(프로그래밍적으로 처리하기가 더 어려움) 변형을 원하는 경우 get 명령의 출력을 직접 구문 분석합니다.

script
       run('shares');
       projects = list();

       printf('%-40s %-10s %-10s\n', 'SHARE', 'USED', 'AVAILABLE');

       for (i = 0; i < projects.length; i++) {
               run('select ' + projects[i]);
               shares = list();

               for (j = 0; j < shares.length; j++) {
                       run('select ' + shares[j]);

                       share = projects[i] + '/' + shares[j];
                       used = run('get space_data').split(/\s+/)[3];
                       avail = run('get space_available').split(/\s+/)[3];

                       printf('%-40s %-10s %-10s\n', share, used, avail);
                       run('cd ..');
               }

               run('cd ..');
       }

이름이 "prettyspace.aksh"인 이 새 스크립트를 실행하면 일부 출력이 다음과 같습니다.

% ssh root@koi < prettyspace.aksh
Password:
SHARE                                    USED       AVAILABLE 
admin/accounts                           18K        248G      
admin/exports                            18K        248G      
admin/primary                            18K        248G      
admin/traffic                            18K        248G      
admin/workflow                           18K        248G      
aleventhal/hw_eng                        18K        248G      
bcantrill/analytx                        1.00G      248G      
bgregg/dashbd                            18K        248G       
bgregg/filesys01                         25.5K      100G      
bpijewski/access_ctrl                    18K        248G      
...

children 함수

정적 자식 항목이 있는 컨텍스트에서도 이러한 자식 항목을 프로그래밍적으로 반복하면 유용할 수 있습니다. 이렇게 하려면 정적 자식 항목 어레이를 반환하는 children 함수를 사용합니다. 예를 들어, 다음은 서비스 상태를 인쇄하며 모든 서비스를 반복하는 스크립트입니다.

configuration services
script
       var svcs = children();
       for (var i = 0; i < svcs.length; ++i) {
                run(svcs[i]);
                try {
                        printf("%-10s %s\n", svcs[i], get('<status>'));
                } catch (err) { }
                run("done");
       }

이름이 "svcinfo.aksh"인 파일에 저장된 경우 스크립트를 실행하면 출력이 다음과 같습니다.

% ssh root@koi < space.aksh
Password: 
cifs       disabled
dns        online
ftp        disabled
http       disabled
identity   online
idmap      online
ipmp       online
iscsi      online
ldap       disabled
ndmp       online
nfs        online
nis        online
ntp        online
scrk       online
sftp       disabled
smtp       online
snmp       disabled
ssh        online
tags       online
vscan      disabled

choices 함수

choices 함수는 값 세트가 확인되고 열거 가능한 등록 정보에 대해 유효한 등록 정보 값 어레이를 반환합니다. 예를 들어, 다음 스크립트는 choices 함수를 사용하여 shares 노드에서 모든 풀 목록을 검색한 후 모든 풀을 반복하여 사용 가능한 공간과 함께 프로젝트 및 공유를 나열합니다.

fmt = '%-40s %-15s %-15s\n';
printf(fmt, 'SHARE', 'USED', 'AVAILABLE');
run('cd /');
run('shares');
pools = choices('pool');
for (p = 0; p < pools.length; p++) {
        set('pool', pools[p]);
        projects = list();
        for (i = 0; i < projects.length; i++) {
                run('select ' + projects[i]);
                shares = list();
                for (j = 0; j < shares.length; j++) {
                        run('select ' + shares[j]);
                        share = pools[p] + ':' + projects[i] + '/' + shares[j];
                        printf(fmt, share, get('space_data'),
                            get('space_available'));
                        run('cd ..');
                }
                run('cd ..');
        }
}

다음은 스크립트 실행 출력입니다.

SHARE                                    USED            AVAILABLE     
pond:projectA/fs1                        31744           566196178944  
pond:projectA/fs2                        31744           566196178944  
pond:projectB/lun1                       21474836480     587670999040  
puddle:deptA/share1                      238475          467539219283
puddle:deptB/share1                      129564          467539219283
puddle:deptB/share2                      19283747        467539219283