-
[Ansible 101 스터디] 앤서블 1주차 기본 실습 (인벤토리, 플레이북)IT/Ansible 2024. 1. 14. 05:29728x90안녕하세요, 지난 포스팅에 이어서 Ansible 101 스터디 기본 실습을 진행합니다.실습 환경을 위한 노드는 다음과 같이 배포됐습니다.
Node OS vCPUMemoryDiskNIC IP관리자 계정기본 계정serverUbuntu 22.0424GB30GB10.10.1.10root / qwe123ubuntu / qwe123tnode1상동24GB30GB10.10.1.11root / qwe123ubuntu / qwe123tnode2상동24GB30GB10.10.1.12root / qwe123ubuntu / qwe123tnode3상동24GB30GB10.10.1.13root / qwe123ubuntu / qwe1231. 앤서블 접근을 위한 SSH 인증 구성
제어 노드에 접속하여, SSH 키를 생성합니다.
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
그러고 나서 공개키를 관리 노드에 복사합니다.
for i in {1..3}; do ssh-copy-id root@tnode$i; done
키가 복사 됐는지 확인해 봅시다.for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i cat ~/.ssh/authorized_keys; echo; done
해당 명령을 통해서 대상 노드 1 / 2 / 3에 공개키가 복사된 것을 확인할 수 있습니다.
키가 복사되어, ssh로 접근이 가능해졌습니다.
2. 인벤토리를 활용한 자동화 대상 호스트 설정하기
2-1. 인벤토리의 정의
인벤토리란, 텍스트 파일로 관리 호스트 정보를 담고 있습니다.
다음의 명령어를 수행하여, 인벤토리를 생성합니다.
1) IP를 통한 인벤토리 파일 생성
cat <<EOT > inventory 10.10.1.11 10.10.1.12 10.10.1.13 EOT
또한, 다음의 명령어를 수행하여 생성된 인벤토리를 검증할 수 있습니다-i 명령어를 통해서 특정 인벤토리 지정할 수 있습니다.
ansible-inventory -i ./inventory --list | jq
이때, 위와 같이 ip를 설정할 수 있지만, 다음과 같이 대상에 ip가 아니라 호스트명을 넣을 수도 있습니다.
2) 호스트명을 통한 인벤토리 파일 생성
cat <<EOT > inventory tnode1 tnode2 tnode3 EOT
3) 그룹별 호스트 설정
또한 요건에 따라, 아파치 데몬만 리로드 하고 싶고 db 서버에는 리로드 작업이 필요치 않을 경우,
다음과 같이 그룹별 호스트를 지정할 수 있습니다.
하기 예시는 webservers와 db-servers로 구분한 경우입니다.
[webservers] web1.example.com web2.example.com [db-servers] db01.example.com db02.example.com
다음과 같이 인벤토리 그룹을 구성해 봅시다.
cat <<EOT > inventory [web] tnode1 tnode2 [db] tnode3 [all:children] web db EOT
그리고, 생성된 인벤토리는 다음의 두 가지 방법으로 확인합니다.
ansible-inventory -i ./inventory --list | jq ansible-inventory -i ./inventory --graph
또한 기본 구성 파일인 ansible.cfg이 세팅되어 있을 경우, -i를 사용하지 않고도 해당 파일에 정의된 인벤토리의 호스트 정보를 확인할 수 있습니다.
이때, 구성 파일의 적용 순위는 다음과 같습니다.
ANSIBLE_CONFIG(환경 변수)
ansible.cfg(디렉터리당)
~/.ansible.cfg(홈 디렉터리)
/etc/ansible/ansible.cfg(글로벌)
3. 플레이북 작성
프로젝트 디렉터리에 ansible.cfg 파일을 생성해 보겠습니다.
이를 통해서 앤서블에 필요한 내용을 정의하고 설정할 수 있습니다.
cat ~/my-ansible/Easy-Ansible/chapter_05.1/ansible.cfg [defaults] inventory = ./inventory remote_user = root ask_pass = false [privilege_escalation] become = true become_method = sudo become_user = root become_ask_pass = false
기본적인 설정으로 defaults, privilege_escalation 섹션으로 나뉘며 해당 섹션들의 정보는 다음과 같습니다.
[defaults] 섹션 : 앤서블 작업을 위한 기본값 설정매개 변수설명inventory인벤토리 파일의 경로를 지정함.remote_user앤서블이 관리 호스트에 연결할 때 사용하는 사용자 이름을 지정함. 이때, 사용자 이름을 지정하지 않으면 현재 사용자 이름으로 지정됨.ask_passSSH 암호를 묻는 메시지 표시 여부를 지정함. SSH 공개 키 인증을 사용하는 경우 기본값은 false임.[privilege_escalation] 섹션 :보안/감사로 인해 원격 호스트에 권한 없는 사용자 연결 후 관리 액세스 권한을 에스컬레이션하여 루트 사용자로 가져올 때매개 변수설명become기본적으로 권한 에스컬레이션을 활성화할 때 사용하며, 연결 후 관리 호스트에서 자동으로 사용자를 전환할지 여부를 지정함. 일반적으로 root로 전환되며, 플레이북에서도 지정할 수 있음.become_method권한을 에스컬레이션하는 사용자 전환 방식을 의미함. 일반적으로 기본값은 sudo를 사용하며, su는 옵션으로 설정할 수 있음.become_user관리 호스트에서 전환할 사용자를 지정함. 일반적으로 기본값은 root임.become_ask_passbecome_method 매개 변수에 대한 암호를 묻는 메시지 표시 여부를 지정함. 기본값은 false임. 권한을 에스컬레이션하기 위해 사용자가 암호를 입력해야 하는 경우, 구성 파일에 become_ask_pass = true 매개 변수를 설정하면 됨.실습을 위해서 다음과 같이 정의합니다.
cat <<EOT > ansible.cfg [defaults] inventory = ./inventory remote_user = root ask_pass = false [privilege_escalation] become = true become_method = sudo become_user = root become_ask_pass = false EOT
[ad-hoc] ansible ping module 테스트하기
ansible ping 모듈을 통해서 ping 모듈을 이용하여 web 그룹의 호스트로 정상 연결(pong반환)이면 ‘SUCCESS’ 출력해 보겠습니다. (이때 사용되는 ping 모듈은 icmp가 아니라 python 모듈입니다.)
1) web 그룹으로 ping 테스트 시
2) db 그룹으로 ping 테스트 시
3) ask-pass 설정으로 비밀번호 확인 후, ping test
4) 다른 계정으로 접속 시도 시
[ad-hoc] ansible shell module 테스트하기
ansible shell의 경우, 노드들에 명령 구문을 전달하고 해당 결과를 반환하는 모듈입니다.
ansible -m shell -a uptime all ansible -m shell -a "free -h" web ansible -m shell -a "tail -n 3 /etc/passwd" db
3-1. 플레이북의 정의
플레이북은 YAML 포맷으로 작성된 텍스트 파일로,. yml이라는 확장자를 사용하여 저장됩니다.
대상 호스트나 호스트 집합에 수행할 작업을 정의하고 이를 실행합니다.
특정 작업 단위를 수행 시 모듈을 적용합니다. vi 편집기를 통해서 다음의 플레이북들을 생성합니다.
my-ansible/first-playbook.yml
--- - hosts: all tasks: - name: Print message **debug**: **msg**: Hello CloudNet@ Ansible Study
my-ansible/first-playbook-with-error.yml
--- - hosts: all tasks: - name: Print message **debug**: **msg**: Hello CloudNet@ Ansible Study
위와 같이 두 개의 playbook이 있습니다.
두 번째 yaml 파일은 보시다시피 msg의 들여 쓰기가 debug 라인과 같습니다. (의도적인 인덴트 에러)
ansible에서는 문법 체크 기능도 제공하고 있는데요, 다음의 명령어를 수행하여 문법 체크 역시 가능합니다.
결과는 다음과 같습니다.
다음으로, 플레이북을 실행해 봅시다.
명령어는 다음과 같습니다.
ansible-playbook <파일명>
재시작 플레이북 생성하기
my-ansible/restart-service.yml
--- - hosts: all tasks: - name: Restart sshd service ansible.builtin.**service**: name: sshd state: **restarted**
위와 같이 재시작 플레이북을 만들고, 실행하면 위와 다르게 TASK에 changed가 표기됩니다.
해당 내용 로그를 확인하면 다음과 같이 확인 가능합니다.
감사합니다.
728x90반응형'IT > Ansible' 카테고리의 다른 글
[Ansible 101] 핸들러 및 작업 실패 처리 (0) 2024.01.21 [Ansible 101] 조건문 (0) 2024.01.21 [Ansible 101] 반복문 (2) 2024.01.21 [Ansible 101 스터디] 앤서블 1주차 기본 실습 (변수) (6) 2024.01.14 [Ansible 101 스터디] 왜 앤서블인가, 앤서블 소개, 특징 (1) 2024.01.14