IaC 개요
CICD라는 개념이 중요함. 이를 위해 Jenkins를 사용하는 것임
DevOps 툴로 만들어둔 이미지는 Ansible은 7위
1위는 Kubernetes 2위 Docker 3위 Istio 4위 Github Actions 5위 Jenkins 6위 Prometheus (Grafana)
8위 Chef 9위 Terraform => 이 것들이 IaC 도구라고 한다. …
Infrastructure as Code
시스템 하드웨어 또는 인터페이스의 구성정보를 “파일(스크립트)을 통해 관리” 및 프로비저닝 => 프로그래밍이 가능해진다.
IT 인프라스트럭처, 베어 메탈 서버등의 물리 장비 및 가상 머신과 관련된 구성 리소스를 관리.
비전관리를 통한 리소스 관리
현재 가지고 있는 상태 그 이전 상태 이전 상태 등의 변화를 알 수 있다.
Ansible vs Terraform
Terraform : DSL (Domain Script Language) 어떤 부분이 문제가 생겼을 때 해당 부분을 reload 시스템의 상태를 변경 or 유지함.
필요한 SW 설치
인프라 구축할 때 사용
Ansible 구성관리도구 수천개 이상의 모드를 사용가능 빠르고 쉽게 작업이 가능함.
인프라 관리할 때 사용
AWS 랑 연동도 잘 된다.
IaC를 쓸 때와 안 쓸때의 차이는?
Server 4대가 있다면
Server1, 2, 3, 4
Server4가 고장나면 새로운 서버를 연결해줌.
그러나 Ansible을 사용하면 이 서버관리를 스크립트로 관리할 수 있다는 점이 좋다.
Ansible 개요
여러개 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구이다.
Configuration Management, Deployment & OChestration tool IT infrastructure 자동화
Docker 에서 컨테이너를 다시 시작, 다시 배포를 위해 사용된다.
RedHat 에서 만듬.
Simpe, Agentless
apt-get, yum, homebrew 도 사용 가능
linux 기반으로 사용함.
get_url, git
shell, task
- Version Control : git
- Insfrastructure : AWS, AZURE
- Containers : docker, kube
- TEST : JUnit
- OS : Linux, Windows
결과 : ok/failed/changed/unreachable
docker에다 할 수도 있고, VMware 에다가도 설치할 수 있다.
Ansible-node01 : Centos Ansible-node02 : Centos Ansible-node03 : Ubuntu
이 세가지로 서버가 나눠져 있더라도 접근하는데 전혀 문제가 되지 않는다.
Ansible 설치
Linux 기반으로 접속
- yum install ansible
- ansible –version
환경설정 파일 : /etc/ansible/ansible.cfg
Ansible 에서 접속하는 호스트 목록 : /etc/ansible/hosts 172.20.10.11 172.20.10.12 172.20.10.13
위와 같이 나오면 서버 3대에 대한 관리를 진행해주겠다는 것이다.
- Docekr repository https://hub.docker.com/r/edowon0623
- Ansible 이미지 다운로드
- Windows, MacOS intel chip) docker pull edowon0623/ansible:latest (updated by 2022-09-21)
- MacOS silicon chip, m1) docker pull edowon0623/ansible-server:m1
Windows) Ansible 컨테이너 실행 명령어 (방법1)
docker run --privileged -itd --name ansible-server -p 20022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/ansible:latest /usr/sbin/init
컨테이너에서 실행, /etc/sysconfig/docker 파일이 존재하지 않을 경우에는 아래의 vi, sed 명령어는 실행하지 않음)
$ vi /etc/sysconfig/docker
$ sed -i -e 's/overlay2/vfs/g' /etc/sysconfig/docker-storage
$ systemctl start docker
$ systemctl status docker
Windows) Ansible 컨테이너 실행 명령어 (방법2, 위 명령어로 실행되지 않을 경우)
docker run -itd --name ansible-server -p 20022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/ansible:latest /usr/sbin/init
컨테이너에서 실행
$ systemctl status docker
MacOS intel chip) Ansible 컨테이너 실행 명령어
docker run --privileged --itd -p 20022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/ansible:latest /usr/sbin/init
컨테이너에서 실행, /etc/sysconfig/docker 파일이 존재하지 않을 경우에는 아래의 vi, sed 명령어는 실행하지 않음)
$ vi /etc/sysconfig/docker
$ sed -i -e 's/overlay2/vfs/g' /etc/sysconfig/docker-storage
$ systemctl start docker
$ systemctl status docker
MacOS silicon chip, m1)) Ansible 컨테이너 실행 명령어
docker run --privileged --itd -p 20022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/ansible-server:m1 /usr/sbin/init
컨테이너에서 실행)
$ systemctl start docker
$ systemctl status docker
SSH 접속 키 생성 ssh-keygen ssh-copy-id root@[접속할 서버 IP]
Ansible PlayBook
key 생성
ssh-keygen
enter
ssh root@172.17.20.4
=> 접속 (계정 입력 후)
ssh-copy-id root@172.17.0.4
ssh root@172.17.0.4
=> (최초에 한번 입력했다면) 바로 접속 됨
실행 옵션 -i : 적용될 호스트들에 대한 파일정봅 -m : 모듈 선택 -k : 관리자 암호 요청 -K : 관리자 권한 상승 –list-hosts : 적용되는 호스트 목록
멱등성
같은 설정을 여러번 적용하더라도 결과가 달라지지 않는다.
echo -e "[mygroup]\n172.17.0.5" >> /etc/ansible/hosts
이를 여러번 실행하면 중복해서 저장이 된다. 그러나 Ansible에서는 위의 작업은 한번만 실행이 된다.
ansible all -m ping
free -h
touch test.txt
# 파일 복사
ansible all -m copy -a "src=./test.txt dest=/tmp"
ansible devops -m yum -a "name=httpd state=present"
Ansible Playbook
사용자가 원하는 내용을 미리 작성해 놓은 파일
- 설치, 파일전송, 서비스 재시작
- 다수의 서버에 반복 작업을 처리하는 경우
Playbook
- vi first-playbook.yml 작성
- ansible-playbook first-playbook.yml
- cat /etc/ansible/hosts
vi first-playbook.yml
---
- name: Add an ansible hosts
hosts: localhost
tasks:
- name: Add an ansible hosts
blockinfile:
path: /etc/ansible/hosts
block: |
[mygroup]
172.17.0.5
위와 같은 yml 파일을 가지고 실행할 수 있음.
ansible-playbook first-playbook.yml
멱등성의 성질이 있기 때문에, 위의 파일을 중복해서 실행하면 해당 내용은 한번만 추가 된 것을 확인할 수 있다.
예제
Ansible playbook 예제 - 파일복사
- name: Ansible Copy Example Local to Remtoe
hosts: devops
tasks:
- name: copying file with playbook
copy:
src: ~/sample.txt
dest: /tmp
owner: root
mode: 0644
sample.txt 파일을 가져와서 복사함. ansible-playbook ansible-playbook.yml
제댈ㄷ도 가져와서 복사하는 것을 확인할 수 있음.
- 다운로드
디렉토리를 설정해서 get_url을 이용해 해당 url에 있는 파일을 가져옴.
---
- name: Download Tomcat9 from tomcat.apache.org
hosts: devops
tasks:
- name: Create a Directory /opt/tomcat9
file:
path: /opt/tomcat9
state: directory
mode: 0755
- name: Download Tomcat using get_url
get_url:
url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
dest: /opt/tomcat9
mode: 0755
checksum: sha512:https://downloads.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz.sha512
해당하는 폴더가 생성이 되고 해당하는 파일이 복사가 될 것임.
Jenkins + Ansible 연동하기
SSH Server를 추가
172.17.0.3 이런식으로 호스트네임을 잡음.
Jenkins에서 Ansible 로 접속할 때는 포트번호를 22로 설정해주면 됨.
Test Ansible module
Docker 이미지 배포
Sample PlayBook
샘플 Playbook Ansible 서버에 배포하기 vi first-devops-playbook.yml https://github.com/joneconsulting/jenkins_cicd_script/blob/master/playbook_script/exam5-devops-playbook1.yml vi first-devops-playbook.yml https://github.com/joneconsulting/jenkins_cicd_script/blob/master/playbook_script/exam5-devops-playbook2.yml
docker 서버에 배포하기 vi create-cicd-project-image-playbook.yml https://github.com/joneconsulting/jenkins_cicd_script/blob/master/playbook_script/create-cicd-project-image-playbook.yml vi create-cicd-project-container-playbook.yml https://github.com/joneconsulting/jenkins_cicd_script/blob/master/playbook_script/create-cicd-devops-container-playbook.yml
playbook을 만들어서 처리해보는 작업을 진행함.