본문 바로가기
사이드 프로젝트

[CI/CD 프로젝트] Ansible을 통한 인프라 관리의 자동화

by 간장공장공차장 2024. 11. 20.
반응형

Ansible 주요 개념

  • Inventory : 인벤토리 파일은 Ansible이 관리할 서버 목록을 정의합니다. 일반적으로 /etc/ansible/hosts 에 위치하며, 그룹으로 서버를 정의할 수 있다.

예시:

[webservers]
server1 ansible_host=192.168.1.1
server2 ansible_host=192.168.1.2

[dbservers]
server3 ansible_host=192.168.1.3
  • Playbook : 하나 이상의 작업(task)을 정의한 YAML 파일. 각 Play는 인벤토리의 특정 호스트나 호스트 그룹에서 실행되며, 다양한 모듈과 함께 사용해 복잡한 자동화 작업을 구성할 수 있다.
- name: Install and configure web server
  hosts: webservers
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
    - name: Start Nginx
      service:
        name: nginx
        state: started
  • Module : Ansible의 모듈은 다양한 시스템 관리 작업을 위한 단위입니다. apt, yum, copy, service, command 등의 모듈이 있으며, Playbook과 함께 사용해 설정 및 작업을 자동으로 실행한다.
  • Task (작업): Playbook의 가장 작은 단위로, 특정 작업을 정의한다. 각 Task는 한 가지 모듈을 사용하며, Playbook에 순서대로 나열된다.
  • Role : Playbook의 구성 요소들을 재사용할 수 있도록 모아놓은 구조이다. 역할을 사용해 Playbook의 복잡성을 줄이고, 재사용 가능하게 만든다.
    • 구조멱등성
    • ansible은 같은 작업을 수행하여도 최종적으로 존재해야하는 desired state와 동일하다면, 다른 작업을 하지 않고 동일한 인프라 환경을 유지하기 때문에 관리에 용이하다.
      my_role/
      ├── tasks # 주요 작업을 정의
      │   └── main.yml
      ├── handlers # 특정 작업 후에 실행되는 핸들러를 정의
      │   └── main.yml
      ├── templates # 템플릿 파일을 저장
      │   └── config.j2
      ├── files # 반 파일을 저장
      │   └── sample.conf
      ├── vars # 변수 파일을 정의
      │   └── main.yml
      └── meta # 의존성을 정의
      └── main.yml

실습

💡ansible을 통해 인프라를 자동으로 관리할 수 있도록 한다.

Ansible 환경 구성

  • 설치 (in docker linux ubuntu)
pip3.6 install ansible
  • ssh 접속을 위한 pem 키 docker image로 복사해서 가져오기
docker cp /path/to/local/file container_id:/path/in/container
chwon root:root ssh_key_test.pem

Inventory 파일 설정

[ec2]
 {k8s master ip} ansible_ssh_user=ec2-user ansible_ssh_private_key_file=/{pem file 경로}/{pem 파일}
  • 접근 테스트

정상 접근이 된 것을 볼 수 있다.

ansible -m ping -i hosts.ini all

  • Playbook 실행
- name: Create pods using deployment
  hosts: k8s  # hosts.ini group
  tasks: 
    - name: Create a deployment
      command: /usr/bin/kubectl apply -f /home/ec2-user/test-jenkins/deployment.yaml
ansible-playbook -i hosts.ini ansible-deployment.yaml

수행하면, 배포가 완료되었다.

  • k8s 배포 확인

정상적으로 서비스가 배포된 것을 볼 수 있다.

  • 모듈 테스트

ansible command 모듈을 통해서 ansible로 배포한 deployment가 잘 배포되었는지 확인한다.

- name: Check if Kubernetes Deployment is successfully deployed
  hosts: all
  tasks:
    - name: Check Deployment status
      ansible.builtin.command:
        cmd: "kubectl get deployment backend-app -o jsonpath='{.status.availableReplicas}'"
      register: deployment_status
      failed_when: deployment_status.stdout == "0"
      changed_when: false

    - name: Display Deployment status
      ansible.builtin.debug:
        msg: "Deployment 'backend-app' has {{ deployment_status.stdout }} available replicas."

    - name: Verify all Pods are running
      ansible.builtin.command:
        cmd: "kubectl get pods -l app=backend -o jsonpath='{.items[*].status.phase}'"
      register: pod_status
      failed_when: "'Running' not in pod_status.stdout"
      changed_when: false

    - name: Display Pod status
      ansible.builtin.debug:
        msg: "Pod status for Deployment 'backend-app': {{ pod_status.stdout }}"
ansible-playbook -i inventory.ini check_k8s_deployment.yml

위에 배포된 내용이 정상적으로 수행되었음을 확인할 수 있다.

실제로 k8s에서 확인해보면 정말 상태가 일치하는 것을 볼 수 있다.

  • role 구성하기
# k8s_deployment/tasks/main.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: hellospringd
        image: suhyeonsong/hellospring:latest
        ports:
        - containerPort: 8080
# deploy_app.yml
- name: Deploy application to Kubernetes on EC2
  hosts: k8s
  tasks:
    - name: Include k8s_deployment role
      include_role:
        name: k8s_deployment
  • ansible 패키지 설치
pip install openshift
ansible-galaxy collection install kubernetes.core
  • ansible.cfg 설정
[defaults]
roles_path = /root/roles
inventory = /etc/ansible/hosts.ini
  • 실행하기
ansible-playbook -i inventory.ini deploy_app.yml

정상적으로 배포된다. 이전 것과 동일한 내용이라 달라진 내용은 없다.

위와 같이 자주 쓰는 task에 대해서 role로 지정하고, 재사용이 용이하도록 변경할 수 있다.

반응형