Deploy/Ansible

Ansible > 맛보기

Krevis 2024. 6. 14. 06:39

정의

배포 자동화 도구

 

다수의 원격 서버를 대상으로 설정 관리, 애플리케이션 배포(설치) 등을 코드로 관리할 수 있도록 도움을 주는 도구

 

예전에는 관리자들이 쉘 스크립트 등을 이용해 서버를 관리하는 것이 일반적이었으나, 관리해야할 서버가 많아지자 사용법이 간단한 앤서블을 많이 사용하게 됐다

특징

반복적인 작업에서 탈출할 수 있으며 자동화를 통해 애플리케이션의 제공 시간을 단축할 수 있다

 

앤서블 관리 노드를 이용해 여러 개의 원격 서버들을 효율적으로 관리할 수 있다

 

시간 절약, 생산성 증가, 반복 작업 제거, 실수 및 에러율 감소, 코드 가독성 향상, 매우 간단한 코딩 방식, SSH 기반 실행

 

  • 앤서블 관리 노드(PC / 서버)
    • SSH 통신 -> 서버 1
    • SSH 통신 -> 서버 2
    • ..

별도의 에이전트 없이 SSH 기반으로 동작하므로 SSH 키를 미리 등록해놓아야 한다

  • ssh-keygen
  • cat .ssh/id_rsa.pub
  • 출력된 키값을 복사해 vi로 배포 대상 서버의 ~/.ssh/authorized_keys 파일에 저장
  • chmod 600 ~/.ssh/authorized_keys

기능 살펴보기

Inventory

제어하려는 원격 대상 서버들의 목록

 

인벤토리 파일은 /etc/ansible/hosts에 위치하고 있다

[testservers]
test01.foo.bar
test02.foo.bar

 

호스트명만 추가할 수도 있고, []를 이용해 그룹을 지정한 후 추가할 수도 있다

test[01:02].foo.bar와 같이 패턴을 사용해 범위로도 추가할 수 있다

 

ansible -m ping test01.foo.bar

  • -m: 모듈명
test01.foo.bar | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

ansible -m ping test02.foo.bar

ansible -m ping testservers

 

이제 shell 모듈을 이용해 test01, test02의 /home 디렉터리를 확인해보겠다

 

ansible -m shell -a 'ls /home' testservers

  • -a 모듈인자
test01.foo.bar | CHANGED | rc=0 >>
ec2-user
test02.foo.bar | CHANGED | rc=0 >>
ec2-user

 

/home 디렉터리에 ec2-user라는 폴더가 있음을 알 수 있다

 

이처럼 다양한 모듈을 제공한다

Playbook

원격 서버에서 실행할 여러 개의 모듈 또는 명령어를 모아둔 것

ansible-master01

echo "Example" > ex.txt

vi playbook.yml

- name: 앤서블 플레이북
  hosts: testservers
  remote_user: ec2-user
  connection: ssh
  tasks:
    - name: Copy
      copy:
        src: /home/ec2-user/ex.txt
        dest: /home/ec2-user/ex.txt
        mode: '0644'
    - name: Shell
      shell:
        cmd: mv ex.txt ex1.txt

 

ansible-playbook playbook.yml

PLAY [앤서블 플레이북] ****************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [test01.foo.bar]
ok: [test02.foo.bar]

TASK [Copy] ********************************************************************************************************************************************************************************************************
changed: [test01.foo.bar]
changed: [test02.foo.bar]

TASK [Shell] *******************************************************************************************************************************************************************************************************
changed: [test01.foo.bar]
changed: [test02.foo.bar]

PLAY RECAP *********************************************************************************************************************************************************************************************************
test01.foo.bar       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
test02.foo.bar       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

ansible -m shell -a 'cat /home/ec2-user/ex1.txt'

test01.foo.bar | CHANGED | rc=0 >>
Example
test02.foo.bar | CHANGED | rc=0 >>
Example