카이도스의 Tech Blog

Ansible 기본1(설치 후 기본 활용) 본문

Ansible

Ansible 기본1(설치 후 기본 활용)

카이도스 2024. 3. 11. 02:37
728x90
반응형

2024.03.26 - [Ansible] - Ansible 기본2(변수)

 

Ansible 기본2(변수)

2024.03.11 - [Ansible] - Ansible 기본1(설치 후 기본 활용) Ansible 기본1(설치 후 기본 활용) Ansible 실무에 활용 전 vm 통해 테스트하는 방법 안내하도록 하겠습니다. 관련하여 Ansible 사용하실분들은 참고하

djdakf1234.tistory.com


Ansible 실무에 활용 전 vm 통해 테스트하는 방법 안내하도록 하겠습니다.
관련하여 Ansible 사용하실분들은 참고하여 실무에 적용하시면 좋을 것 같습니다.
무작정 따라하시기보다, 내용 변경해가며 따라하시는걸 추천드립니다.


서버 정보

ansible-control Ubuntu 22.04 4vcore 8GB 80GB 10.10.x.123
ansible1 Ubuntu 22.04 4vcore 8GB 80GB 10.10.x.124
ansible2 Ubuntu 22.04 4vcore 8GB 80GB 10.10.x.125
ansible3 Ubuntu 22.04 4vcore 8GB 80GB 10.10.x.126

기본 셋팅

# 호스트네임 설정
sudo su -
## hostnamectl hostname <호스트이름>
hostnamectl hostname ansible-control
hostnamectl hostname ansible1~3

#
systemctl stop ufw && systemctl disable ufw
systemctl stop apparmor && systemctl disable apparmor

#
apt update && apt install -y bat jq
echo 'alias cat=batcat' >> /etc/profile

[ansible-control] 앤서블 설치

# 파이썬 버전 확인
python3 --version
Python 3.10.12

# 설치
apt install software-properties-common -y
add-apt-repository --yes --update ppa:ansible/ansible
apt install ansible -y

# 확인
ansible --version
ansible [core 2.16.4]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] (/usr/bin/python3)
  jinja version = 3.0.3
  libyaml = True

IP를 이용한 인벤토리 파일 생성

# 디렉터리 생성
mkdir -p ansible && cd ansible

# 각자 자신의 tnode1~3의 VM IP 변수 지정
tnode1ip=10.10.x.124
tnode2ip=10.10.x.125
tnode3ip=10.10.x.126
echo $tnode1ip $tnode2ip $tnode3ip

# inventory 파일 생성
cat <<EOT>> inventory
$tnode1ip
$tnode2ip
$tnode3ip
EOT

# inventory 파일 확인
cat inventory

# inventory 검증 : -i 특정 인벤토리 지정
ansible-inventory -i inventory --list | jq

호스트명을 이용한 인벤토리 파일 생성

# 디렉터리 생성
mkdir -p ansible && cd ansible

# 각자 자신의 tnode1~3의 VM IP 변수 지정
tnode1ip=10.10.x.124
tnode2ip=10.10.x.125
tnode3ip=10.10.x.126
echo $tnode1ip $tnode2ip $tnode3ip

# /etc/hosts에 자동화 대상 호스트 등록
cat <<EOT>> /etc/hosts
$tnode1ip ansible1
$tnode2ip ansible2
$tnode3ip ansible3
EOT

# /etc/hosts 파일 확인
cat /etc/hosts

# inventory 파일 생성
cat <<EOT > inventory
ansible1
ansible2
ansible3
EOT

# inventory 파일 확인
cat inventory

# inventory 검증
ansible-inventory -i inventory --list | cat -p -l json

인벤토리 그룹 구성

# inventory 그룹 구성
cat <<EOT > inventory
[web]
ansible1
ansible2

[db]
ansible3

[all:children]
web
db
EOT

# inventory 검증
ansible-inventory -i inventory --list | jq
ansible-inventory -i inventory --graph

# ansible.cfg 파일 생성
cat <<EOT > ansible.cfg
[defaults]
inventory = ./inventory
EOT

# 확인
cat ansible.cfg

# inventory 목록 확인
ansible-inventory --list | jq

노드 셋팅

# Create SSH Keypair
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa

# 공개 키를 관리 노드에 복사
for i in {1..3}; do ssh-copy-id root@ansible$i; done

# 복사 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh root@ansible$i cat ~/.ssh/authorized_keys; echo; done

# ssh 접속 테스트
ssh ansible1
ssh ansible2
ssh ansible3

# ansible.cfg 파일 수정
cd ~/ansible
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

# 확인
cat ansible.cfg

# inventory 파일 확인
cat inventory -p

# 확인
ansible -m ping web
ansible2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
ansible1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

ansible -m ping db
ansible3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

# 옵션 설정으로 암호 입력 후 실행 확인
ansible -m ping --ask-pass web
SSH password: <암호입력>

# 다른 사용자 계정으로 실행 확인
ansible -m ping web -u ubuntu
ansible -m ping web -u ubuntu --ask-pass
ansible -m ping db -u ubuntu --ask-pass

플레이북 셋팅

#
cd ~/ansible

# 플레이북 작성
cat <<EOT > first-playbook.yml
---
- hosts: all
  tasks:
    - name: Print message
      debug:
        msg: Hello Ansible
EOT

cat first-playbook.yml

 

  • 플레이북 문법 체크하기 : 자체 문법 체크 옵션 제공
# 문법 체크
ansible-playbook --syntax-check first-playbook.yml

# 문법 오류시에 아래와같이 표기
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)

Syntax Error while loading YAML.
  did not find expected '-' indicator

The error appears to be in '/root/ansible/first-playbook.yml': line 6, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      debug:
    msg: Hello Ansible
    ^ here

플레이북 실행

cd ~/ansible
ansible-playbook first-playbook.yml
PLAY [all] *****************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************************************
ok: [ansible2]
ok: [ansible1]
ok: [ansible3]

TASK [Print message] *******************************************************************************************************************************************************************************************
ok: [ansible1] => {
    "msg": "Hello Ansible"
}
ok: [ansible2] => {
    "msg": "Hello Ansible"
}
ok: [ansible3] => {
    "msg": "Hello Ansible"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************
ansible1                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ansible2                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ansible3                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

플레이북 점검

# 플레이북 작성
cd ~/ansible
cat <<EOT > restart-service.yml
---
- hosts: all
  tasks:
    - name: Restart sshd service
      ansible.builtin.service:
        name: sshd
        state: restarted
EOT

# 확인
cat restart-service.yml

# 실행 점검 : 미리 점검 내용에서 아래 changed=1 확인
ansible-playbook --check restart-service.yml
....
PLAY RECAP *****************************************************************************************************************************************************************************************************
ansible1                   : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ansible2                   : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ansible3                   : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# 플레이북 실제 실행
ansible-playbook restart-service.yml
...
728x90
반응형

'Ansible' 카테고리의 다른 글

Ansible 기본4(Facts)  (0) 2024.03.26
Ansible 기본3(Ansible Vault)  (0) 2024.03.26
Ansible 기본2(변수)  (0) 2024.03.26
Comments