참고
Ansible
NOTE
Ansible은 오픈소스 자동화 도구로, 인프라를 코드로 관리하는(IaC) 언어입니다. 프로비저닝, 환경 설정, 배포 등의 업무를 코드로 작성하여 여러 환경에 동일하게 적용할 수 있습니다.
Ansible의 흐름도
•
제어노드: Ansible이 설치되는 노드이며 Ansible은 파이썬 모듈을 이용하므로 설치를 위해서는 파이썬이 함께 설치되어 있어야 합니다.
•
관리노드: Ansible이 제어하는 원격 시스템 호스트를 의미하며, Ansible은 별도의 에이전트를 설치하지 않으므로 SSH 통신이 가능해야 하며, 파이썬이 설치되어있어야 합니다.
•
인벤토리: 제어 노드가 관리하는 노드의 목록
•
플레이북: 관리 노드에서 수행할 작업들을 YAML 문법을 통해 순서대로 작성해놓은 것
•
모듈: 관리 노드의 작업을 수행할 때 SSH를 통해 연결한 후 Ansilbe Module이라는 스크립트를 푸시하여 동작한다.
•
플러그인: 모듈이 대상 시스템에서 별도의 프로세스로 동작하는 동안 플러그인은 제어노드에서 실행되며, 데이터 변환, 로그 출력에 대한 확장 기능을 제공한다.
Agent vs Agentless
SSH 프로토콜로 이루어지기에 별도의 Agent가 필요없다!
•
SSH Based
◦
서버에 SSH키 파일만 저장하면 SSH 통신을 통해서 제어가 가능
◦
키 배포 이후에는 별도로 관리할게 없어, 설치 없이 바로 사용이 가능
•
Agent Based
◦
대상 서버에 에이전트를 설치해야 원격으로 제어가 가능한 시스템
◦
에이전트는 하나의 프로세스이므로, 프로세스가 죽게되면 제어권도 같이 잃어 에이전트를 재가동해야함
Ansible 실습환경 구성
NOTE
Vagrant_API_Version="2"
Vagrant.configure(Vagrant_API_Version) do |config|
# Ansible 제어 노드 설정
config.vm.define "controll-node" do |master|
master.vm.box = "generic/ubuntu2004"
master.vm.provider :virtualbox do |vb|
vb.name = "controll-node"
vb.cpus = 2
vb.memory = 2048
end
master.vm.hostname = "controll-node"
master.vm.synced_folder ".", "/vagrant"
master.vm.network "private_network", ip: "192.168.32.14"
master.vm.network "forwarded_port", guest: 80, host: 10080, auto_correct: true
master.vm.provision "shell", path: "sshd_config.sh"
end
# Ansible 관리 노드 1 설정
config.vm.define "manage-node-1" do |node1|
node1.vm.box = "generic/ubuntu2004"
node1.vm.provider :virtualbox do |vb|
vb.name = "manage-node-1"
vb.cpus = 2
vb.memory = 2048
end
node1.vm.hostname = "manage-node-1"
node1.vm.synced_folder ".", "/vagrant"
node1.vm.network "private_network", ip: "192.168.32.15"
node1.vm.network "forwarded_port", guest: 80, host: 20080, auto_correct: true
node1.vm.provision "shell", path: "sshd_config.sh"
end
# Ansible 관리 노드 2 설정
config.vm.define "manage-node-2" do |node2|
node2.vm.box = "generic/ubuntu2004"
node2.vm.provider :virtualbox do |vb|
vb.name = "manage-node-2"
vb.cpus = 2
vb.memory = 2048
end
node2.vm.hostname = "manage-node-2"
node2.vm.synced_folder ".", "/vagrant"
node2.vm.network "private_network", ip: "192.168.32.16"
node2.vm.network "forwarded_port", guest: 80, host: 30080, auto_correct: true
node2.vm.provision "shell", path: "sshd_config.sh"
end
end
Bash
복사
vagrant
sudo apt-get update
sudo apt-get install software-properties-common --yes
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt-get install ansible --yes
ansible --version
Bash
복사
설치코드
# Inventory 설정
vi /etc/ansible/hosts
[nodes]
controll-node ansible_host=192.168.32.14
manage-node-1 ansible_host=192.168.32.15
manage-node-2 ansible_host=192.168.32.16
# Inventory 확인
ansible-inventory --list -y
# 관리 노드 연결
ssh-keygen
ssh-copy-id root@192.168.32.14
ssh-copy-id root@192.168.32.15
ssh-copy-id root@192.168.32.16
ansible all -m ping # SSH Password 없이 접속
ansible all -m ping --ask-pass # SSH Password를 입력하라고 나옴
Bash
복사
통신설정 코드
# all 호스트 표시
ansible all --list-hosts
# -m module 지정된 모듈 실행
ansible all -m ping
# -b, -K 암호요청 및 높은 권한 실행
ansible all -b -m command -a 'reboot'
# --become-user 특정 사용자로 실행(기본 root)
ansible all --become-user=username -a 'reboot'
# -i 인벤토리
ansible all -i ./inventory -m command -a 'date'
Bash
복사
ansible CLI
ansible.cfg(구성파일)
NOTE
ansible.cfg 파일은 Ansible의 구성 파일로, Ansible이 작동하는 방식을 제어할 수 있습니다.
구성파일 우선순위
ansible.cfg은 다양한 영역으로 구성되어 있으며, 각 영역은 특정 기능을 설정합니다.
# default 기본동작
[defaults]
inventory = /path # 인벤토리 기본경로
remote_user = name # 접속 유저
host_key_checking = True # 호스트 키 검사
timeout = 30 # 타임아웃
log_path = /var/log/ansible.log # 로그 경로
# privilege_escalation 권한상승
[privilege_escalation]
become = True # 권한상승 가능여부
become_mtehod = sudo # 권한상승 명령어
become_user = root # 권한상승 유저
become_ask_pass = false # SSH 패스워드 요청
# ssh_connection SSH 연결과 관련된 설정
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s # SSH 추가옵션
control_path = $(directory)s/%%h-%%r # SSH 연결제어 소켓
pipelining = True # 파이프라인 활성화
Bash
복사
/etc/ansible/ansible.cfg
ansible ad-hoc(앤서블 애드혹)
NOTE
ansible-ad-hoc 명령은 playbook을 작성하지 않고 직접 모듈을 호출해서 실행하는 방식입니다.
# 모듈 목록 확인
ansible-doc -l
# 상세 확인
ansible-doc -s ping
ansible-doc -s setup
# 애드혹 사용 패턴
ansible host-pattern -m module [-a 'module options'] [-i inventory]
Bash
복사
# 접근성
ansible all -m ping
# 명령어
ansible all -m shell -a "echo shell"
# 설치
# name: 설치/제거 패키지 이름
# state: 상태(present-설치, absent-제거, latest-최신버전 설치)
ansible all -m apt -a "name=openjdk-11-jdk state=present"
# 복사
# src: 원본경로, dest: 대상파일 경로
# mode: 파일권한, ownder: 파일 그룹
ansible all -m copy -a "src=index.text dest=/home/ubuntu/index.text"
# 서비스
# name: 관리할 서비스 이름
# state: 서비스 상태(started, stopped, restarted, reloaded)
# enabled: 부팅 서비스 시작여부(yes, no)
ansible all -m service -a "name=docker state=reloaded"
Bash
복사
# ping 모듈
ansible all -i ./inventory/hosts.yaml -m ping
# 쉘 모듈
ansible all -i ./inventory/hosts.yaml -m shell -a "echo shell"
# 유저 모듈(present(추가), absent(제거))
ansible all -i ./inventory/hosts.yaml -m user -a "name=user01" [state=absent]
# 설치 모듈
ansible all -i ./inventory/hosts.yaml -m apt "openjdk-11-jdk" [state=absent]
# 복사 모듈
ansible all -i ./inventory/hosts.yaml -m copy -a "src=index.text dest=/home/ubuntu/index.text"
# 서비스 모듈(도커 다시로드)
ansible all -i ./inventory/hosts.yaml -m service -a "name=docker state=reloaded" --become
Bash
복사