Ansible을 활용한 자동화 구성 관리(22.04.12)

박민선·2022년 4월 12일
0

SSH

  • /etc/ssh/<Key_Pair>
  • ~/.ssh/<Key_Pair>
  • ~/.ssh/known_hosts
  • ~/.ssh/authorized_keys
  • ~/.ssh/config

A(Client) ---SSH---> B(Server)

패스워드 기반의 인증

  1. A는 B의 공개키
    • /etc/ssh/ssh_host_<Algorithm>.pub
    • /etc/ssh/ssh_host_<Algorithm>
      - RSA
      - DSA
      - ECDSA
  2. (B 시스템에 최초 접속시)
    A의 시스템의 사용자에게 B의 공개키(지문) 맞는지 확인?
    - YES
  3. A의 ~/.ssh/known_hosts 파일에 B의 공개키 등록
    • B의 IP/Domain
    • B의 공개키
  4. ID/PWD 묻는다!(인증)

키 기반의 인증

  1. A에서 (인증용)키 쌍을 생성
    ssh-keygen
    ~/.ssh/id_rsa: 개인키
    ~/.ssh/id_rsa.pub: 공개키
  2. B에 A의 공개키 등록
    • B 시스템의 ~/.ssh/authorized_keys : 클라이언트의 공개키 등록
    • EC2(클라우드 인스턴스): A에서 지정한 A의 공개키 등록
    • BM, VM: ssh-copy-id 명령으로 등록
      - B에 패스워드 인증 방법이 화성화 되어 있어야 함
  3. (B 시스템에 최초 접속시)
    A의 시스템의 사용자에게 B의 공개키(지문) 맞는지 확인?
    - YES
  4. A의 ~/.ssh/known_hosts 파일에 B의 공개키 등록
    • B의 IP/Domain
    • B의 공개키
  5. A의 개인키로 인증

기본 로그인 사용자

  • Amazon Linux: ec2-user
  • Ubuntu: ubuntu
  • Debian: debian
  • Centos: centos
  • RHEL: cloud-user
  • vagrant: vagrant
  • ...

서버의 SSH 공개키 지문 확인

ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub

서버의 SSH 공개키 미리 확인

ssh-keyscan 192.168.100.11
ssh-keyscan -t <rsa|ecdsa> 192.168.100.11

지문 확인

ssh-keyscan -t ecdsa 192.168.100.11 | ssh-keygen -l -f -

미리 서버의 공개키 등록

ssh-keyscan -t ecdsa 192.168.100.11 >> ~/.ssh/known_hosts
  • /etc/ssh/ssh_config: 클라이언트 설정 파일
  • /etc/ssh/sshd_config: 서버의 설정 파일

/etc/ssh/sshd_config

PasswordAuthentication no # 패스워드 인증
GSSAPIAuthentication yes # 키 인증

키 기반 인증 구성

Client

ssh-keygen

주의: 실제에서는 패스퍼레이즈를 설정

ssh-keyscan -t ecdsa 192.168.100.11 >> ~/.ssh/known_hosts
ssh-keyscan -t ecdsa 192.168.100.12 >> ~/.ssh/known_hosts
ssh-copy-id vagrant@192.168.100.11
ssh-copy-id vagrant@192.168.100.12

Windows --> Vagrant SSH 접근

vagrant ssh <VM_NAME>
ssh -i .\.vagrant\machines\controller\virtualbox\private_key 192.168.100.10
ssh -i .\.vagrant\machines\node1\virtualbox\private_key vagrant@192.168.100.11
 ssh -i .\.vagrant\machines\node2\virtualbox\private_key vagrant@192.168.100.12

SSH 클라이언트 설정 파일

~/.ssh/config

Host controller
    HostName 192.168.100.10
    User vagrant
    IdentityFile C:\Users\Playdata\vagrant\ansible\.vagrant\machines\controller\virtualbox\private_key

Host node1
    HostName 192.168.100.11
    User vagrant
    IdentityFile C:\Users\Playdata\vagrant\ansible\.vagrant\machines\node1\virtualbox\private_key

Host node2
    HostName 192.168.100.12
    User vagrant
    IdentityFile C:\Users\Playdata\vagrant\ansible\.vagrant\machines\node2\virtualbox\private_key

Ansible 목차

  • Ansible
    - Ansible 아키텍처
    - 설정
    - 모듈
    - 인벤토리
    - Ad-hoc
    - Playbook
    - YAML
    - 변수, 조건문, 반복문
    - 포함, 역할 ...
    - Vault: 암호화
    - AWX: 웹 인터페이스(모니터링)
    - Git, GitHub

IaC?

Infrastructure as Code: 코드형 인프라

장점

  • 비용 절감
  • 빠른 속도
  • 안정성
  • 재사용성
  • 버전 관리

구성 관리 / 배포

구성 관리: Configuration Management
패키지 설치, 설정 파일, 파일 복사 ...
배포: Provisioning
리소스 새로 생성
리소스 변경, 삭제, 관리

구성관리 도구: Ansible, Chef, Puppet, SaltStack ...
배포: Terraform, Vagrant, AWS CloudFormation

가변 인프라 / 불변 인프라

가변: Mutable
Ansible
불변: Immutable
Terraform

참고: 애완동물 vs 소때(가축)

절차적 / 선언적

절차적: 순서O
Ansible
선언적: 순서X
Terraform, Kubernetes

마스터 및 에이전트 유무

마스터, 에이전트: Chef, Puppet, SaltStack

Ansible 맛보기

Ansible 설치
controller

sudo yum install centos-release-ansible-29 -y
sudo yum install ansible -y

ubuntu 일 경우

# sudo apt install software-properties-common
# sudo apt-add-repository --yes --update ppa:ansible/ansible
# sudo apt install ansible

설치 확인

ansible --version

호스트 등록

# vi /etc/ansible/hosts

[test]
192.168.100.122
192.168.100.251

ansible all -m ping #핑확인

인벤토리#

vi inventory.ini
192.168.100.11
192.168.100.12

Ad-hoc 명령:

yum 모듈로 httpd 패키지 설치

ansible 192.168.100.11 -i inventory.ini -m yum -a "name=httpd state=present" -b
  • ansible: ad-hoc 명령
  • 192.168.100.11: 관리 노드(인벤토리 파일 정의 되어 있어야 함)
  • -i inventory.ini: 인벤토리 파일명
  • -m yum: 모듈 이름
  • -a: 모듈 파라미터
  • -b: 관리자 권한 취득(become --> sudo)

https://docs.ansible.com/ansible/2.9/modules/yum_module.html#yum-module

service 모듈로 httpd 서비스 시작

ansible 192.168.100.11 -i inventory.ini -m service -a "name=httpd state=started enabled=yes" -b

https://docs.ansible.com/ansible/2.9/modules/service_module.html#service-module

Playbook:
apache_install.yaml

- hosts: 192.168.100.11
  tasks:
  - yum:
      name: httpd
      state: present
  - service:
      name: httpd
      enabled: yes
      state: started

ubuntu일 경우
apache_install.yaml

- hosts: 192.168.100.11
  tasks:
  - apt:
      name: apache2
      state: present
  - service:
      name: apache2
      enabled: yes
      state: started
ansible-playbook -i inventory.ini apache_install.yaml -b

Ansible?

IT 인프라 구성 관리 자동화 도구

Ansible:

  • YAML: 구성 쉽다
  • OpenSSH: 표준 통신 방식

용어

제어 노드

Control Node, Controller, Ansible Engine
조건: Unix 계열, python

관리 노드

Managed Node, Target Node/Host ...

BM, VM, Instance, Network Device

조건:

  • SSH가 가능한 모든 시스템, Python 설치
  • Windows: WinRM(Windows Remote Management)

인벤토리

  • 정적 인벤토리: 관리 노드의 목록 파일
  • 동적 인벤토리: 클라우드, CMDB에서 관리 노드 목록 가져옴

플러그인

Ansible 기능 확장

모듈

Ansible 작업 실행 할 수 있는 기본 단위
Python Code

Ad-hoc

Ansible 임시 실행
하나의 모듈을 실행

테스크(Task)

하나의 모듈을 실행 --> 하나의 테스크(작업)

플레이

하나 이상의 테스크의 모음

플레이북

하나 이상의 플레이 모음

profile
클라우드신생아

0개의 댓글