Python·SSH로 운영 작업 자동화하기
자동화는 접속에 성공하는 것보다 대상·권한·결과·실패 범위를 관리하는 것이 중요합니다. 조회부터 시작해 반복 가능한 작업으로 발전시킵니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 대상 선정·호스트 검증·명령 실행·결과 판정을 독립된 단계로 설계한다.
- stdout·stderr·종료 상태·시간 초과를 함께 해석한다.
- 부분 성공과 결과 불명 상태에서 재시도 여부를 판단한다.
01대상·연결·작업·결과 저장을 별도 함수로 나누기
- 여러 장비의 반복 작업SSH 자동화는 의 주소·경로 조회와 네트워크 장비의 설정 조회·변경을 여러 대상에 반복하는 구조다.
- 대상·연결이를 대상 목록 읽기, 연결, 명령 선택, 결과 수집, 파일 저장, 종료 단계로 나누면 입력 오류와 원격 실행 오류를 구분할 수 있다.
- 인증장치마다 hostname·종류·인증 방법을 자료로 두고 그 값을 명령 문자열 안에 무조건 이어 붙이지 않는다.
- 대상·명령조회 작업의 결과는 대상 식별자·명령·시각·종료 코드·표준 출력·오류와 연결되어야 한다.
- 출력의 대상 식별화면에 문자열이 보였다는 이유만으로 저장이 완료되었다고 판정하지 않는다.
- 같은 경로에 모두 덮어쓰면 어느 장비의 자료인지 사라지므로 파일명과 기록 구조를 미리 정한다.
- 대상·작업·비밀 분리재사용할 자동화에서는 대상 정보·작업 정의·자격증명을 분리하여 관리한다.
장비 자동화의 메뉴·원격 명령·결과 파일을 한 흐름으로 읽기
사용자 입력을 명령으로 바꾸고 결과를 저장하는 자동화 구조에서 실제 성공의 근거를 구별한다.
실습 구성과 전제
- 흐름도, 장비 설정 메뉴, Jupyter 결과 폴더는 서로 다른 실행 화면이다. 하나의 요청이 모두를 거쳤다고 단정하지 않는다.
- 실습 장비와 검증한 SSH 호스트 키, 최소 권한 인증 키가 준비된 환경을 가정한다. 아래 코드는 조회 전용으로 재구성한다.
대상 선택과 접속·작업 함수를 분리한다
- 흐름도는 메뉴에서 장비 종류와 대상을 선택한 뒤 해당 접속 함수와 작업으로 분기한다. 사용자 입력이 그대로 임의 셸 명령으로 흘러가도록 만들지 않고 허용 작업으로 변환한다.
- 방식과 대화형 네트워크 CLI는 명령 완료를 판단하는 방법이 다르다. 장비 종류에 따라 채널 또는 의 프롬프트 처리를 선택한다.
원본 크기로 보기 ↗
- 메인 메뉴에서 계정·장비 선택으로 분기하고 Cisco·Rocky·Ubuntu 등 대상 종류가 나뉜다.
- connect 함수와 설정 백업·invoke_shell 같은 작업 연결이 표현되어 있다.
확인 기준대상·인증·작업·저장 책임을 별도 함수로 나누고, 실패가 어느 단계에서 났는지 결과에 남긴다.
설정 문장 생성과 장비 적용을 구별한다
- 메뉴 사진은 입력을 받아 Cisco 설정 문장으로 바꾸고 장비 프롬프트와 완료 메시지를 출력한다. 입력값 검증과 명령 구성의 연결을 보여 준다.
- 프로그램이 찍은 적용 완료 문자열은 코드에서 정한 표시다. 응답, 실행 후 구성 조회, 실제 할당까지 확인해야 목적한 동작을 입증할 수 있다.
원본 크기로 보기 ↗- 사용자가 DHCP 관련 값을 입력하는 메뉴와 생성된 설정 문장이 보인다.
- 장비 CLI 프롬프트와 프로그램의 적용 완료 메시지가 이어지지만 실제 클라이언트 임대 결과는 이 화면에 없다.
확인 기준설정 성공 판정을 마지막 print문에 맡기지 않는다. 읽기 전용 사후 조회를 작업별로 정해 기대 상태와 비교한다.
SSH 조회의 출력과 종료 상태를 함께 수집한다
- 재구성 코드는 사전에 등록된 호스트 키를 확인하고 작은 조회 명령을 실행한다. stdout·stderr·종료 상태를 별도 값으로 보관해 명령 실패를 정상 자료와 구분한다.
- 큰 출력이나 대화형 세션은 채널 버퍼와 완료 판정 방식이 다르므로 아래 짧은 조회 예시를 그대로 확장하지 않는다. 접속 실패와 실행 후 연결 끊김도 별도 상태로 남겨야 한다.
from pathlib import Path import paramiko client = paramiko.SSHClient() client.load_system_host_keys() try: client.connect("192.0.2.30", username="labuser", key_filename=str(Path.home() / ".ssh" / "lab_ed25519"), timeout=5, auth_timeout=5, banner_timeout=5) stdin, stdout, stderr = client.exec_command("ip -brief address", timeout=10) out = stdout.read().decode("utf-8", errors="replace") err = stderr.read().decode("utf-8", errors="replace") rc = stdout.channel.recv_exit_status() print({"returncode": rc, "stdout": out, "stderr": err}) finally: client.close()준비된 키·를 사용하는 짧은 조회 재구성 예시다. 출력이 큰 작업에는 stdout·stderr를 함께 계속 소비하는 별도 수집기가 필요하다.
확인 기준rc=0은 해당 명령이 보고한 성공이다. 기대한 주소·인터페이스가 출력되는지까지 검증하고, 연결 끊김 뒤 결과가 불명확하면 설정 작업을 무조건 재시도하지 않는다.
결과 파일은 대상·시각·작업을 식별하게 저장한다
- Jupyter 화면에는 OS별 폴더 아래 ip_a·ip_r 같은 조회 결과 파일이 보인다. 파일이 만들어진 사실과 파일 내용이 유효한 결과라는 사실은 다르다.
- 대상 식별자, 수집 시각, 실행 명령, 종료 상태를 함께 저장하면 나중에 주소와 경로를 비교할 때 어떤 시스템의 관찰인지 복원할 수 있다.
원본 크기로 보기 ↗- Jupyter의 files/os/rocky/ 경로에 결과 파일들이 보인다.
- ip_a와 ip_r처럼 조회 작업을 구별하는 파일명이 나열된다.
확인 기준빈 파일·오류 문자열·다른 장비 결과 덮어쓰기를 구분한다. 공개 문서로 옮길 때 자격 정보와 민감 설정은 제외한다.
실습에서 확인한 동작 원리
- 자동화는 명령 전송만이 아니라 입력 검증·접속 신뢰·실행 결과 판정·근거 저장까지 연결하는 작업이다.
- CLI 프롬프트나 완료 문구 대신 종료 상태와 사후 조회로 실제 적용 결과를 확인한다.
설정·출력 추가로 확인하기 15장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 7장
원본 크기로 보기 ↗- 「/ 는 뭐냐?」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「/ 는 뭐냐?」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「/ 는 뭐냐?」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「scapy - 패킷을 만들 수 있는 애」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「scapy - 패킷을 만들 수 있는 애」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「/ 는 뭐냐?」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「/ 는 뭐냐?」 문맥에 삽입된 원본 코드와 실행 결과이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 1장
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. Scapy의 show_interfaces()에서 인터페이스의 MAC·IPv4·IPv6 주소를 읽고 conf.iface로 선택된 인터페이스를 조회한 화면이다.
실습 화면 묶음 03 2장
원본 크기로 보기 ↗- 수업 원본 자료 · 주소·SSH 서비스·리스닝 포트·로그인 허용 설정. 원문에서 「a. ip 동작 확인」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 주소·SSH 서비스·리스닝 포트·로그인 허용 설정. 원문에서 「e. root 계정 로그인 허용 여부 확인」에 배치된 그림 또는 화면이다.
실습 화면 묶음 04 3장
원본 크기로 보기 ↗- 수업 원본 캡처 · SSH 자동화 노트의 STATIC NAT 설정 절에 있는 40×51픽셀 화면 조각이다. 원본 크기가 작아 이 그림만으로 구체적인 출력 값을 판독하기 어렵다.
원본 크기로 보기 ↗- 수업 원본 자료 · 원격 장비 접근과 네트워크 정보 수집 자동화. 원문에서 「리눅스 OS ip, 게이트웨이 정보 백업」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 원격 장비 접근과 네트워크 정보 수집 자동화. 원문에서 「팀 랩 토폴로지」에 배치된 그림 또는 화면이다.
실습 화면 묶음 05 1장
원본 크기로 보기 ↗- 「문제 2 ) 주피터 - 네트워크 격리되어있음 (아니었음)」 문맥에 삽입된 원본 코드와 실행 결과이다. Python·SSH로 운영 작업 자동화하기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 06 1장
원본 크기로 보기 ↗- 수업 원본 자료 · 제어 프로그램과 원격 네트워크 장비의 연결. 원문에서 「랩 토폴로지」에 배치된 그림 또는 화면이다.
02Paramiko의 SSHClient·Transport·Channel
- 는 서버 키 검증과 인증·채널 생성을 다루는 고수준 객체다.
- 명령 채널·세 스트림내부 SSH 전송 연결 위에서 exec_command가 새 채널을 열어 명령을 요청하고 stdin·stdout·stderr를 파일과 비슷한 객체로 반환한다.
- 프롬프트invoke_shell은 대화형 터미널 채널을 만들어 프롬프트·모드 전환을 주고받는 방식이라 단일 명령 요청과 제어 흐름이 다르다.
- load_system_host_keys 또는 지정 파일로 이미 검증한 서버 키를 불러오고 기본 RejectPolicy로 모르는 서버를 거부하는 구성은 접속 대상 확인을 유지한다.
- AutoAddPolicyAutoAddPolicy는 새로운 키를 자동 신뢰하는 정책이지 키 교환 알고리즘 오류를 해결하는 기능이 아니다.
- 인증사용자의 개인키 또는 agent 인증과 서버 host key의 신뢰는 별도로 준비한다.
import paramiko
with paramiko.SSHClient() as client:
client.load_system_host_keys()
client.connect("server.example", username="observer",
timeout=5, banner_timeout=5, auth_timeout=5)
stdin, stdout, stderr = client.exec_command("uname -s", timeout=5)
stdin.close()
out = stdout.read().decode("utf-8", errors="replace")
err = stderr.read().decode("utf-8", errors="replace")
status = stdout.channel.recv_exit_status()
print({"rc": status, "stdout": out.strip(), "stderr": err.strip()})교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
03출력 스트림·종료 상태·timeout의 실제 의미
- 작은 출력 예제의 전제위 코드는 uname -s처럼 출력이 작고 종료하는 고정 조회 명령을 가정한다.
- stdout·stderr일반 대용량 작업에서 stdout을 다 읽은 뒤 stderr를 읽거나 출력이 남은 채 종료 상태부터 기다리면 SSH 채널의 흐름 제어와 버퍼 때문에 막힐 수 있다.
- 출력 크기의 전제그런 작업은 두 스트림을 함께 비우고 전체 기한과 최대 출력량을 정하는 수집 구조가 필요하다.
- 예제 하나를 임의 명령 실행기로 확장하면 이 전제가 사라진다.
- rc=0rc=0은 그 프로그램의 성공 관례이며 출력이 비었다고 실패도 성공도 자동 판정할 수 없다.
- 반대로 stderr에 경고가 있어도 rc는 성공일 수 있다.
- timeout접속 timeout, SSH banner timeout, 인증 timeout, 명령 채널 timeout은 기다리는 단계가 다르다.
- bytesbytes를 디코딩할 때 replace는 깨진 바이트가 있었다는 표시를 남기는 선택이며 정확한 바이너리 자료의 보존은 원본 bytes를 따로 유지해야 한다.
04SSH 채널의 수신 창과 종료 대기의 관계
- 채널별 흐름 제어SSH Transport 안의 각 Channel은 독립된 흐름 제어 창을 가진다. 한 채널의 출력을 읽지 않아 창이 차면 원격 측이 그 채널에 더 보내지 못할 수 있다.
- 프로그램의 출력 대기원격 프로그램이 출력 전송에서 막히면 아직 종료하지 못한다. 클라이언트가 종료 상태만 기다리는 동시에 출력을 읽지 않으면 서로 기다리는 상태를 만들 수 있다.
- stdout·stderr 수집두 스트림이 있는 채널에서는 어느 한쪽만 비우는 수집기를 피한다. 준비된 스트림을 계속 소비하거나 적절한 동시 읽기 구조를 사용하여 출력 생산을 막지 않는다.
- 준비와 recv_ready가 False라는 것은 지금 읽을 데이터가 없다는 뜻이며 채널 종료와 같지 않다. 명령 완료·스트림 종료·남은 출력 소비를 각각 판단한다.
- recv_exit_status는 서버가 종료 상태를 제공하지 않으면 -1을 돌려줄 수 있다. 이를 원격 프로그램이 실제로 exit(-1)을 실행했다고 단정하지 않는다.
05세 장비의 성공·명령 실패·결과 불명 분리
- A의 결과가상 대상 A는 조회 요청 뒤 stdout과 종료 코드 0을 반환했다. 기대한 출력 형식까지 맞으면 이 조회의 성공으로 기록한다.
- B의 결과B는 명령 채널이 열렸지만 프로그램이 종료 코드 2와 오류 설명을 반환했다. 코드 2의 구체 의미는 해당 프로그램의 규약을 읽으며 SSH 인증 실패로 분류하지 않는다.
- C의 결과C는 변경 요청을 보낸 뒤 연결이 끊겨 종료 상태를 얻지 못했다. 변경이 미실행인지 이미 완료됐는지 모르므로 결과 불명으로 남긴다.
- 집계대상 3개를 처리했다고 성공률 100%로 보고하지 않는다. 이 사례의 명시적 결과는 성공 1개·명령 실패 1개·결과 불명 1개이며 C는 상태 조회가 필요하다.
- 재실행 선택A의 동일한 변경을 무조건 반복하지 않고 B의 원인과 C의 실제 상태를 먼저 분리한다. 전체 예외 처리에서 처음 두 대상의 기록을 잃지 않도록 대상별 결과를 저장한다.
| 대상 | 관찰 | 분류 |
|---|---|---|
| A | 정상 출력·rc=0 | 조회 성공 |
| B | stderr·rc=2 | 명령 실패 |
| C | 요청 후 연결 단절·rc 없음 | 결과 불명 |
06멈춘 수집기의 대기 경계 좁히기
- 출력량과 재현작은 조회는 끝나는데 큰 출력에서 멈추면 과 두 스트림 소비 순서를 조사한다. timeout을 늘리는 것만으로 잘못된 수집 순서를 고칠 수는 없다.
- 전체 기한개별 read timeout은 전체 작업에 걸리는 최대 시간을 자동 보장하지 않는다. 반복 읽기마다 조금씩 자료가 오면 작업이 계속될 수 있어 전체 마감 시각도 따로 둔다.
- 최대 보관량모든 출력을 메모리에 누적하면 대상 수와 출력량에 비례해 메모리를 쓴다. 저장·잘림 여부·원래 바이트 수를 구분하고 한도를 넘은 결과를 완전한 백업으로 표시하지 않는다.
- PTY 차이PTY를 요청한 세션은 stderr가 별도 스트림으로 보이지 않거나 터미널 제어 문자가 섞일 수 있다. 일반 출력 파서와 대화형 장비 CLI 파서를 같은 규칙으로 처리하지 않는다.
- 종료와 연결 정리채널 결과를 수집한 뒤 Channel· 수명을 명시적으로 끝낸다. 객체가 언젠가 수거될 것이라는 기대만으로 많은 대상의 연결 자원을 관리하지 않는다.
07Netmiko가 네트워크 장비 CLI에 더하는 처리
- 장비 CLI의 모드네트워크 OS CLI는 명령 실행과 달리 사용자·특권·설정 모드, 프롬프트, 화면 페이지 분할이 있다.
- 는 장비 종류별로 이런 터미널 동작을 처리하는 연결 기능을 제공한다.
- ·명령는 조회 명령의 출력과 종료 프롬프트를 기다리고 send_config_set은 설정 모드에서 여러 명령을 적용하는 용도다.
- 조회와 두 호출을 같은 단순 문자열 전송으로 취급하면 모드와 실패 검출을 놓칠 수 있다.
- 대상·인증device_type은 선택, host는 접속 대상, 인증값은 로그인에 사용된다.
- 호스트 키 검증 정책운영 구조에서는 ssh_strict와 호스트키 자료 등 연결 신뢰 정책을 명시한다.
- 반환과 명령이 반환됐어도 출력에 Invalid input 같은 가 있을 수 있어 결과를 파싱하고 실제 running 상태를 다시 조회한다.
- running-config 변경과 startup-config 저장도 별도 작업이며 장비·플랫폼에 맞는 저장 절차가 필요하다.
08subprocess의 인자 목록과 셸 문자열
- subprocess로컬 프로그램을 실행할 때 subprocess.run에 인자 목록을 주면 각 요소를 별도 인자로 전달한다.
- shell=Trueshell=True로 문자열을 전달하면 셸이 파이프··명령 치환 등을 해석한다.
- 사용자 입력사용자 입력이 셸 문법이 되는 위험을 줄이려면 가능한 한 목록과 고정 실행 파일을 사용한다.
- 하지만 exec_command의 원격 문자열은 원격 셸에서 해석될 수 있으므로 로컬 목록 방식의 보장을 그대로 적용할 수 없다.
- timeoutcapture_output은 출력·오류를 모으고 text는 텍스트 디코딩, timeout은 대기 기한, check=True는 0이 아닌 종료 상태에서 CalledProcessError를 발생시키는 선택이다.
- 잘못된 실행 파일 경로, 시간 초과, 프로그램의 실패 종료는 서로 다른 예외다.
- 고정 작업·반환 구조아래처럼 조회 명령을 고정하고 반환 구조를 읽는 부분을 먼저 만들면 이후 변경 자동화에서 실패 의미를 보존하기 쉽다.
import subprocess
result = subprocess.run(
["ip", "-brief", "address"],
capture_output=True, text=True, timeout=5, check=True,
)
print(result.stdout)교육용 예시. 실제 원격 접속·설정 변경·배포는 실행하지 않았다.
09반복 실행과 부분 성공을 상태로 관리하기
- 부분 적용과 원복여러 서버 중 세 번째에서 실패했다고 첫 두 서버의 변경까지 자동으로 되돌아가지는 않는다.
- 대상별 부분 성공대상별 성공·실패와 이전 상태를 기록하고 다시 실행할 때 필요한 작업만 적용할 수 있어야 한다.
- 중복 변경의 누적파일 끝에 설정 줄을 계속 붙이는 스크립트는 반복할수록 중복되지만 현재 설정과 원하는 값을 비교해 바꾸는 작업은 수렴할 수 있다.
- 자동화의 속도보다 상태 전환의 정의가 먼저다.
- 검증·작은 배치입력 형식 검증, 읽기 전용 사전 조회, 작은 대상 배치, 결과 비교를 함수 경계로 나누고 비밀값은 코드·예외·출력 파일에 남기지 않는다.
- 응답 유실 후 상태 조회원격 응답을 잃은 경우 실제 명령이 실행됐는지 모를 수 있으므로 무조건 재시도하지 않고 상태를 조회한다.
- 상태 관리 도구이런 반복 가능한 상태 관리가 커질 때 모듈과 선언적 관리 방식으로 넘어갈 이유가 생긴다.
10동시 실행과 재시도
- 연결·대상동시 연결 수와 요청 속도를 제한해 대상 장비에 부하가 몰리지 않게 한다.
- 재시도는 일시 실패에 한정하고 최대 횟수와 간격을 정한다.
- 멱등하지 않은 변경은 중복 수행을 막을 식별자나 확인 절차가 필요하다.
import subprocess
import sys
result = subprocess.run(
[sys.executable, "--version"],
capture_output=True, text=True, timeout=5, check=True,
)
print(result.stdout.strip())현재 실행 파일의 버전만 별도 로 조회한다. 원격 접속이나 환경 변경은 하지 않는다.
11원격 조회 한 건의 생애
- 대상인벤토리에서 승인된 대상 한 대와 읽기 전용 작업을 선택했다고 가정한다.
- 연결·대상먼저 연결 대상의 이름·주소·포트와 자격 증명 공급 경로를 분리해 준비하고 신뢰한 호스트 키로 서버를 검증한다.
- 인증·명령 뒤 명령 채널을 열어 조회 요청을 보내고 표준 출력·표준 오류·종료 상태를 수집한다.
- 연결·명령·자료 유효성연결 성공은 이 과정의 중간 결과이며 실제 명령 성공과 출력 자료의 유효성은 뒤에서 판단해야 한다.
- stdout출력에 성공이라는 문자가 있거나 stdout이 비어 있지 않다는 이유만으로 성공 처리하면 안 된다.
- 반대로 stderr에 경고가 있다고 항상 실패인 것도 아니므로 종료 상태와 프로그램의 계약을 함께 해석한다.
- 명령·프롬프트네트워크 장비는 일반적인 Unix 와 같은 종료 코드를 제공하지 않을 수 있어 명령 오류 문구·프롬프트·구조화된 응답 규칙이 필요하다.
- ·명령의 명령 채널과 의 장비 CLI 처리 역할을 구분하고, 양쪽에서 발생하는 부분 출력과 시간 초과도 별도 상태로 기록한다.
- 대상 검증·인증호스트 키와 을 확인한다.
- 명령 채널 요청검증한 조회 작업을 요청한다.
- 원격 실행대상 환경과 계정 권한으로 명령이 실행된다.
- 출력과 종료 상태stdout·stderr·종료 상태 또는 연결 실패를 수집한다.
- 구조화 기록대상·시각·판정·필요한 출력만 저장한다.
설명과 함께 보는 보조 도식
SSH 조회의 결과를 끝까지 확인하기
실제 접속을 수행하지 않는 설계 예시다. 대상별 결과를 독립적으로 기록한다.
대상 검증·인증
호스트 키와 사용자 인증을 확인한다.
- 연결 성공
- 명령 성공은 아직 모름
전체 단계를 한 번에 읽기
- 01
대상 검증·인증
호스트 키와 사용자 인증을 확인한다.
- 연결 성공
- 명령 성공은 아직 모름
- 02
명령 채널 요청
검증한 조회 작업을 요청한다.
- 관리 항목
- 시간 제한·작업 식별자
- 03
원격 실행
대상 환경과 계정 권한으로 명령이 실행된다.
- 차이
- 대화형 셸과 환경이 다를 수 있음
- 04
출력과 종료 상태
stdout·stderr·종료 상태 또는 연결 실패를 수집한다.
- 결과
- 성공·실패·불명 구분
- 05
구조화 기록
대상·시각·판정·필요한 출력만 저장한다.
- 마지막 작업
- 채널·연결 정리
12부분 성공과 결과 불명을 처리하기
- 변경 결과 불명설정 변경을 요청한 뒤 응답 전에 연결이 끊기면 변경이 적용되지 않았는지, 적용됐지만 응답만 유실됐는지 알 수 없을 수 있다.
- 이 상태를 실패로 뭉뚱그려 같은 변경을 즉시 반복하면 사용자나 규칙이 중복 생성될 수 있다.
- 결과 불명의 재확인가능한 경우 현재 상태를 다시 조회해 원하는 상태와 비교하고, 작업 식별자나 멱등한 연산으로 반복의 영향을 제한한다.
- 부분 실패와 전체 판정조회 자동화에서도 일부 장비 실패와 전체 작업 실패를 구분해야 성공한 결과를 보존할 수 있다.
- 연결·출력·시간 제한연결 수와 출력량을 제한하고 네트워크 연결·인증·명령 실행 시간 제한의 범위를 나눈다.
- 출력 버퍼출력 버퍼를 비우지 않은 채 종료만 기다리면 큰 출력에서 멈출 수 있는 도구도 있으므로 해당 라이브러리의 수집 방식을 따른다.
- subprocess·shell=Falsesubprocess의 shell=False는 로컬 셸 해석을 피하는 데 도움이 되지만 원격 명령 문자열의 해석까지 바꾸지 않는다.
- 입력 경계·자원 종료신뢰할 수 없는 입력을 명령에 끼워 넣지 말고 고정 작업과 검증된 인수를 사용하며 모든 종료 경로에서 연결 자원을 닫는다.
| 구성·관찰 대상 | 확인하는 값 | 구분할 문제 |
|---|---|---|
| 대상·키 | 인벤토리와 신뢰 정보 | 잘못된 장비·호스트 키 변경 |
| 채널·명령 | 실행 계정·환경·입력 | 연결됐지만 작업은 실패 |
| 출력·종료 | stdout·stderr·상태·타임아웃 | 경고·실패·결과 불명 |
| 재시도 | 현재 상태·멱등성 | 이미 적용된 변경의 반복 |
이해했는지 확인하기
- 자동화 대상·작업·자격 증명을 분리한다.
- 호스트 키·종료 상태·표준 오류·시간 초과를 확인한다.
- 부분 성공과 재시도의 중복 영향을 처리한다.