brunch

You can make anything
by writing

C.S.Lewis

by 가필드의 인사이트 Jul 03. 2019

Cloud DevOps, Ansible

CCCR 20190513~0516

[개요]

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 웹인터페이스(단, 플레이북 그래픽 구성은 안됨)

- 수십대,수백,수천대는 웹기반의 모니터링 필요


[]

https://github.com/c1t1d0s7/cccr-ansible/blob/master/Ansible-README.md

Ansible 과정 실습 환경설정

1. VirtualBox 다운로드 및 설치

Windows

macOS
또는

brew cask install virtualbox virtualbox-extension-pack

VirtualBox Extendtion Pack

2. Vagrant 다운로드 및 설치

Windows  : Win7은 안됨
macOS

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

ATOM

3) Visual Studio Code

VSCODE
또는


brew cask install visual-studio-code



Window: SSH보다는 WinRM으로 접근

 - Windows Sever는 최신 버전만 제공


https://github.com/opsmop/opsmop

(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


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari