IaC

[IaC] Ansible을 통한 Application 구축 자동화

테런 2024. 6. 20. 09:46
Overview
  • Ansible은 IT 인프라 자동화 및 구성 관리 도구로, 서버나 네트워크 장비, 클라우드 서비스 등을 효율적으로 관리할 수 있게 해주는 오픈 소스 도구입니다.

 

Ansible 기본 개념
1. 선언적 언어: Ansible은 YAML 기반의 플레이북(Playbook)을 사용하여 인프라 상태를 정의합니다. 이는 원하는 상태(Desired State)를 선언하는 방식으로 작업을 수행할 수 있게 해줍니다.

2. Agentless: Ansible은 Agentless 도구로, 관리 대상 서버에 별도의 에이전트 소프트웨어를 설치할 필요가 없습니다. 대신 SSH를 통해 원격으로 명령을 실행하고 설정을 관리합니다.

3. Module 기반: Ansible은 다양한 Module을 제공하여 서버 구성, 파일 관리, 패키지 설치 등 다양한 작업을 수행할 수 있습니다. 이 Module들은 Playbook에서 호출되어 사용됩니다.

4. Inventory: Ansible은 관리 대상 호스트들의 정보를 Inventory 파일에 기록하여 관리합니다. 이를 통해 그룹화된 호스트들에 대해 특정 작업을 실행할 수 있습니다.

5. Playbook: Ansible에서 작업을 정의하는 YAML 파일을 Playbook이라고 합니다. Playbook은 한 번에 한 개 이상의 작업(Task)을 수행할 수 있으며, 작업들은 Module을 호출하여 실행됩니다.

 

Ansible 멱등성
Ansible에서의 멱등성(Idempotence)은 중요한 개념입니다. 멱등성이란 동일한 작업을 여러 번 수행해도 결과가 항상 동일하게 유지되는 성질을 말합니다. Ansible이 멱등성을 지키는 것은 인프라 관리 및 구성 관리 도구로서의 신뢰성과 예측 가능성을 제공하는 데 중요한 역할을 합니다.

단, Shell, Command, File Module은 멱등성 유지가 안되니 주의해서 사용하시길 바랍니다. 가능하면 Ansible Builtin을 사용하시길 바랍니다.

 

Ansible 설치
// https://docs.ansible.com/ansible/latest/installation_guide/installation_distros.html
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
$ ansible --version

 

Ansible 통신 연결
Ansible 기본 용어는 해당 링크에서 확인해보시길 바랍니다. (링크)
// Ansible은 SSH 통신을 위해서 SSH Public Key를 각 서버에 공유
// Control Node 서버에서 진행

// 키 생성
$ ssh-keygen -t rsa -b 4096

// 키 확인
$ ls ~/.ssh/

// Control Node 서버에서 Managed Node 서버들로 접속하기 위한 키 세팅
// 모든 Managed Node 서버들에 각각 진행
$ vi {Managed Node Key}.pem
$ sudo chmod 600 {Managed Node Key}.pem
$ ssh-agent bash -c "ssh-add {Managed Node Key}.pem; ssh-copy-id -i ~/.ssh/id_rsa.pub {User}@{Managed Node IP}"

// Managed Node 서버에서 확인
$ cat ~/.ssh/authorized_keys

// 주의! 해당 명령어는 멱등성이 보장되지 않고, 로그 또한 확인할 수 없으므로 사용하지 않도록 합니다.
// 위의 ssh-agent를 명령어를 사용하시길 바랍니다.
$ cat ~/.ssh/id_rsa.pub | ssh -i {Managed Node Key}.pem {User}@{Managed Node IP} "cat - >> ~/.ssh/authorized_keys"

 

Ansible Inventory 테스트
// Control Node 서버에서 진행
// 관리할 서버 정보
$ vi inventory.yml
control:
  hosts:
    localhost:
      ansible_connection: local
  
masters:
  hosts:
    master-1:
      ansible_host: {Managed Node IP}
      ansible_user: {User}
      ansible_port: 22
      ansible_ssh_private_key_file: ~/.ssh/id_rsa

workers:
  hosts:
    worker-1:
      ansible_host: {Managed Node IP}
      ansible_user: {User}
      ansible_port: 22
      ansible_ssh_private_key_file: ~/.ssh/id_rsa

// Ping 테스트
$ ansible -i inventory.yml all -m ping
worker-1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
master-1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

 

마무리
Inventory를 통해서 호스트 연결이 확인되었으면 Playbook을 생성해서 다양한 Application을 설치해보시길 바랍니다. 감사합니다.

'IaC' 카테고리의 다른 글

[IaC] Terraform을 통한 AWS 환경 구축  (0) 2024.05.20