상세 컨텐츠

본문 제목

Ansible을 이용한 서버 관리 자동화

카테고리 없음

by Keunwoo.LEE 2023. 4. 24. 15:13

본문

반응형

최근에 회사에서 관리해야 하는 서버 수십대에 동일한 작업을 해야 하는 상황이 생겼다.

이런 상황에 유용한 Ansible을 이용하여 간단하게 자동화 할 수 있는 방법을 소개한다.

0. 예제 상황

  • 여러대의 서버에 특정 .sh 파일을 업로드
  • 해당 .sh 파일의 실행을 crontab에 등록
  • .sh 실행에 필요한 rpm 패키지 설치
  • Ansible은 Controller 서버에만 설치하고 Remote 서버에 별도의 Agent는 필요 없음
  • Controller 서버 --> Remote 서버 접속은 SSH로 진행 됨

1.설치

Ansible 설치 (Controller 서버)

> yum install epel-release

> yum install ansible

Ansible.cfg 파일 수정

# SSH 최초 접속시 host key download YES/NO 물어보는 절차 무시하기
host_key_checking = False

Inventory 파일에 ansible로 관리할 대상 서버 등록

  • 방법1 : /etc/ansible/hosts 에 등록 (root 권한 필요)
  • 방법2: 특정 ini 파일을 생성 후 ansible 실행시 불러오기 (일반 계정에서 진행 가능, 필자는 방법2로 진행)
> vi /home/kwlee/ansible_works/hosts.ini

[servers]
10.10.10.21
10.10.10.22
10.10.10.23
10.10.10.24

2. Playbook 작성

예제 Playbook

> vi /home/kwlee/ansible_works/kwlee_pass_job.yml

---
  - name: playbook

    # /home/kwlee/ansible_works/hosts.ini 에 등록된 이름
    hosts: servers

    # sudo 를 이용함 (su 아니고 sudo)
    become: yes
    become_user: root

    # task 시작
    tasks:
      # copy task (Controller 서버에 있는 .sh 파일을 리모트 서버에 업로드)
      - name: Copy file kwlee_pass_job.sh
        copy:
          src: /myfile/kwlee_pass_job.sh
          dest: /home/kwlee/kwlee_pass_job.sh
          owner: root
          group: root
          mode: '0700'

      # cron task (crontab 등록)
      - name: add crontab
        cron:
          name: "kwlee_job"
          minute: "35"
          hour: "03"
          day: "5"
          job: "/home/kwlee/kwlee_pass_job.sh"


      # copy task (여러 파일)
      - name: Copy file expect and tcl
        copy:
          src: "{{ item }}"
          dest: /home/kwlee/
        with_fileglob:
          - "/myfile/expect/*"

      # yum task (tcl 설치)
      - name: Install package tcl
        yum:
          pkg: tcl-8.5.13-8.el7.x86_64.rpm
          state: present

      # yum task (expect 설치)
      - name: Install package expect
        yum:
          pkg: expect-5.45-14.el7_1.x86_64.rpm
          state: present

실행

  • -i : inventory 파일 명시
  • -l : inventory 파일안에 등록된 서버 이름 (Group or Host)
  • -u : login user
  • -k : login user password 입력 받음
  • -K : become(권한 상승) 옵션을 선택했기 때문에 sudo password 입력 받음
  • 필자의 경우 모든 Remote 서버에 kwlee 라는 계정이 생성되어 있음
> ansible-playbook -i hosts.ini -l servers kwlee_pass_job.yml -u kwlee -k -K
SSH password:
BECOME password[defaults to SSH password]:

PLAY [playbook] *******************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************
ok: [10.10.10.24]
ok: [10.10.10.22]
ok: [10.10.10.23]
ok: [10.10.10.21]

TASK [add crontab] ****************************************************************************************************
ok: [10.10.10.23]
ok: [10.10.10.24]
ok: [10.10.10.22]
ok: [10.10.10.21]

TASK [Copy file kwlee_pass_job.sh] ************************************************************************************
ok: [10.10.10.23]
ok: [10.10.10.24]
ok: [10.10.10.21]
ok: [10.10.10.22]

TASK [Copy file expect and tcl] ***************************************************************************************
ok: [10.10.10.23] => (item=/home/kwlee/expect/expect-5.45-14.el7_1.x86_64.rpm)
ok: [10.10.10.24] => (item=/home/kwlee/expect/expect-5.45-14.el7_1.x86_64.rpm)
ok: [10.10.10.22] => (item=/home/kwlee/expect/expect-5.45-14.el7_1.x86_64.rpm)
ok: [10.10.10.21] => (item=/home/kwlee/expect/expect-5.45-14.el7_1.x86_64.rpm)
ok: [10.10.10.23] => (item=/home/kwlee/expect/tcl-8.5.13-8.el7.x86_64.rpm)
ok: [10.10.10.24] => (item=/home/kwlee/expect/tcl-8.5.13-8.el7.x86_64.rpm)
ok: [10.10.10.22] => (item=/home/kwlee/expect/tcl-8.5.13-8.el7.x86_64.rpm)
ok: [10.10.10.21] => (item=/home/kwlee/expect/tcl-8.5.13-8.el7.x86_64.rpm)

TASK [Install package tcl] ********************************************************************************************
ok: [10.10.10.23]
ok: [10.10.10.24]
ok: [10.10.10.21]
ok: [10.10.10.22]

TASK [Install package expect] *****************************************************************************************
ok: [10.10.10.23]
ok: [10.10.10.24]
ok: [10.10.10.21]
ok: [10.10.10.22]

PLAY RECAP ************************************************************************************************************
10.10.10.21                : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.10.10.22                : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.10.10.23                : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.10.10.24                : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

대상 서버 결과

> crontab -l
#Ansible: kwlee_job
35 03 5 * * /home/kwlee/kwlee_pass_job.sh

> ls -al /home/kwlee
-rw-r--r--   1 root  root   268656 Apr 21 17:48 expect-5.45-14.el7_1.x86_64.rpm
-rwx------   1 root  root      358 Apr 21 15:09 kwlee_pass_job.sh
-rw-r--r--   1 root  root  1980564 Apr 21 17:48 tcl-8.5.13-8.el7.x86_64.rpm

> rpm -qa | grep tcl
tcl-8.5.13-8.el7.x86_64

> rpm -qa | grep expect
expect-5.45-14.el7_1.x86_64

 

반응형

댓글 영역