본문 바로가기

study/Ansible101 1기

Ansible101 1기 4주차 첫번째

안녕하세요, 마지막 스터디 공유 시작하겠습니다.

 

보안 설정 자동화

11.1. 패스워드 변경 주기 설정하기

패스워드 변경 주기를 설정할 대상 호스트는 인벤토리를 통해 설정한다.

패스워드 변경 주기를 설정할 사용자 계정 정보와 최대 변경일은 변수를 통해 별도의 파일로 정의한다.

패스워드 변경 주기 설정은 ansible.builtin.user 모듈을 이용한다.

 

플레이북 설계

사용자 계정과 최대 변경일을 변수로 설정하기 위해 vars_maxdays.yml 파일 생성

메인 플레이북 set_chage_password.yml 파일에는 변경 주기를 설정할 태스트가 포함

 

1. 프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성

#
mkdir ~/my-ansible/chapter_11.1
cd ~/my-ansible/chapter_11.1

# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT

 

 

2. 사전형 변수 파일 생성

~/my-ansible/chapter_11.1/vars_maxdays.yml

---

Userinfo:
  - username: ansible
    maxdays: 90
  - username: stack
    maxdays: 90

 

3. 메인 플레이북 작성 : 패스워드 변경 주기는 user 모듈의 password_expire_max 파라미터로 설정

---

- hosts: tnode
  vars_files: vars_maxdays.yml
  
  tasks:
    - name: Change Password Maxdays
      ansible.builtin.user:
        name: "{{ item.username }}"
        password_expire_max: "{{ item.maxdays }}"
      loop: "{{ Userinfo }}"

 

4.  실행

# 문법 체크
ansible-playbook --syntax-check set_chage_password.yml

# 시뮬레이션
ansible-playbook --check set_chage_password.yml

# 확인 : chage -l ansible
man chage
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo chage -l ansible; echo; done
Password expires                                        : never
...
Maximum number of days between password change          : 99999

# 실행
ansible-playbook set_chage_password.yml

# 확인 : chage -l ansible
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo chage -l ansible; echo; done
>> tnode1 <<
Last password change                                    : Jan 10, 2024
Password expires                                        : Apr 09, 2024
...
Maximum number of days between password change          : 90

 

결과

 

11.2 패스워드 생성 법칙 적용하기

패스워드 생성 법칙 적용을 위해서는 pwquality.conf 라는 pam 설정 파일을 이용해야 하며, 리눅스 서버에 libpam-pwquality 패키지가 있어야 함.

패스워드 변경 주기는 /etc/securiy/pwquality.conf 파일로 설정한다.

/etc/securiy/pwquality.conf 파일을 설정하기 전에 원본 파일을 백업받는다.

pwquality.conf 파일은 사용자가 커스텀으로 설정하는 파라미터들로 구성되어 있으며, Jinja2 템플릿 방식으로 구현한다.

파라미터들은 별도의 변수 설정 파일에서 정의한 파라미터 값으로 사용하고, 파라미터 정의 여부를 체크하여 pwquality.conf 파일의 내용을 구성한다.

 

플레이북 설계

변수 vars_pw_rule.yml 에 정의

  • 최소 패스워드 길이 설정 minlen
  • 최소 숫자 개수 설정 dcredit
  • 최소 대문자 개수 설정 ucredit
  • 최소 소문자 개수 설정 lcredit
  • 최소 특수문자 개수 설정 ocredit
  • root 계정에서도 해당 패스워드 룰을 설정할 수 있는 enforce_for_root

Jinja2 템플릿 파일 pwqulity.conf.j2 아래 내용 포함

  • minlen, dcredit, ucredit, lcredit, orcedit, enforce_for_root
  • minclass : 최소 문자클래스 개수
  • maxrepeat : 최대 연속 동일 문자 수
  • maxclassrepeat : 동일 글래스의 최대 연속 문자 수

 

플레이북 개발 및 실행

1.프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성

#
mkdir ~/my-ansible/chapter_11.2
cd ~/my-ansible/chapter_11.2

# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT

 

2. 변수 값 설정

~/my-ansible/chapter_11.2/vars_pw_rule.yml

---

minlen: 8
dcredit: -1
ucredit: -1
lcredit: -1
ocredit: -1
enforce_for_root: false

 

3. Jinja2 템플릿 파일 pwquality.conf.j2 작성

- {% ~ %} 사이에 제어문 구문 위치

- {% if minlen is defined %} 구문 : minlen 이라는 변수가 정의되면 아래 문장을 삽입하라’ 는 의미

- 아래 템플릿에는 {% if 변수 is defined %} ~ {% endif %} 구문을 사용하여 파라미터와 관련된 변수가 선언되면 해당 파라미터를 삽입

 

~/my-ansible/chapter_11.2/pwquality.conf.j2

# Created by ansible

{% if minlen is defined %}
# Minimum acceptable size for the new password
minlen = {{ minlen }}
{% endif %}

{% if dcredit is defined %}
# The maximum credit for having digits in the new password
dcredit = {{ dcredit }}
{% endif %}

{% if ucredit is defined %}
# The maximum credit for having uppercase characters in the new password
ucredit = {{ ucredit }}
{% endif %}

{% if lcredit is defined %}
# The maximum credit for having lowercase characters in the new password
lcredit = {{ lcredit }}
{% endif %}

{% if ocredit is defined %}
# The maximum credit for having other characters in the new password
ocredit = {{ ocredit }}
{% endif %}

{% if minclass is defined %}
# The minimum number of required classes of characters for the new password
minclass = {{ minclass }}
{% endif %}

{% if maxrepeat is defined %}
# The maximum number of allowed consecutive same characters in the new password
maxrepeat = {{ maxrepeat}}
{% endif %}

{% if maxclassrepeat is defined %}
# The maximum number of allowed consecutive characters of the same class in the new password
maxclassrepeat = {{ maxclassreapt }}
{% endif %}

{% if retry is defined %}
# Prompt user at most N times before returning with error
retry = {{ retry }}
{% endif %}

{% if enforce_for_root is defined %}
# Enforces pwquality checks on the root user password.
enforce_for_root
{% endif %}

 

4. 메인 플레이북 작성 : when 구문으로 데비안/우분투 경우 apt설치. 이후 copy로 백업 후 template 로 템플릿 파일 복사

~/my-ansible/chapter_11.2/set_password_rule.yml

---

- hosts: tnode
  vars_files: vars_pw_rule.yml

  tasks:
    - name: Install libpam-pwquality
      ansible.builtin.apt:
        name: libpam-pwquality
        state: present
      when: ansible_facts.os_family == "Debian"

    - name: Backup pwquality.conf
      ansible.builtin.copy:
        src: /etc/security/pwquality.conf
        dest: /etc/security/pwquality.conf.bak
        remote_src: yes

    - name: Copy pwquality.conf.j2 at /etc/security
      ansible.builtin.template:
        src: pwquality.conf.j2
        dest: /etc/security/pwquality.conf
        mode: '0644'

 

5. 실행

# 문법 체크
ansible-playbook --syntax-check set_password_rule.yml

# 시뮬레이션
ansible-playbook --check set_password_rule.yml

# 실행 전 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo cat /etc/security/pwquality.conf; echo; done

# 실행
ansible-playbook set_password_rule.yml

# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo ls -l /etc/security; echo; done
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo cat /etc/security/pwquality.conf; echo; done

# 확인 : ansible 계정에 패스워드를 조건이 불충분하도록 입력 시도
ssh tnode2
-----------------
sudo su - ansible
whoami
pwd
passwd ansible
Changing password for ansible.
Current password: ansiblePw1
New password: qwer
BAD PASSWORD: The password contains less than 1 digits
New password: qwer1234
BAD PASSWORD: The password contains less than 1 uppercase letters
New password: Qwer1234
BAD PASSWORD: The password contains less than 1 non-alphanumeric characters
passwd: Have exhausted maximum number of retries for service
passwd: password unchanged

exit
exit
-----------------

 

확인

 

11.3 디렉터리 및 파일 접근 권한 변경

#(참고) SUID, SGID, Sticky bit, World Writable - Link1 Link2 Link3

 

상황

  • 리눅스 보안 중에 꼭 확인해야 하는 항목이 바로 Sticky bit 설정 파일World Writable 설정 파일입니다.
  • Sticky bit 설정 파일은 리눅스에서 파일 소유자그룹 소유자만 해당 파일을 읽고 쓰고 삭제할 수 있도록 권한을 부여한 것을 의미합니다.
  • 파일 소유자에게 권한을 부여하면 SUID, 파일 그룹에게 권한을 부여하면 SGID, 다른 사람에게 권한을 부여하면 Sticky bit 라고 합니다.
  • Sticky bit가 적용된 파일 목록 중 보안을 위해 이를 적용하면 안 되는 파일 목록들이 있습니다.
  • Sticky bit가 적용된 파일의 권한을 수정할 때는 적용되면 안 되는 파일인지 반드시 먼저 확인합니다 → 보안 관련 가이드 문서 참고
  • World Writable 파일모든 사용자에게 파일을 읽고 쓸 수 있는 권한이 부여된 파일을 의미합니다.

사전 분석

  • Sticky bit 파일 검색 명령어: find / -xdev -perm -04000 -o -perm -02000 -o -perm -01000
  • World Writable 파일 검색 명령어: find / -xdev -type f -perm -2
  • ansible.builtin.**shell** 모듈을 이용하여 Sticky bit 파일과 World Writable 파일을 찾는다.
  • 찾은 파일 목록은 ansible.builtin.**file** 모듈을 이용하여 파일의 접속 권한을 설정한다.
  • Sticky bit 파일은 u-s, g-s, o-s 로 설정하고, World Writable 파일은 o-w 로 설정한다.

 

1. 프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성

~/my-ansible/chapter_11.3/..

#
mkdir ~/my-ansible/chapter_11.3
cd ~/my-ansible/chapter_11.3

# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT

 

2. 태스크 파일 작성 : 검색 시 grep 으로 필터링(-e 정규식 패턴, -v 매칭되지 않는 경우)

~/my-ansible/chapter_11.3/set_sticky_writable_files.yml

---

- hosts: tnode

  tasks:
  - name: Find Sticky bit files
    ansible.builtin.shell: |
      find / -xdev -perm -04000 -o -perm -02000 -o -perm 01000 \
      | grep -e 'dump$' \
             -e 'lp*-lpd$' \ 
             -e 'newgrp$' \
             -e 'restore$' \
             -e 'at$' \
             -e 'traceroute$' | xargs ls
    register: sfile_list

  - name: Find World Writable files
    ansible.builtin.shell: |
      find / -xdev -perm -2 -ls \
      | grep -v 'l..........' | awk '{print $NF}'
    register: wfile_list

  - name: Print Sticky bit files
    ansible.builtin.debug:
      msg: "{{ sfile_list.stdout_lines }}"

  - name: Print World Writable files
    ansible.builtin.debug:
      msg: "{{ wfile_list.stdout_lines }}"

  - name: Set Sticky bit files
    ansible.builtin.file:
      path: "{{ item }}"
      mode: "u-s,g-s,o-s"
    loop: "{{ sfile_list.stdout_lines }}"

  - name: Set World Writable files
    ansible.builtin.file:
      path: "{{ item }}"
      mode: "o-w"
    loop: "{{ wfile_list.stdout_lines }}"

 

3. 플레이북 실행

# 문법 체크
ansible-playbook --syntax-check set_sticky_writable_files.yml

# 시뮬레이션
ansible-playbook --check set_sticky_writable_files.yml

# (예시) 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo ls -al /usr/bin/newgrp; echo; done  # -rwsr-xr-x
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo ls -al /var/crash; echo; done       # drwxrwxrwt

# 실행
ansible-playbook set_sticky_writable_files.yml

# (예시) 변경 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo ls -al /usr/bin/newgrp; echo; done  # -rwxr-xr-x
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo ls -al /var/crash; echo; done       # drwxrwxr-t

# 한번 더 실행
ansible-playbook set_sticky_writable_files.yml

 

결과

 

 

11.4 사설 인증서 생성하기

How to create self-signed certificates - https://docs.ansible.com/ansible/latest/collections/community/crypto/docsite/guide_selfsigned.html

 

사전 분석

  • 사설 인증서에는 자체 서명된 인증 기관용 인증서와 해당 인증서를 이용해 만든 클라이언트 인증 키가 있다.
  • 인증서를 만들 때는 CSR Certificate Signing Request 이라는 인증 서명 요청을 한다.
  • CSR을 통해 인증 기관용 인증서클라이언트 인증 키를 생성한다.
  • 앤서블에서 개인 키를 만들때는 community.crypto.**openssl_privatekey** 모듈을 사용 - Link
  • CSR을 만들 때는 community.crypto.**openssl_csr_pipe** 모듈을 사용 - Link
  • CSR을 이용하여 인증서를 생성할 때는 community.crypto.**x509_certificate** 모듈을 사용 - Link
 

community.crypto.x509_certificate module – Generate and/or check OpenSSL certificates — Ansible Documentation

The point in time at which the certificate stops being valid. Time can be specified either as relative time or as an absolute timestamp. A valid absolute time format is ASN.1 TIME such as 2019-06-18. A valid relative time format is [+-]timespec where times

docs.ansible.com

 

플레이북 설계

  • tnode1사설 인증서를 생성하기 위해 inventory에 rootCA 호스트 그룹을 만들고 그룹 멤버로 tnode1 노드를 추가
  • 인증서 생성에 필요한 들은 vars_ssltls.yml 파일을 통해 외부 변수로 정의
  • 메인 플레이북인 make_certification.yml 에는 become을 false로 설정하여 root 계정이 아니 ubuntu 계정으로 실행되도록 하였습니다
  • pre_tasks 키워드를 사용하여 롤이 실행되기 전에 먼저 태스크가 실행되도록 하였으며, 인증서 생성을 위한 디렉터리를 생성하는 태스크를 추가하였습니다
  • 인증서 생성은 rootCA 인증서와 serverKey로 나뉘며, 해당 인증서 생성은 각각 롤을 생성하여 처리하도록 설계
  • rootCA 롤과 serverKey 롤은 각각 ‘개인 키 생성CSR (인증 서명 요청) 생성 → CSR을 이용한 인증서 생성’ 태스크로 구성되며,
  • serverKey 롤에서 CSR 인증서를 생성할 때는 이미 사전에 생성된 rootCA로부터 발급받아 생성하는 방식을 사용합니다

1. 프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성

~/my-ansible/chapter_11.4/..

#
mkdir ~/my-ansible/chapter_11.4
cd ~/my-ansible/chapter_11.4

# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false
roles_path = ./roles

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat <<EOT> inventory
[rootCA]
tnode1

[tnode]
tnode2
tnode3
EOT

 

2. 롤 생성 : myrole.rootCA, myrole.serverKey

#
ansible-galaxy role init --init-path ./roles myrole.rootCA
ansible-galaxy role init --init-path ./roles myrole.serverKey

# 확인
ansible-galaxy role list
tree roles -L 2

 

 

3. myrole.rootCA 에 태스크 파일 작성 : 플레이북은 community.crypto 라는 컨텐츠 컬렉션을 사용 - Link

 

Ansible Galaxy

 

galaxy.ansible.com

  1. 개인 키를 만들때는 community.crypto.**openssl_privatekey** 모듈을 사용 - Link
  • CSR을 만들 때는 community.crypto.**openssl_csr_pipe** 모듈을 사용 - Link
  • CSR을 이용하여 인증서를 생성할 때는 community.crypto.**x509_certificate** 모듈을 사용 - Link
    • 여기서는 자체 서명 인증서를 생성하는 것이므로 providerselfsigned 로 설정

~/my-ansible/chapter_11.4/roles/myrole.rootCA/tasks/main.yml

---
# tasks file for myrole.rootCA

- name: Create new private key for rootCA
  community.crypto.openssl_privatekey:
    path: "{{ ca_privatekey_path }}"

- name: Create CSR for new certificate rootCA
  community.crypto.openssl_csr_pipe:
    privatekey_path: "{{ ca_privatekey_path }}"
    country_name: "{{ country_name }}"
    organization_name: "{{ orgarnization_name }}"
    common_name: "{{ ca_common_name }}"
  register: csr

- name: Create Self-signed new certificate rootCA
  community.crypto.x509_certificate:
    path: "{{ ca_certificate_path }}"
    privatekey_path: "{{ ca_privatekey_path }}"
    csr_content: "{{ csr.csr }}"
    selfsigned_not_after: "{{ certificate_days }}"
    provider: selfsigned
    state: present

 

4. myrole.serverKey 에 태스크 파일 작성

  1. myrole.rootCA 태스크와 비슷하지만, rootCA로부터 발급받는 인증서를 생성할 때 provider가 사전에 생성된 CA 파일을 이용(ownca)를 사용.
  • 그리고 사전에 생성된 rootC의 개인 키와 인증서는 ownca 로 시작되는 파라미터를 사용.

~/my-ansible/chapter_11.4/roles/myrole.serverKey/tasks/main.yml

---
# tasks file for myrole.serverKey

- name: Create new private key for server key
  community.crypto.openssl_privatekey:
    path: "{{ server_privatekey_path }}"

- name: Create CSR for new server key
  community.crypto.openssl_csr_pipe:
    privatekey_path: "{{ server_privatekey_path }}"
    country_name: "{{ country_name }}"
    organization_name: "{{ orgarnization_name }}"
    common_name: "{{ server_common_name }}"
  register: csr

- name: Create Self-signed server key from rootCA
  community.crypto.x509_certificate:
    path: "{{ server_certificate_path }}"
    privatekey_path: "{{ server_privatekey_path }}"
    csr_content: "{{ csr.csr }}"
    ownca_path: "{{ ca_certificate_path }}"
    ownca_privatekey_path: "{{ ca_privatekey_path }}"
    ownca_not_after: "{{ certificate_days }}"
    provider: ownca
    state: present

 

5. 프로젝트 디렉터리에서 변수 파일 생성 : 아래는 예시로 필요에 맞게 수정하시면 됩니다

touch ~/my-ansible/chapter_11.4/vars_ssltls.yml

~/my-ansible/chapter_11.4/vars_ssltls.yml

---

country_name: KR
orgarnization_name: Cloudneta
ca_common_name: Ubuntu-CA
server_common_name: local
certificate_days: "+3650d"
ssl_tls_path: /home/ubuntu/tls
ca_privatekey_path: /home/ubuntu/tls/ca_priv.key
ca_certificate_path: /home/ubuntu/tls/ca_cert.crt
server_privatekey_path: /home/ubuntu/tls/server_priv.key
server_certificate_path: /home/ubuntu/tls/server_cert.crt

 

6. 플레이북 작성

  • become를 false로 설정하여 root가 아닌 ubuntu 계정에서 실행.
  • pre_tasks 섹션을 통해 롤이 실행되기 전에 인증서를 생성하고 보관할 디렉터리를 먼저 생성.
touch ~/my-ansible/chapter_11.4/make_certification.yml

 

~/my-ansible/chapter_11.1/make_certification.yml

---

- hosts: rootCA
  become: false
  vars_files: vars_ssltls.yml

  pre_tasks:
    - name: Make ssl & tls directory
      ansible.builtin.file:
        path: "{{ ssl_tls_path }}"
        state: directory

  roles:
    - role: myrole.rootCA
    - role: myrole.serverKey

 

7. 실행

# 문법 체크
ansible-playbook --syntax-check make_certification.yml

# 실행
ansible-playbook make_certification.yml

# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i ls -l ~/tls; echo; done
>> tnode1 <<
total 16
-rw-rw-r-- 1 ansible ansible 1854 Jan 12 06:21 ca_cert.crt
-rw------- 1 ansible ansible 3243 Jan 12 06:21 ca_priv.key
-rw-rw-r-- 1 ansible ansible 1895 Jan 12 06:21 server_cert.crt
-rw------- 1 ansible ansible 3243 Jan 12 06:21 server_priv.key
...

 

 

 

CH12 모니터링 자동화

사전 분석

  • 팩트는 관리 노드에서 시스템과 관련된 정보(아래 예시)들을 찾아 변수로 제공 → 인프라 정보 파악 및 로그로 저장
    • 호스트 이름
    • 커널 버전
    • 네트워크 인터페이스 이름
    • 네트워크 인터페이스 IP 주소
    • 운영체제 버전
    • CPU 개수
    • 사용 가능한 메모리
    • 스토리지 장치의 크기 및 여유 공간
  • 추출한 내용은 ansible.builtin.shell 모듈을 이용하여 /var/log/daily_check 디렉터리에 저장

1. 프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성

#
mkdir ~/my-ansible/chapter_12.1
cd ~/my-ansible/chapter_12.1

# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT

 

 

2. 플레이북 파일 작성 : debug과 facts 수집 후 file 에 저장

~/my-ansible/chapter_12.1/monitoring_facts.yml

---

- hosts: tnode
  vars:
    log_directory: /var/log/daily_check

  tasks:
    - name: Print system info
      ansible.builtin.debug:
        msg:
        - "################ Start #####################"
        - "Date: {{ ansible_facts.date_time.date }} {{ ansible_facts.date_time.time }}" 
        - "HostName: {{ ansible_facts.hostname }}"
        - "OS: {{ ansible_facts.distribution }}"
        - "OS Version: {{ ansible_facts.distribution_version }}"
        - "OS Kernel: {{ ansible_facts.kernel }}"
        - "CPU Cores: {{ ansible_facts.processor_vcpus }}"
        - "Memory: {{ ansible_facts.memory_mb.real }}"
        - "Interfaces: {{ ansible_facts.interfaces }}"
        - "IPv4: {{ ansible_facts.all_ipv4_addresses }}"
        - "Devices: {{ ansible_facts.mounts }}"
        - "################# End #######################" 
      register: result

    - name: Create log directory
      ansible.builtin.file:
        path: "{{ log_directory }}"
        state: directory

    - name: Print logs to log file
      ansible.builtin.shell: |
        echo "{{ item }}" >> "{{ log_directory }}"/system_info.logs
      loop: "{{ result.msg }}"

 

3. 실행

# 실행
ansible-playbook monitoring_facts.yml

# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i ls -l /var/log/daily_check; echo; done
ssh tnode1 sudo cat /var/log/daily_check/system_info.logs

ansible-playbook monitoring_facts.yml
ssh tnode1 sudo cat /var/log/daily_check/system_info.logs

 

 

 

12.2 CPU, 메모리, 디스크 사용률 모니터링

사전분석

  • 팩트에서 제공되지 않은 정보를 모니터링해야되는 상황
  • 자세한 CPU, 메모리, 디스크 사용률 모니터링을 위해 dstat, iostat, vmstat 명령어 사용 → 툴 설치 필요
  • 각각의 명령어 실행은 ansible.builtin.**shell** 이용하여 실행하고, loop 키워드를 이용하여 모니터링 명령어별로 여러 옵션을 추가하여 명령 실행
  • 실행된 명령어 결과는 로그 디렉터리에 저장

1. 프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성

#
mkdir ~/my-ansible/chapter_12.2
cd ~/my-ansible/chapter_12.2

# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT

 

2. 변수 파일 작성 : 로그 디렉터리와 설치할 패키지

~/my-ansible/chapter_12.2/vars_packages.yml

---

log_directory: /home/ubuntu/logs
packages:
  - dstat
  - sysstat

 

3. 플레이북 파일 작성 : debug과 facts 수집 후 file 에 저장

~/my-ansible/chapter_12.2/monitoring_system.yml

---

- hosts: tnode
  vars_files: vars_packages.yml

  tasks:
    - name: Install packages on RedHat
      ansible.builtin.dnf:
        name: "{{ item }}"
        state: present
      loop: "{{ packages }}"
      when: ansible_facts.os_family == "RedHat"

    - name: Install packages on Ubuntu
      ansible.builtin.apt:
        name: "{{ item }}"
        state: present
      loop: "{{ packages }}"
      when: ansible_facts.os_family == "Debian"

    - name: Create log directory
      ansible.builtin.file:
        path: "{{ log_directory }}"
        state: directory

    - name: Monitoring dstat
      ansible.builtin.shell: |
        {{ item }} >> {{ log_directory }}/dstat.log
      loop:
        - dstat 2 10
        - dstat -cmdlt -D vda 2 10

    - name: Monitoring iostat
      ansible.builtin.shell: |
        {{ item }} >> {{ log_directory }}/iostat.log
      loop:
        - iostat
        - echo "==============="
        - iostat -t -c -dp vda
        - echo "==============="

    - name: Monitoring vmstat
      ansible.builtin.shell: |
        {{ item }} >> {{ log_directory }}/vmstat.log
      loop:
        - vmstat
        - echo "==============="
        - vmstat -dt
        - echo "==============="
        - vmstat -D
        - echo "==============="

    - name: Monitoring df
      ansible.builtin.shell: |
        df -h >> {{ log_directory }}/df.log

 

4. 플레이북 실행

# (옵션) 툴 기본 설치 확인
vmstat
dstat
iostat

# 실행
ansible-playbook monitoring_system.yml

# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i ls -l ~/logs; echo; done
ssh tnode1 ~/logs/df.log
ssh tnode1 ~/logs/*.log

ansible-playbook monitoring_system.yml
ssh tnode1 ~/logs/df.log
ssh tnode1 ~/logs/*.log

 

 

 

12.3 모니터링 환경 구축

사전분석

ansible-galaxy role install geerlingguy.elasticsearch

 

 

'study > Ansible101 1기' 카테고리의 다른 글

Ansible Semaphore  (0) 2024.02.09
Ansible101 1기 3주차 두번째  (0) 2024.01.28
Ansible101 1기 3주차 첫번째  (0) 2024.01.28
Ansible101 1기 2주차 두번째  (0) 2024.01.14
Ansible101 1기 2주차 첫번째  (0) 2024.01.14