반응형
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로 지정하고, 재사용이 용이하도록 변경할 수 있다.
반응형
'사이드 프로젝트' 카테고리의 다른 글
[CI/CD 프로젝트] Gatekeeper를 통한 K8S 정책 관리 (0) | 2024.11.20 |
---|---|
[CI/CD 프로젝트] Prometeus + Grafana 를 통한 모니터링 가시성 높이기 (1) | 2024.11.20 |
[CI/CD 프로젝트] ArgoRollout로 canary배포하기 (0) | 2024.11.20 |
[CI/CD 프로젝트] ArgoRollout로 Blue/Green 배포하기 (1) | 2024.11.20 |
[CI/CD 프로젝트] ArgoCD를 통한 CD 구성 (2) | 2024.11.20 |