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을 만들어서 처리해보는 작업을 진행함.