인프라를 웹 인터페이스 및 대화형식의 도구를 사용해 수동적으로 인프라를 구성하는 것이 아닌, 시스템이 읽을 수 있는 인프라 정의 파일을 통해 인프라의 구성 관리 및 배포를 자동화 하는 것을 의미한다.
비용절감: 사람의 노력적인 측면에서 인프라 관리를 수동적으로 하지 않음으로 다른 생산적인 작업에 노력을 집중할 수 있음
빠른 속도: 인프라 구성 관리 및 배포를 자동화 함으로 신속한 실행을 가능하게 하고,효율적으로 작업할 수
있는 가시성을 제공
안정성: 수동으로 구성할 때와 같은 사람의 실수와 관련 위험을 제거할 수 있음
코드화 및 버전 관리: 표준화된 포맷과 규칙으로 작성된 코드 문서를 통해 누구나 읽을 수 있고 확인할 수 있다. 또한 코드는 변경 사항 이력을 남길 수 있어 추후 문제 발생 시 어떤 부분이 변경되어 발생한 문제인지 확인하기 쉬움
재사용성: 인프라를 코드화 하고 관련 리소스를 그룹 및 모듈화 해서 필요 시 필요한 부분을 재사용 할 수 있음
💡IaC 관리 도구
구성 관리
- 물리(Baremetal) 시스템, 가상 컴퓨터 및 클라우드 인스턴스 내에서 패키지 설치, 애플리케이션
구성, 운영체제 관련 구성 및 구성 변경을 관리하는 도구- Ansible, Chef, Puppet, SaltStack 등
배포
- 새로운 인프라 리소스를 배포하고 이미 배포된 인 프라 리소스의 생명 주기를 관리하는 도구
- AWS CloudFormation, OpenStack Heat, Terraform 등
💡 구성요소
마스터(master)
- 인프라의 정보와 구성 관리 및 배포를 위한 정보를 가지고 있음
- 장점 : 중앙 집중화 된 관리 및 모니터링이 가능
- 단점 : 추가적인 리소스의 필요, 마스터의 관리, 장애 등이 존재
에이전트(node)
- 서버가 관리할 인프라에 에이전트 소프트웨어가 설치되어 있음
애플리케이션 및 IT 인프라를 자동화 할 수 있는 도구이다. Ansible의 주요 목적은 간결성과 사용 용이성이며 또한 보안과 신뢰성을 바탕으로 OpenSSH를 기본 전송 방법으로 사용한다.
Ansible이 설치된 모든 호스트 노드로 컨트롤 노드에서는 ansible 또는 ansible-playbook 명령을 이용하여 작업을 실행할 수 있다.
컨트롤 머신에서 접근하여 모듈을 설치하고, 원격의 명령을 실행하는 작업을 수행하는 시스템으로 쉽게 말해 컨트롤 머신에 관리되는 시스템을 의미한다.
Ansible의 핵심 기능을 확장할 수 있도록 다양한 플러그인을 제공한다.
-> Action, Become, Cache, Callback, Cliconf, Connection, Httpapi, Inventory, Netconf, Lookup, Shell, Strategy, Vars
관리 노드의 목록으로, 관리 노드에 대한 호스트 이름이나 IP 주소와 같은 정보를 지정한다. 여러 관리 노드를 그룹으로 조직화 할수 있고, 중첩 그룹을 사용할 수 있다.
Ansible을 실행하는 Python 코드 단위이다. 각 모듈은 호스트에 패키지를 설치 및 관리하고, 데이터베이스의 사용자를 관리하고, 네트워크 장치의 VLAN 인터페이스를 관리할 수 있는 등 약 3000개의 모듈이 있다.
Ansible의 작업 실행 단위를 말한다. 하나의 모듈이 하나의 작업이 되며, Ad-hoc 명령을 통해 단일 작업을 실행하거나, 플레이북을 작성해 여러작업을 실행할 수 있다.
Ansible 명령을 이용하여 단일 작업을 실행할 수 있다.
특정 관리 노드를 대상으로한 순서가 지정된 작업 목록이다.
관리 노드에서 실행할 모듈을 인자와 함께 정의한 파일이다. YAML로 작성되며, Ansible의 핵심이라 볼 수 있다. ansible-playbook 명령을 이용해 플레이북을 실행할 수 있다.
작업 크기: 모듈 < 작업(task) < 플레이(play) < 플레이북(play book)
시스템 유형으로 컨트롤 머신과 관리 노드가 있음
컨트롤 로드에 Ansible이 설치되며, 관리 노드들은 컨트롤 머신에 의해 유지되거나 관리됨
시스템 관리자는 컨트롤 로드에 로그인하여 플레이북 또는 원격 전송 명령을 사용하여 관리 노드를 제어할 수 있고, 이때 인벤토리에 저장된 관리 노드들을 패턴 형식으로 지정하여 제어할 수 있음
컨트롤 로드는 기본적으로 SSH를 사용하여 관리 노드와 통신
버추얼 박스 다운로드: platform packages 및 Extension Pack 설치 버추얼 박스 다운로드
Vagrant 다운로드 및 설치
설치 파일 및 패키지(수동 설치) : 설치파일 다운로드
vagrant 설치 후 cmd 나 파워쉘 등등 cli 환경 실행
플러그인 설치
vagrant plugin install vagrant-hostmanager
vagrant plugin install vagrant-disksize
vagrant plugin list
vagrant box add ubuntu/bionic64
vagrant box list
mkdir c:\ansi
cd ansi
Vagrantfile 파일 작성
(중요:vagrant 명령어를 실행할 위치에 Vagrantfile이 있어야 함.)
Vagrantfile 내용
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.define "ansi-master1" do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.provider "virtualbox" do |vb|
vb.name = "ansi-master1"
vb.cpus = 2
vb.memory = 3072
end
config.vm.hostname = "ansi-master1"
config.vm.network "private_network", ip: "192.168.56.11"
config.disksize.size = "30GB"
end
config.vm.define "ansi-node1" do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.provider "virtualbox" do |vb|
vb.name = "ansi-node1"
vb.cpus = 2
vb.memory = 3072
end
config.vm.hostname = "ansi-node1"
config.vm.network "private_network", ip: "192.168.56.21"
config.disksize.size = "30GB"
end
# Hostmanager plugin
config.hostmanager.enabled = true
config.hostmanager.manage_guest = true
# Enable SSH Password Authentication
config.vm.provision "shell", inline: <<-SHELL
sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
sed -i 's/archive.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
sed -i 's/security.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list
systemctl restart ssh
SHELL
end
status
Master | IP | CPU | Memory | Disk |
---|---|---|---|---|
ansi-master1 | 192.168.56.11/24 | 2 | 3072MB | 30G |
Node | IP | CPU | Memory | Disk |
---|---|---|---|---|
ansi-node1 | 192.168.56.21/24 | 2 | 3072MB | 30G |
Node | IP | CPU | Memory | Disk |
---|---|---|---|---|
ansi-node2 | 192.168.56.22/24 | 2 | 3072MB | 30G |
Node | IP | CPU | Memory | Disk |
---|---|---|---|---|
ansi-node3 | 192.168.56.23/24 | 2 | 3072MB | 30G |
VM 배포
vagrant up
VM 상태확인
vagrant status
# vagrant ssh ansi-master1
이 방법도 가능하지만 우리는 밑에 방법으로 접속할 것이다.
ssh vagrant@192.168.56.11 (master1의 IP주소)
password: vagrant
# ID/PW : vagrant/vagrant
ssh-keygen
ssh-copy-id vagrant@localhost
ssh-copy-id vagrant@ansi-node1
ssh-copy-id vagrant@ansi-node2
ssh-copy-id vagrant@ansi-node3
sudo apt update
sudo apt install -y software-properties-common
sudo apt-add-repository -y -u ppa:ansible/ansible
sudo apt install -y ansible
#Ansible 명령 쉘 자동완성
sudo apt install -y python3-argcomplete
sudo activate-global-python-argcomplete3
#Ansible Lint 설치
sudo apt install -y ansible-lint
exec bash
버추얼 박스로 가서 모든 가상머신을 종료하고 현재 상태를 스냅샷을 찍어둔다.
60번 62번에 ' \n ' 추가
바뀐모습
기타 명령어
- VM 종료
vagrant halt- VM 스냅샷 생성
vagrant snapshot save 스냅샷명- VM 스냅샷 적용
vagrant snapshot restore 스냅샷명
Ansible의 작동 방식을 구성하는 파일이다. 인벤토리 파일의 위치, 관리 노드에 연결하는 방법, 연결 한 후 작동 방법 등 무수히 많은 구성을 지정할 수 있다.
기본 Ansible 구성 파일의 위치는 /etc/ansible/ansible.cfg
Ansible 구성 파일 우선 순위
① ANSIBLE_CONFIG 환경 변수
② 현재 디렉토리의 ansible.cfg
③ 홈 디렉토리의 ~/.ansible.cfg
④ /etc/ansible/ansible.cfg
▪ 우선 순위가 높은 파일에 정의된 값이 이전 정의된 값보다 우선
ansible.cfg 구성 파일 설정
[default] 섹션
inventory: 인벤토리 파일의 위치 (기본: /etc/ansible/ansible.cfg)
remote_user: SSH 인증하기 위한 사용자 (기본: 현재 사용자)
ask_pass: SSH 인증하기 위한 패스워드 요청/입력 여부 (기본: false)
[privilege_escalation] 섹션
become: 권한 상승 여부 (기본: false)
become_method: 권한 상승 방법 (기본: sudo)
become_user: 권한 상승할 사용자 (기본: root)
become_ask_pass: 권한 상승 방법의 패스워드 요청/입력 여부 (기본:false)
cp /etc/ansible/ansible.cfg ./
vi ansible.cfg
:% d (수행 모든 내용 제거)
# 아래 내용 복사해서 붙여넣기
[defaults]
inventory = /home/vagrant/ansitest/inventory
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
ansible-config view 명령을 통해 확인해보면 저장한 내용을 볼 수 있다.
Ansible은 인프라에 존재하는 여러 호스트를 관리한다. 호스트의 목록 또는 그룹을 지정한 인벤토리 파일이 필요하며 인벤토리가 정의되면 패턴을 사용하여 Ansible을 실행할 노드 또는 그룹을 선택한다.
vi inventory
#all:모든 호스트 포함, ungrouped: 그룹에 속하지 않은 모든 호스트 포함
[all]
ansi-master1
[AA]
ansi-node1
ansi-node2
[BB]
ansi-node2
ansi-node3
[CC]
ansi-node1
ansi-node3
# 중첩그룹
[ABC:children]
AA
BB
# /etc/hosts에 IP가 등록되어 있기에 이름을 사용가능
ansible all --list-hosts
ansible ungrouped --list-hosts
Ad-hoc 명령 또는 플레이북을 실행할 때 작업을 실행할 관리 노드 또는 그룹을 지정할 때 패턴을 이용해 관리 노드를 선택할 수 있다. 패턴은 단일 호스트, IP 주소, 인벤토리 그룹을 참조할 수 있고 집합, 와일드카드, 정규화 표현식 등도 사용이 가능하다.
Ad-hoc 명령
ansible < pattern> < options>
플레이북
hosts: < pattern>
특수 문자를 표시하기 위해 앞에 \(역슬래쉬)를 넣어주어야 한다.
제외 그룹 : webservers:\!west
교차 그룹 : webservers:\&east
실습
vi testhosts
[all]
192.168.56.11
192.168.56.21
192.168.56.22
192.168.56.23
[groupA]
ansi-master1
[groupB]
ansi-node2
ansi-node3
[groupC]
ansi-node1
[groupD]
ansi-node1
ansi-node2
사용 예시
ansible \ --list-hosts -i testhost
ansible ansi-node1,ansi-node2 --list-hosts -i testhost
ansible ansi:node1,ansi-node2 --list-hosts -i testhost
ansible groupA:groupB --list-hosts -i testhost
ansible groupA:\!groupB --list-hosts -i testhost
ansible groupC:\&groupC --list-hosts -i testhost
ansible 192.168.56.\ --list-hosts -i testhost
ansible 192.168.56.2\* --list-hosts -i testhost
ansible \~'192.168.56.2(1|2)' --list-hosts -i testhost
모듈은 Ansible을 이용해 관리 노드에 작업을 실행하는 핵심 요소이다. 모듈은 Python 코드로 이루어져 있으며 /usr/lib/python3/dist-packages/ansible 경로에 있다.
ansible-doc 명령을 이용해 모듈의 목록을 확인하고, 모듈의 사용법을 확인할수 있음
모듈 목록 확인
ansible-doc -l
특정 모듈 확인
ansible-doc <module_name>
자주 사용되는 모듈
- 명령 모듈
command: 명령 실행(Python O, Shell X)
raw: 명령 실행(Python X, Shell X)
script: 스크립트 실행
shell: 쉘 명령 실행(Python O, Shell O)
- 파일 모듈
archive: 압축 생성
blockinfile: 텍스트 파일에 블록 삽입업데이트삭제
copy: 파일 복사
fetch: 파일 가져오기
file: 파일 및 속성 관리
lineinfile: 텍스트 파일에 행 관리
replace: 텍스트 파일의 문자열 관리
synchronize: rsync 동기화
template: Jinja2 템플릿
unarchive: 압축 해제
- 네트워크 도구 모듈
get_url: HTTP/S, FTP 파일 다운로드(wget)
uri: 웹 서비스와 상호작용(curl)
- 패키지 모듈
gem: Ruby Gems
npm: Node.js 패키지 관리
pip: Python 라이브러리 관리
apt: Debian/Ubuntu 패키지 관리
package: 일반적인 OS 패키지 관리
dnf: dnf 패키지 관리
yum: yum 패키지 관리
- 소스 제어 모듈
git: git 관리
github*: github 관련 모듈
gitlab: gitlab 관련 모듈
bitbucket_: bitbucket 관련 모듈
- 시스템 모듈
cron: crontab 관리
filesystem: 파일시스템 관리
firewalld: Firewalld 관리
iptables: iptables 관리
lvg: LVM 볼륨 그룹 관리
lvol: LVM 논리 볼륨 관리
mount: mount 관리
parted: 파티션 관리
ping: 원격 호스트 연결 시도
reboot: 호스트 재부팅
service: 서비스 관리
ufw: UFW 방화벽 관리
- 플러그인 종류:
become
cache
callback
cliconf
connection
httpapi
inventory
netconf
lookup
shell
module (기본값)
strategy
vars
Ansible ad-hoc 명령은 하나 이상의 관리 노드에 단일 작업을 실행하는 임시명령이다. 임시 명령은 거의 반복하지 않는 간단한 작업에 주로 사용한다. (서버 재부팅, 파일 관리, 패키지 관리, 사용자 및 그룹 관리, 서비스 관리, 팩스 변수 수집)
Ad-hoc 명령 사용
ansible [pattern] -m [module] -a "[module options]"
-m: 모듈 이름 지정(기본값: command)
-a: 모듈의 옵션/아규먼트
ping 보내기
ansible ansi-node1 -m ping
command
ansible ansi-node3 -m command -a "/sbin/reboot"
ansible ansi-node3 -m command -a "/sbin/poweroff"
ansible ansi-node3 -a "/sbin/poweroff"
시스템 reboot
ansible ansi-node3 -m reboot
파일 복사
ansible AA -m copy -a "src=/home/vagrant/ansitest/testfile dest=/
home/vagrant/"
※ 소유자가 root로 되어있는데 이는 위에서 ansible.cfg파일에[privilege_escalation] become=True로 되어있기 때문이다.
이를 False로 바꾼 뒤 실행해주면 vagrant로 소유자가 바뀌는 것을 확인 할 수 있다.
파일 권한 변경
ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
파일 소유권 변경
ansible webservers -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
파일 삭제
ansible webservers -m file -a "dest=/path/to/c state=absent"
패키지 설치(업데이트 X)
ansible ansi-node3 -m apt -a "name=apache2 update_cache=yes state=preset"
ansible ansi-node3 -m apt -a "name=apache2 state=present"
ssh ansi-node3 systemctl status apache2
특정 버전 패키지 설치
ansible webservers -m apt -a "name=acme=1:0.96.4-5 state=present"
service 중지, 재시작
# service 중지
ansible ansi-node3 -m service -a "name=apache2 state=stopped"
ssh ansi-node3 systemctl status apache2
# service 재시작
ansible ansi-node3 -m service -a "name=apache2 state=started"
ssh ansi-node2 systemctl status apache2
패키지 제거
ansible webservers -m apt -a "name=acme state=absent"
사용자 생성
ansible all -m user -a "name=foo password=< crypted password here>"
사용자 제거
ansible all -m user -a "name=foo state=absent"