소개
Ansible 은 예측 가능한 순서로 설정을 찾습니다. 프로젝트 수준의 ansible.cfg는 어떤 셸 세션에서 실행하든 명령을 일관되게 유지할 수 있게 해주므로 매우 중요합니다.
이번 실습에서는 작은 프로젝트를 생성하고, ansible.cfg를 작성하며, 인벤토리 기본값을 정의하고, 공유 변수를 추가한 뒤, 프로젝트 디렉토리에서 첫 번째 Ansible 체크를 실행해 보겠습니다.
최소 프로젝트 및 인벤토리 생성
이 단계에서는 프로젝트 수준의 Ansible 구성을 위해 필요한 디렉토리와 인벤토리 파일을 생성합니다. 이 실습은 깨끗한 VM 에서 시작하므로, 필요한 파일만 직접 생성합니다.
프로젝트 구조를 생성합니다.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,group_vars,playbooks}
이 실습은 프로젝트를 의도적으로 작게 유지합니다. inventory는 관리 대상 호스트 목록을 담고, group_vars는 Ansible 이 자동으로 로드하는 변수를 담으며, playbooks는 추후 자동화 파일을 위해 예약해 둡니다.
프로젝트 디렉토리로 이동합니다.
cd rhce-ansible
로컬 관리 호스트 하나를 포함하는 인벤토리를 생성합니다.
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
EOF
호스트 이름 node1은 별도의 VM 이 아닌 인벤토리 별칭입니다. ansible_connection=local 설정은 Ansible 이 그룹 타겟팅 연습을 가능하게 하면서도, 동일한 RHEL 시스템에서 모듈을 실행하도록 합니다.
프로젝트를 위한 ansible.cfg 작성
이 단계에서는 ansible.cfg를 생성합니다. [defaults] 섹션은 일반적인 동작을 제어합니다. inventory를 설정하면 모든 명령마다 -i inventory/hosts를 입력할 필요가 없습니다.
이 단계의 명령을 실행하기 전에 프로젝트 디렉토리로 돌아가 상대 경로가 Ansible 프로젝트를 참조하도록 합니다.
cd /home/labex/project/rhce-ansible
설정 파일을 작성합니다.
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
remote_user = labex
host_key_checking = False
retry_files_enabled = False
interpreter_python = auto_silent
stdout_callback = default
EOF
각 설정은 반복되는 명령줄 옵션을 하나씩 줄여줍니다. inventory는 정적 인벤토리 파일을 가리키고, remote_user는 기본 로그인 사용자를 설정하며, host_key_checking = False는 실습 환경에서 SSH 호스트 키 프롬프트를 방지하고, interpreter_python = auto_silent는 Ansible 이 시끄러운 경고 없이 Python 을 선택하도록 합니다.
Ansible 이 어떤 설정 파일을 사용 중인지 확인합니다.
ansible --version | sed -n '1,4p'
출력 내용에 config file = /home/labex/project/rhce-ansible/ansible.cfg가 포함되어 있어야 합니다.
이는 중요한 습관입니다. 만약 Ansible 이 다른 설정 파일을 읽고 있다면, 이후의 명령이 실습에서 의도한 것과 다른 인벤토리, 콜백 또는 연결 동작을 사용할 수 있기 때문입니다.
프로젝트 기본값을 통한 인벤토리 검사
이 단계에서는 ansible.cfg가 Ansible 을 인벤토리로 올바르게 안내하는지 테스트합니다. 인벤토리 경로가 설정되어 있으므로 이 명령에는 -i 옵션이 필요하지 않습니다.
이 단계의 명령을 실행하기 전에 프로젝트 디렉토리로 돌아갑니다.
cd /home/labex/project/rhce-ansible
인벤토리 그래프를 표시합니다.
ansible-inventory --graph
그래프에는 managed 그룹과 node1 호스트가 표시되어야 합니다.
그래프 뷰는 Ansible 이 인벤토리를 파싱한 후의 상태를 보여주므로 명령 실행 전에 확인하기 유용합니다. 여기서 그룹이나 호스트가 누락되면 플레이북 타겟에서도 찾을 수 없습니다.
node1의 호스트 변수를 나열합니다.
ansible-inventory --host node1
ansible_connection이 local로 설정된 것을 확인할 수 있습니다.
호스트 뷰는 단순한 인벤토리 라인이 아니라 해석된 호스트 변수를 보여줍니다. 이후 실습에서는 변수가 인벤토리, group_vars, host_vars 중 어디에서 왔는지 문제를 해결할 때 이 명령을 사용합니다.
공유 변수 추가
이 단계에서는 모든 관리 대상 호스트에 대한 변수를 추가합니다. group_vars 아래의 파일은 이름이 인벤토리 그룹이나 all과 일치할 때 자동으로 로드됩니다.
이 단계의 명령을 실행하기 전에 프로젝트 디렉토리로 돌아갑니다.
cd /home/labex/project/rhce-ansible
group_vars/all.yml을 생성합니다. YAML 은 key: value 쌍을 사용합니다. 콜론 뒤에는 공백을 유지하세요.
cat > group_vars/all.yml <<'EOF'
project_owner: labex
baseline_message: Managed by the RHCE Ansible prep project
EOF
파일 이름 all.yml은 특별한 의미를 갖습니다. Ansible 은 이를 모든 인벤토리 호스트에 적용합니다. YAML 형식이므로 들여쓰기와 콜론 뒤의 공백은 파일의 유효성을 결정하는 중요한 요소입니다.
debug 모듈을 사용하여 관리 대상 호스트의 변수 하나를 출력합니다.
ansible managed -m ansible.builtin.debug -a 'var=baseline_message'
출력 내용에 group_vars/all.yml의 메시지가 포함되어야 합니다.
임시 (ad hoc) 명령은 세 부분으로 구성됩니다. managed는 호스트 패턴, -m은 모듈 선택, -a는 모듈 인자 전달입니다. 성공적인 결과는 설정된 인벤토리와 변수 로딩이 정상적으로 작동하고 있음을 증명합니다.
연결성 체크 실행
이 단계에서는 ping 모듈을 실행합니다. 이는 ICMP ping 이 아니라, Ansible 이 대상 호스트에서 Python 을 실행할 수 있는지 확인하는 Ansible 모듈입니다.
이 단계의 명령을 실행하기 전에 프로젝트 디렉토리로 돌아갑니다.
cd /home/labex/project/rhce-ansible
managed 그룹에 대해 체크를 실행합니다.
ansible managed -m ansible.builtin.ping
성공 시 결과에 pong이 포함됩니다.
Ansible 의 ping 모듈은 네트워크 ICMP ping 이 아닌 모듈 실행 테스트입니다. 이는 Ansible 이 호스트에 도달하여 Python 을 시작하고 모듈 결과를 반환할 수 있음을 증명합니다.
임시 명령을 사용하여 작은 증명 파일을 저장합니다. copy 모듈은 대상 경로에 내용을 작성합니다.
ansible managed -m ansible.builtin.copy -a 'content=ansible_cfg_ready dest=/home/labex/project/rhce-ansible/config-check.txt mode=0644'
이 명령이 changed를 보고하면 Ansible 이 파일을 생성하거나 업데이트한 것입니다. 동일한 내용과 모드로 다시 실행하면, 원하는 상태가 이미 존재하므로 결과는 ok가 됩니다.
요약
프로젝트 수준의 ansible.cfg를 생성하고, Ansible 이 설정된 인벤토리를 로드하는지 확인했으며, 공유 변수를 추가하고 임시 모듈 체크를 실행했습니다. 이후 실습에서는 이 반복 가능한 프로젝트 구성을 기반으로 진행하게 됩니다.


