[개요]
IaC: Infra as Code
SDDC: SW defiend data center
DevOps: 개발과 운영 문화, 환경파일, 패키지 업데이트
Ansible: 일관성있는 Infra 환경을 제공-Dev-QA-Provisioning
IaC tool: Ansible외에도 20~30 가지
Ansible 의 작동방식
(1) Ad-hoc - command 방식
(2) Playbook - 실제적인 작동방식, YAML로 구현
AWX, Ansible Tower
- Ansible 웹인터페이스(단, 플레이북 그래픽 구성은 안됨)
- 수십대,수백,수천대는 웹기반의 모니터링 필요
[]
Ansible 과정 실습 환경설정
1. VirtualBox 다운로드 및 설치
brew cask install virtualbox virtualbox-extension-pack
2. Vagrant 다운로드 및 설치
3. Vagrant
플러그인 설치
vagrant plugin install vagrant-hostmanager
Box 이미지 다운로드
vagrant box add centos/7
Vagrant 파일
cd
mkdir ansible
Vagrantfile
파일 받아서 Vagrantfile로 저장
4. Vagrant 사용법
상태확인
vagrant status [VM]
시작
vagrant up [VM]
일시중지
vagrant suspend [VM]
재개
vagrant resume [VM]
중지
vagrant halt [VM]
삭제
vagrant destroy [VM]
SSH 연결
vagrant ssh [VM]
스냅샷 확인
vagrant snapshot list [VM]
스냅샷 생성
vagrant snapshot save [VM]
스냅샷 복구
vagrant snapshot restore [VM]ㅣ
공유폴더 동기화
공유폴더 동기화는 Vagrantfile이 있는 현재 디렉토리와 VM의 /vagrant 파일이 기본 동기화 됨
공유폴더 동기화가 되는 시점은 vagrant up 명령을 실행할 때만 동기화 됨
vagrant rsync [VM]
5. Playbook 작성을 위한 에디터 도구 팁
1) vi/vim
vim-enhanced 패키지 필요
.vimrc
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
2) ATOM
3) Visual Studio Code
brew cask install visual-studio-code
Window: SSH보다는 WinRM으로 접근
- Windows Sever는 최신 버전만 제공
(DSL을 사용, 세부적 구성이 가능)
[Vagrantfile]
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config
config.vm.define "controller" do |config
config.vm.box = "centos/7"
config.vm.provider "virtualbox" do |vb
vb.name = "controller"
vb.cpus = 2
vb.memory = 2048
end
config.vm.hostname = "controller"
config.vm.network "private_network", ip: "192.168.56.100"
end
config.vm.define "host1" do |config
config.vm.box = "centos/7"
config.vm.provider "virtualbox" do |vb
vb.name = "host1"
vb.cpus = 1
vb.memory = 1024
end
config.vm.hostname = "host1"
config.vm.network "private_network", ip: "192.168.56.101"
end
config.vm.define "host2" do |config
config.vm.box = "centos/7"
config.vm.provider "virtualbox" do |vb
vb.name = "host2"
vb.cpus = 1
vb.memory = 1024
end
config.vm.hostname = "host2"
config.vm.network "private_network", ip: "192.168.56.102"
end
# Hostmanager plugin
config.hostmanager.enabled = true
config.hostmanager.manage_host = 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/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd
SHELL
end
[Vagrant hostmanager 설치/ centos/7 박스설치]
[Vagrant up 실행]
호스트1, 2 생성
[Virtualbox에서 확인]
(참고) io.rb: 32 error
- UTF-8 인코딩
VM 확인
[Ansible architecture]
1. Controller: 윈도우는 안됨, 안시블 엔진이 설치됨
2. 관리노드: 리눅스, 윈도우 가능
3. 연결플로그인: OpenSSH (Persist Control) 가 없으면 파이썬 SSH를 사용, 비SSH기반 플러그인(WinRM, Paramiko 등)
4. 인벤토리: 호스트에 대한 정의 yaml , ini(preferred)
5. Module: 싷행명령, 간단한 작업을 코드로 변환해보고 모듈을 찾아보라~
6. 작업: 모듈 집합, 애드혹 방식에서 커맨드는 하나의 모듈(작업)만 가능, 플레이북은 여러 모듈 선언 가능
7. 플레이북: 관리노드에서 실행할 모듈을 인자와 함께 YAML로 정의한 파일, 플레이(=태스크 셋)
- 야구광인 관계로 야구용어가 많이 나옴
CMDB: Config. man. DB(당사의 환경구성)
Inventory: Static vs. Dynamic(검색하고 검색리턴을 위한 프로그래밍, json형태로 리턴)
- 구글링 dynamic inventory example
vagrant status [VM]
Vagrant 사용법
상태확인
vagrant status [VM]
시작
vagrant up [VM]
일시중지
vagrant suspend [VM]
재개
vagrant resume [VM]
중지
vagrant halt [VM]
삭제
vagrant destroy [VM]
SSH 연결
vagrant ssh [VM]
일반적으로 관리자의 패스워드는 설정하지 않음
su는 전환하려는 사용자의 패스워드를 입력
sudo는 내 패스워드를 입력
[계정 만드는 팁]
1. Ansible 전용(공통) 계정 (vagrant)
2. pw-less sudo
3. SSH key-pair - managed node 에 복사
- 레드햇의 상용버전에는 ldap, AD 와 연동 가능
암호=vagrant%vagrant 에서 %는 그룹이라는 의미
-b : become (previage escalation -> sudo)
netconf: network device
p73
사용자마다 설정파일을 달리 하고자 할때
컬러는 출력색 설정
2080개의 모듈
멱등성: f(f(x)) = f(x) idempotence
ansible host1 -m copy -a 'src=/tmp/hello.txt dest=/tmp mode=666' : 변경안함
ansible host1 -m copy -a 'src=/tmp/hello.txt dest=/tmp mode=664' : 변경함
IaC 도구는 멱등성을 보장해야 한다.
한번을 실행하든 100번실행하든 그 결과는 같아야 한다.
- 몇몇 모듈은 멱등성을 제공하지 않는다(의미상 그런 대표경우: state=touch)
fetch
remote_src: 원격에서 원격으로 복사
$ansible host1 -m copy -a 'content="hello world" dest=/tmp/hello2.txt'
$ansible host1 -m command
file
- state 옵션의 선택값 Choices: absent, directory, ...
$ansible host1 -m file -a 'path=/tmp/abc state=touch'
$ansible host1 -m file -a 'path=/tmp/abc' (default : file)
$ansible host1 -m file -a 'path=/tmp/abc state=directory'
$ansible host1 -m file -a 'path=/tmp/abc state=absent'
$ansible host1 -m command -a 'ls /tmp'
[패키지]
yum
- state: install(present, installed, latest), remove(absent, removed)
$ansible host1 -m yum -a 'name=httpd'
$ansible host1 -m yum -a 'name=httpd state=installed' -b
$ansible host1 -m yum -a 'name=httpd state=installed' -b
$ansible host1 -m yum -a 'name=httpd state=absent' -b
$ansible host1 -m yum -a 'name=httpd state=absent' -b
$ansible host1 -m user -a 'name=abc' -b
service