[쿠버네티스 1/30] ansible - 초기 세팅 & 구성 파일 분석

신현식·2023년 1월 30일
0

구름_Ansible

목록 보기
1/5
post-thumbnail

IaC(Infrastructure as Code)코드형 인프라

인프라를 웹 인터페이스 및 대화형식의 도구를 사용해 수동적으로 인프라를 구성하는 것이 아닌, 시스템이 읽을 수 있는 인프라 정의 파일을 통해 인프라의 구성 관리 및 배포를 자동화 하는 것을 의미한다.

  • 인프라는 물리적 하드웨어 뿐만 아니라 가상 컴퓨터, 클라우드 등 관련 리소스를 IaC를 통해 구성 관리 및 배포 가능

IaC 장점

비용절감: 사람의 노력적인 측면에서 인프라 관리를 수동적으로 하지 않음으로 다른 생산적인 작업에 노력을 집중할 수 있음

빠른 속도: 인프라 구성 관리 및 배포를 자동화 함으로 신속한 실행을 가능하게 하고,효율적으로 작업할 수
있는 가시성을 제공

안정성: 수동으로 구성할 때와 같은 사람의 실수와 관련 위험을 제거할 수 있음

코드화 및 버전 관리: 표준화된 포맷과 규칙으로 작성된 코드 문서를 통해 누구나 읽을 수 있고 확인할 수 있다. 또한 코드는 변경 사항 이력을 남길 수 있어 추후 문제 발생 시 어떤 부분이 변경되어 발생한 문제인지 확인하기 쉬움

재사용성: 인프라를 코드화 하고 관련 리소스를 그룹 및 모듈화 해서 필요 시 필요한 부분을 재사용 할 수 있음

💡IaC 관리 도구

구성 관리

  • 물리(Baremetal) 시스템, 가상 컴퓨터 및 클라우드 인스턴스 내에서 패키지 설치, 애플리케이션
    구성, 운영체제 관련 구성 및 구성 변경을 관리하는 도구
  • Ansible, Chef, Puppet, SaltStack 등

배포

  • 새로운 인프라 리소스를 배포하고 이미 배포된 인 프라 리소스의 생명 주기를 관리하는 도구
  • AWS CloudFormation, OpenStack Heat, Terraform 등

💡 구성요소

마스터(master)

  • 인프라의 정보와 구성 관리 및 배포를 위한 정보를 가지고 있음
  • 장점 : 중앙 집중화 된 관리 및 모니터링이 가능
  • 단점 : 추가적인 리소스의 필요, 마스터의 관리, 장애 등이 존재

에이전트(node)

  • 서버가 관리할 인프라에 에이전트 소프트웨어가 설치되어 있음

Ansible

애플리케이션 및 IT 인프라를 자동화 할 수 있는 도구이다. Ansible의 주요 목적은 간결성과 사용 용이성이며 또한 보안과 신뢰성을 바탕으로 OpenSSH를 기본 전송 방법으로 사용한다.

  • 컨트롤 로드는 리눅스나 유닉스 시스템만 가능
  • 관리 노드는 어떠한 시스템이든 상관없음
  • 컨트롤 로드든 관리 노드든 파이썬이 설치되어 있어야 함

Ansible 주요 용어

컨트롤 노드(master)

Ansible이 설치된 모든 호스트 노드로 컨트롤 노드에서는 ansible 또는 ansible-playbook 명령을 이용하여 작업을 실행할 수 있다.

  • Python이 설치된 모든 호스트를 제어 노드로 사용할 수 있음
  • Windows 호스트를 컨트롤 노드로 사용할 수 없음

관리 노드

컨트롤 머신에서 접근하여 모듈을 설치하고, 원격의 명령을 실행하는 작업을 수행하는 시스템으로 쉽게 말해 컨트롤 머신에 관리되는 시스템을 의미한다.

  • Ansible은 관리 노드에 설치되지 않음

플러그인

Ansible의 핵심 기능을 확장할 수 있도록 다양한 플러그인을 제공한다.
-> Action, Become, Cache, Callback, Cliconf, Connection, Httpapi, Inventory, Netconf, Lookup, Shell, Strategy, Vars

인벤토리

관리 노드의 목록으로, 관리 노드에 대한 호스트 이름이나 IP 주소와 같은 정보를 지정한다. 여러 관리 노드를 그룹으로 조직화 할수 있고, 중첩 그룹을 사용할 수 있다.

모듈

Ansible을 실행하는 Python 코드 단위이다. 각 모듈은 호스트에 패키지를 설치 및 관리하고, 데이터베이스의 사용자를 관리하고, 네트워크 장치의 VLAN 인터페이스를 관리할 수 있는 등 약 3000개의 모듈이 있다.

  • 하나의 모듈은 하나의 작업을 실행할 수 있고, 플레이북을 이용해 여러 모듈을 선언해 여러 작업을 수행할 수 있음

📌 작업(Task)

Ansible의 작업 실행 단위를 말한다. 하나의 모듈이 하나의 작업이 되며, Ad-hoc 명령을 통해 단일 작업을 실행하거나, 플레이북을 작성해 여러작업을 실행할 수 있다.

Ad-hoc 명령

Ansible 명령을 이용하여 단일 작업을 실행할 수 있다.

플레이

특정 관리 노드를 대상으로한 순서가 지정된 작업 목록이다.

플레이북

관리 노드에서 실행할 모듈을 인자와 함께 정의한 파일이다. YAML로 작성되며, Ansible의 핵심이라 볼 수 있다. ansible-playbook 명령을 이용해 플레이북을 실행할 수 있다.

작업 크기: 모듈 < 작업(task) < 플레이(play) < 플레이북(play book)

Ansible 아키텍쳐

  • 시스템 유형으로 컨트롤 머신과 관리 노드가 있음

  • 컨트롤 로드에 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

MasterIPCPUMemoryDisk
ansi-master1192.168.56.11/2423072MB30G
NodeIPCPUMemoryDisk
ansi-node1192.168.56.21/2423072MB30G
NodeIPCPUMemoryDisk
ansi-node2192.168.56.22/2423072MB30G
NodeIPCPUMemoryDisk
ansi-node3192.168.56.23/2423072MB30G
  • VM 배포
    vagrant up

  • VM 상태확인
    vagrant status

  • VM 접속
# vagrant ssh ansi-master1 
이 방법도 가능하지만 우리는 밑에 방법으로 접속할 것이다.

ssh vagrant@192.168.56.11 (master1의 IP주소)
password: vagrant
  • SSH 키 복사
    ansible 컨트롤 머신은 각각 노드들에 대해서 ssh를 통해서 지시를 내린다. ssh에 접속할때 암호를 입력함으로써 접속하게 되면 안된다. 따라서 키기반 등록을 진행해줘야 한다.
# 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 

  • ansible 설치
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의 작동 방식을 구성하는 파일이다. 인벤토리 파일의 위치, 관리 노드에 연결하는 방법, 연결 한 후 작동 방법 등 무수히 많은 구성을 지정할 수 있다.

  • 기본 Ansible 구성 파일의 위치는 /etc/ansible/ansible.cfg

  • Ansible 구성 파일 우선 순위
    ① ANSIBLE_CONFIG 환경 변수
    ② 현재 디렉토리의 ansible.cfg
    ③ 홈 디렉토리의 ~/.ansible.cfg
    ④ /etc/ansible/ansible.cfg
    ▪ 우선 순위가 높은 파일에 정의된 값이 이전 정의된 값보다 우선

구성 파일 및 설정 확인

ansible.cfg 구성 파일 설정

  • [section] 대괄호로 묶여진 여러 섹션(분류)가 고 각섹션에는 키 = 값으로 설정된 설정이 포함됨

[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)

  • 구성파일 직접 확인: vi /etc/ansible/ansible.cfg
  • 현재 적용된 구성파일의 내용 확인: ansible-config view

ansible.cfg 구성 파일 수정

  • 원본 ansible.cfg 복사
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을 실행할 노드 또는 그룹을 선택한다.

  • 기본 인벤토리 파일은 /etc/ansible/hosts 이며, -i 옵션을 사용하여 다른 인벤토리 파일을 지정할 수 있음
  • 인벤토리 파일은 일반적으로 INI 파일 형식을 가지고 있으며, YAML 형식으로 지정할 수 있음
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 방화벽 관리
  • 기타 플러그인 확인
    ansible-doc -t <plugin_type> -l
  • 플러그인 종류:
    become
    cache
    callback
    cliconf
    connection
    httpapi
    inventory
    netconf
    lookup
    shell
    module (기본값)
    strategy
    vars

Ad-Hoc 명령

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"

profile
전공 소개

0개의 댓글