Node
|
OS
|
vCPU
|
Memory
|
Disk
|
NIC IP
|
관리자 계정
|
기본 계정
|
server
|
Ubuntu 22.04
|
2
|
4GB
|
30GB
|
10.10.1.10
|
root / qwe123
|
ubuntu / qwe123
|
tnode1
|
상동
|
2
|
4GB
|
30GB
|
10.10.1.11
|
root / qwe123
|
ubuntu / qwe123
|
tnode2
|
상동
|
2
|
4GB
|
30GB
|
10.10.1.12
|
root / qwe123
|
ubuntu / qwe123
|
tnode3
|
상동
|
2
|
4GB
|
30GB
|
10.10.1.13
|
root / qwe123
|
ubuntu / qwe123
|
1. 앤서블 접근을 위한 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 섹션으로 나뉘며 해당 섹션들의 정보는 다음과 같습니다.
매개 변수
|
설명
|
inventory
|
인벤토리 파일의 경로를 지정함.
|
remote_user
|
앤서블이 관리 호스트에 연결할 때 사용하는 사용자 이름을 지정함. 이때, 사용자 이름을 지정하지 않으면 현재 사용자 이름으로 지정됨.
|
ask_pass
|
SSH 암호를 묻는 메시지 표시 여부를 지정함. SSH 공개 키 인증을 사용하는 경우 기본값은 false임.
|
매개 변수
|
설명
|
become
|
기본적으로 권한 에스컬레이션을 활성화할 때 사용하며, 연결 후 관리 호스트에서 자동으로 사용자를 전환할지 여부를 지정함. 일반적으로 root로 전환되며, 플레이북에서도 지정할 수 있음.
|
become_method
|
권한을 에스컬레이션하는 사용자 전환 방식을 의미함. 일반적으로 기본값은 sudo를 사용하며, su는 옵션으로 설정할 수 있음.
|
become_user
|
관리 호스트에서 전환할 사용자를 지정함. 일반적으로 기본값은 root임.
|
become_ask_pass
|
become_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가 표기됩니다.
해당 내용 로그를 확인하면 다음과 같이 확인 가능합니다.
감사합니다.
'DevOps > 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 |