[Linux] Ansible은 어떻게 IP를 알까? 리눅스의 숨겨진 동작 원리 (hosts, PATH, proc)
Ansible로 Zabbix Agent를 배포하던 중 문득 아주 근본적인 의문이 하나 생겼습니다.
Ansible로 Zabbix Agent를 배포하던 중 문득아주 근본적인 의문이 하나 생겼습니다.
나는 Ansible 인벤토리에 node1이라고만 적고
IP를 적은 적이 없는데,
도대체 어떻게 접속이 되는 거지?
**그저 “되니까 쓴다”가 아니라,**리눅스가 뒤에서 몰래 처리해 주는
‘기본 동작(Default Behavior)‘들****을 파헤쳐 보니 꽤 흥미로운 사실들을 알게 되었습니다.
오늘은 그 내용을 정리해 봅니다.
1. Ansible이 IP 없이 길을 찾는 비결: /etc/nsswitch.conf
처음엔 Ansible이 똑똑해서 알아서 찾는 줄 알았습니다.
하지만 알고 보니 Ansible은 그저리눅스 OS에게 “야, node1 찾아줘”라고 떠넘길 뿐이었습니다.
리눅스 시스템에는**“이름을 어떻게 IP로 바꿀지”**순서를 정해둔 설정 파일이 있습니다.
파일 위치:****/etc/nsswitch.conf
# /etc/nsswitch.conf 내용 중 hosts: files dns
이 한 줄이 핵심입니다.
- files:****/etc/hosts 파일을 제일 먼저 봐라!
- **dns:**거기에 없으면 그때 DNS 서버에 물어봐라!
즉, 내가 Ansible 설정 파일(hosts)에 IP를 안 적었더라도,
리눅스 자체 /etc/hosts 파일에 이미 node1이 등록되어 있었기 때문에****가능한 일이었습니다.
결국**“연결 고리”는 Ansible이 아니라 리눅스 OS의 nsswitch 설정****이었던 것이죠.**
2. 명령어 위치 자동 찾기: PATH 환경변수
소스 컴파일로 Zabbix를 설치하고 나서 실행하려고 하니 이런 에러가 떴습니다.
zabbix_agentd: command not found
분명히 설치했는데 왜 없다고 할까요?
리눅스는 우리가 명령어를 칠 때, 미리 약속된 폴더들(PATH)만 뒤져봅니다.
- /usr/bin
- /usr/local/bin
- … 등등
제가 설치한 경로는 /home/std11/apps/zabbix/sbin 이었으니, 리눅스는 당연히 모르는 겁니다. 그래서**./zabbix_agentd****처럼 “현재 위치에 있다”고 콕 집어줘야 실행이 됩니다.**
3. 하드웨어 정보를 파일인 척 보여주기: /proc
Zabbix Agent는 CPU 사용량이나 메모리 정보를 어떻게 가져갈까요?
리눅스에는가상 파일 시스템이라는 아주 신기한 개념이 있습니다.
**명령어:**ls /proc
이 폴더에 들어가면 숫자나 파일들이 잔뜩 있는데, 이건****실제 하드디스크에 있는 파일이 아닙니다.
**커널(Kernel)이 메모리에 있는 시스템 정보를****마치 파일인 것처럼(Illusion)**보여주는 겁니다.
- /proc/meminfo: 메모리 정보
- /proc/cpuinfo: CPU 정보
Zabbix는 복잡한 시스템 호출을 하는 게 아니라, 그냥이 파일들을 텍스트 읽듯이 읽어서(read) 전송하는 것뿐이었습니다. 리눅스의 “모든 것은 파일이다”라는 철학이 여기서 드러납니다.
4. 확장자는 거들 뿐: 쉐뱅(Shebang, #!)
윈도우는 .exe, .bat 확장자를 보지만 리눅스는파일의 첫 줄을 봅니다.
**이걸****쉐뱅(Shebang)**이라고 부릅니다.
#!/bin/bash echo "Hello"
Ansible Playbook을 짤 때 스크립트 파일 확장자가 없어도, 첫 줄에 #!/bin/bash나 #!/usr/bin/python만 있으면 리눅스가 알아서 해당 언어로 실행해 줍니다.
**“확장자는 장식일 뿐, 본체는 첫 줄이다!”**라는 걸 기억해야 합니다.
5. 친구 코드를 빌려 쓰기: 공유 라이브러리 (.so)
이번에 소스 컴파일(make install)을 하면서 가장 애먹었던 부분입니다.
설치는 잘 됐는데 실행할 때error while loading shared libraries에러가 났습니다.
리눅스 프로그램은 혼자 완벽하게 존재하는 게 아니라, 실행될 때 필요한 부품(라이브러리)을 OS에게 빌려 씁니다. (Windows의 .dll과 비슷)
그런데 제가 std11 계정 전용 폴더에 라이브러리를 설치했으니, OS는 그 위치를 몰랐던 거죠. 이때는LD_LIBRARY_PATH라는 환경변수로 “내 부품은 여기 있어!”라고 알려줘야 합니다.
📝 정리
서버 구축을 하다 보면 “당연히 되는 것”들이 실은리눅스 내부의 치밀한 약속들덕분이라는 걸 알게 됩니다.
- **/etc/hosts & nsswitch:**IP 없이 이름으로 찾아가는 네비게이션
- **PATH:**명령어의 위치를 찾는 지도
- **/proc:**시스템 정보를 파일처럼 보여주는 창문
- **Shared Lib:**실행할 때 코드를 빌려오는 도서관
이 원리를 이해하고 나니, Ansible 스크립트를 짤 때 왜 경로를 절대경로로 써야 하는지,
왜 환경변수를 설정해야 하는지 명확해졌습니다.
이제 이 원리를 바탕으로std11, std12 계정별로 완벽하게 격리된 Zabbix 환경을 구성하러 가봐야겠네요! 🚀
#리눅스******#Linux********#Ansible********#Zabbix********#서버구축********#IT공부********#엔지니어********#TIL********#DevOps**