본문 바로가기
Ansible

Ansible 기본

by 손영진 2023. 8. 16.
728x90

#1 Terraform과 Ansible의 차이

   1. Terraform

  • 오픈 소스 프로젝트
  • 안전하고 반복 가능한 방식으로 인프라를 구축, 변경 및 관리하기 위한 도구
  • 주로 CLI 전용이지만 널리 사용되는 퍼블릭 클라우드 집합과 잘 통합
  • 고정된 클라우드 인프라 세트를 프로비저닝하고 나중에 해체하는데 탁월

   2. Ansible

  • IT 자동화 도구
  • 시스템을 구성하고, 소프트웨어를 지속적으로 배포 및 다운타임 없는 롤링 업데이트와 같은 고급 IT 작업을 오케스트레이션 가능
  • 단순성과 사용 편의성에 중점

   3. 비교

  • 공통점
    • 오픈 소스 CLI 전용버전이 있다
    • 웹 UI 또는 SSO와 같은 엔터프라이즈 기능과 함께 사용 가능
  • 차이점
    • Ansible : 다목적 자동화도구
    • Terraform : 코드 도구로서의 인프라

 

#2 Ansible 개념

   1. 정의

  • DevOps(개발과 운영) 환경에서 다수의 서버를 효율적으로 관리하기 위한 환경 구성 자동화 도구
  • 사용성 또는 확장성에서 두각

   2. CI & CD

  • 애플리케이션 개발 단계를 자동화하여 보다 짧은 주기로 고객에게 제공
  • 지속적인 자동화와 모니터링
  • 사례 : CI/CD 파이프라인
  • CI ( Continuous Integration )
    • 자동화 프로세스인 지속적인 통합을 의미
    • 성공적인 구현 시 새로운 변경 사항이 정기적으로 빌드 및 테스트되어 공유 및 통합
  • CD ( Continuous Delivery )
    • 최소한의 노력으로 새로운 코드를 배포하는 것
    • 자동으로 업로드, 실시간 프로덕션 환경 배포

   3. IaC

  • Infrastructure as Code
  • 인프라 운영 코드로 개발하여 관리하는 도구 -> 프로그래밍형 인프라
  • 자체적으로 VM생성하고 오케스트레이션하는 스크립트 포함

 

#3 Ansible 구조

   1. 기본 구조

  • Control Node : 중앙 제어 노드로 Ansible이 설치되는 Node
  • Managed Node : Control Node에 의해 관리가 되는 대상 서버로 hosts에 등록된 대상
  • Modules
    • 미리 정의된 실행 단위, 수백 개의 유용한 모듈 제공
    • yum 모듈을 통해 패키지를 설지할지 삭제할지 등을 명시
  • Inventory
    • IaC 대상이 될 서버 목록 정의 파일
    • 대상에 대한 이름 지정 시 Hosts 파일에 저장
  • Playbook
    • yaml포맷으로 되어 있는 파일, Inventory에서 정의된 서버들에 무엇을 해야 할 지 정의
    • 일반적으로 Ansible을 사용한다면 Playbook을 사용한다는 의미
    • 단독이 아닌 Inventory와 함께 사용
    • 멱등(idempotent) 되도록 설계 -> 연산을 여러번 적용해도 결과는 달라지지 않는 성질

 

#4 Ansible 환경 구성

   1. Amazon Linux 2 기반으로 4대의 인스턴스 생성

  • 보안 그룹 : ssh, http, https
  • 각 인스턴스로 접속하여 /etc/hosts 파일에 각 노드 IP 등록

<< 4개의 Node에 접속후 기본설정>>
			// control을 각 hostname에 맞게 변경
sudo -i		// root 계정으로 변환
hostnamectl set-hostname control.example.com
hostname		// 변경사항 확인
bash

ifconfig		// 해당 노드의 IP 확인

vim /etc/hosts
>[각 노드의 IP]	control.example.com	control

passwd		//root 계정의 비밀번호 생성

 

   2. 각 노드의 연동

  • ssh-key 생성만 control에서 실행, 나머지는 4대의 인스턴스에서 동일 실행
  • 비밀번호 접근에 대한 허용은 각 server만 실행
<< 사용자 nana 생성 및 비밀번호 설정>>
useradd nana
passwd nana
su - nana

<< SSH Key 생성 >>
mkdir .ssh
ssh-keygen -t rsa		// 암호없이 생성
ls -l .ssh
			// 생성된 두개의 키 확인 ( ex> id_rsa, id_rsa.pub)
            
<< 비밀번호 접근에 대한 허용 >>
vim /etc/ssh/sshd_config		<그림1 참조>
systemctl restart sshd
            
<< nana 사용자에게 root 권한 부여>>
exit		// nana 계정에서 다시 root 계정으로
usermod -aG wheel nana
-> 결과값 : wheel:x:10:ec2-user,nana
vim /etc/sudoers		// passwd를 묻지 않게 설정 <그림2 참조>

<< 권한 확인 >>
su - nana
sudo yum install vsftpd -y
			// 정상적인 권한 부여 시 설치 양호

그림 1

그림 2

 

   3. 연동 확인

<< control 계정 >>
su - nana
ssh-copy-id nana@servera		// control 서버의 nana 계정에 생성된 key를 각 서버에 복사
ssh-copy-id nana@serverb
ssh-copy-id nana@serverc

ssh nana@servera		// 각 서버에 접속 확인

 

   4. Ansible 설치 및 동작 확인

  • ansible.cfg
  • 더보기
    [defaults]
    inventory = ./inventory
    remote_user = nana           # 어떠한 계정으로 접속할 것인지
    ask_pass = false                 # passwd 를 물을지 말지

    [privilege_escalation]
    become = true
    become_method = sudo
    become_user = root
    become_ask_pass = false   # root의 passwd를 물을지 말지
sudo amazon-linux-extras install -y epel
sudo yum install -y ansible

<< inventory 파일 작성, 관리 대상 목록 >>
vim inventory
> servera
> serverb
> serverc

vim ansible.cfg		<더보기 참조>
ansible --version
ansible servera -m ping		<그림 참조>
			// ansible [inventory에서의 대상이름] [module] [play] 순서
			// 해당 결과가 pong 인것을 확인
            
            
계속해서 생기는 경고는 ansible.cfg 파일의 default에 아래의 명령어 추가 -> warning일 뿐 오류는 아님
> interpreter_python=/usr/bin/python 또는 python3

 

#5 Ansible Inventory 파일

   1. 변수

  • 전역 변수 : /etc/ansible/hosts
    • 지역변수인 inventory보다 우선순위가 낮음
    • 전체 사용자에게 적용되는 inventory 파일
  • 지역 변수 : inventory
  • 변수 파일 안에 아래의 그림처럼 그룹을 지정 가능

 

   2. 실습

  • Inventory 생성 및 확인
<< nana@control에서 실행 >>
sudo vim /etc/ansible/hosts
> servera.example.com
> [webservers]
> serverb.example.com
> [dbservers]
> serverc.example.com

ansible --list-hosts		<그림 참조>
andible ungrouped --list-hosts
andible webservers --list-hosts

 

  • 사용자 정의 Inventory 생성 및 확인
mkdir deploy-inventory
cd deploy-inventory
vim inventory		<더보기 참조>
ansible all -i inventory --list-hosts
ansible ungrouped -i inventory --list-hosts
ansible production -i inventory --list-hosts
ansible busan -i inventory --list-hosts
ansible korea -i inventory --list-hosts

 

  • ansible.cfg 생성 및 확인
    • inventory
    • 더보기
      [myself]
      localhost

      [intraweb]
      servera.example.com

      [externalweb]
      serverb.example.com

      [webservice]
      serverc.example.com

      [web:children]
      intraweb
      externalweb
      webservice
    • ansible.cfg
    • 더보기
      [defaults]
      inventory = ./inventory
      remote_user = nana
      ask_pass = false
      [privilege_escalation]
      become = true
      become_method = sudo
      become_user = root
      become_ask_pass = true    // false로 바꿀 시 비밀번호 묻지 않음
mkdir deploy-config
cd deploy-config
vim ansible.cfg
> [defaults]
> inventory = ./inventory
> interpreter_python=/usr/bin/python3

vim inventory	<더보기 참조>
ansible intraweb -m ping		<그림 참조>
ansible intraweb --list-hosts


-> ansible.cfg 의 내용을 바꿀 시 비밀번호를 물어보고 해당 내용을 보여준다
-> <더보기 참조>

 

  • ad-hoc 명령어 사용
    • ansible.cfg
    • 더보기
      [defaults]
      inventory = ./inventory
      remote_user = nana
      ask_pass = false

      [privilege_escalation]
      become = true
      become_method = sudo
      become_user = root
      become_ask_pass = false
    • inventory
    • 더보기
      [webservers]
      server[a:c].example.com
      [seoul]
      servera.example.com
      [busan]
      serverb.example.com
      serverc.example.com
      [development]
      serverc.example.com
      [production]
      servera.example.com
      serverb.example.com
      [korea:children]
      seoul
      busan
mkdir ansible
cd ansible

vim ansible.cfg
vim inventory

<< command와 shell 모듈의 차이 >>

ansible seoul -m command -a 'echo "hello world" > index.html'
			// redirection을 지원하지 않기 때문에 ls -l을 통하여 확인 불가
ansible seoul -m shell -a 'echo "hello world" > index2.html'
ansible seoul -m command -a 'ls -l'
		// index2.html만 확인
        
ansible seoul -m command -a 'cat /etc/passwd | grep nana'
> failed		pipeline 또한 지원하지 않음
ansible seoul -m shell -a 'cat /etc/passwd | grep nana'
> changed


-> ansible의 명령어를 통해 지속적인 경고 시 아래 명령어 추가
> ansible.cfg
[default]
> command_warnings=false 추가

  • ad-hoc 명령어 사용 - httpd
ansible busan -m shell -a 'yum install httpd -y'
ansibel busan -m shell -a 'echo "apache web server" > /var/www/html/index.html
ansible busan -m shell -a 'cat /var/www/html/index.html'		<그림 참조>

  • ad-hoc 명령어 사용 - file / 파일, 디렉토리 생성
ansible seoul -m file -a 'path=module state=directory mode=0755'
ansible seoul -m command -a 'ls -l'
ansible seoul -m file -a 'path=module/test.txt state=touch mode=0755 owner=nana'
		<그림1 참조>
        
<< 삭제 >>
ansible seoul -m file -a 'dest=module/test.txt state=absent'
ansible seoul -m file -a 'dest=module state=absent'
		<그림2 참조>
그림 1

그림 1


그림 2

 

'Ansible' 카테고리의 다른 글

Ansible 반복문과 조건문  (0) 2023.08.21
Ansible 복습문제 2  (1) 2023.08.18
Ansible-playbook & multiple  (0) 2023.08.17
Ansible 복습문제  (0) 2023.08.17