Ansible 이란?
Ansible은 Devops도구로서 IT인프라를 쉽게 관리하기 위한 도구이다.
코드로서 인프라를 구축하기 때문에 infrastructure as code라고 불리기도 한다.
Vagrant란?
여러개의 가상 환경을 쉽게 구축하고 관리할 수 있도록 도와주는 도구이다.
사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요시 시스템을 사용할 수 있는 상태로 만들어주는 도구로서 프로비저닝 도구라고도 한다.
Ansible을 실습하기 위해서는 여러대의 Linux서버가 필요한데 개인이 여러대의 Linux 환경을 구축하는 것은 쉽지 않다.
Vagrant를 이용하면 로컬PC에 여러대의 Linux서버를 가상으로 설치하여 쉽게 Ansible 테스트 환경을 만들수 있다.
환경구성
1. VirtualBox 설치
2. vagrant 설치
https://www.vagrantup.com/downloads
Current Version: 2.2.15
vgrant 명령어
- vagrant init: 프로비저닝을 위한 예제 스크립트를 생성(Vagrantfile)
- vagrant up: 베이그런트파일을 읽어 들여 프로비저닝을 진행
- vagrant provision: 베이그런트에서 관리하는 가상 머신에 변경된 설정을 적용(파일 수정한 다음 사용한다)
- vagrant halt: 베이그런트에서 다루는 가상 머신들을 종료
- vagrant destroy: 베이그런트에서 관리하는 가상 머신들을 삭제
- vagrant ssh: 베이그런트에서 관리하는 가상 머신에 ssh로 접속
3. 베이그런트로 프로비저닝하기
C:\HashiCorp> vagrant init
디렉터리에 Vagrantfile이 생성된다
C:\HashiCorp> vagrant plugin install vagrant-vbguest --plugin-version 0.21
게스트 에디션 설치(호환되는 버전 미리 확인하세요)
[오류1]
책에서 베이그런트 플로그인을 통해 게스트 에디션을 설치해준다
C:\HashiCorp> vagrant plugin install vagrant-vbguest
C:\HashiCorp>vagrant plugin list
vagrant-vbguest (0.39.0, global)
- Version Constraint: 0.39
이상태로 실습을 진행했더니 아래와 같은 에러가 계속 떴다 ;
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.
원인은 vagrant 프로그램이랑 plugin 버전이 안맞아서 였다
그래서 실습 도중 초기화하고 plugin 다운그래이드 했음
C:\HashiCorp> vagrant plugin uninstall vagrant-vbguest
C:\HashiCorp> vagrant plugin install vagrant-vbguest --plugin-version 0.21
[오류2]
c드라이브의 사용자에 사용자홈디렉터리이름이 한글이면 안된다!
-> UTP-8 에러가 뜸
[오류3]
centos7이 기본 버전이라서 epel저장소 인스톨 안하면 ansible 인스톨 안됨
yum -y install epel-release
yum install ansible -y
[초기화 방법]
vagrant up 하다가 중간에 에러나면 초기화하고 다시 시작
1. vagrant destroy -f
2. C:\Users\<user name>\VirtualBox VMs 에서 가상머신 파일 삭제 됐는지 확인
3. up할때 생성되는 .vagrnat 폴더 삭제하고 다시 vagrant up
Vagrantfile
centos 7 vm 4대를 구성하는 코드
ansible-server 1대, ansible-node 3대
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
#==============#
# CentOS nodes #
#==============#
#Ansible-Node01
config.vm.define "ansible-node01" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "Ansible-Node01(github_SysNet4Admin)"
end
cfg.vm.host_name = "ansible-node01"
cfg.vm.network "public_network", ip: "192.168.1.11"
cfg.vm.network "forwarded_port", guest: 22, host: 60011, auto_correct: true, id: "ssh"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
end
#Ansible-Node02
config.vm.define "ansible-node02" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "Ansible-Node02(github_SysNet4Admin)"
end
cfg.vm.host_name = "ansible-node02"
cfg.vm.network "public_network", ip: "192.168.1.12"
cfg.vm.network "forwarded_port", guest: 22, host: 60012, auto_correct: true, id: "ssh"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
end
#Ansible-Node03
config.vm.define "ansible-node03" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "Ansible-Node03(github_SysNet4Admin)"
end
cfg.vm.host_name = "ansible-node03"
cfg.vm.network "public_network", ip: "192.168.1.13"
cfg.vm.network "forwarded_port", guest: 22, host: 60013, auto_correct: true, id: "ssh"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
end
#================#
# Ansible Server #
#================#
config.vm.define "ansible-server" do |cfg|
cfg.vm.box = "centos/7" # 운영체제 이미지
cfg.vm.provider "virtualbox" do |vb|
vb.name = "Ansible-Server(github_SysNet4Admin)"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", ip: "192.168.1.10"
cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", inline: "yum -y install epel-release" # 저장소가 옛날버전이라 업그레이드
cfg.vm.provision "shell", inline: "yum install ansible -y"
cfg.vm.provision "file", source: "ansible_env_ready.yml",
destination: "ansible_env_ready.yml"
cfg.vm.provision "shell", inline: "ansible-playbook ansible_env_ready.yml"
cfg.vm.provision "shell", path: "add_ssh_auth.sh", privileged: false
end
end
위의 ip는 당신들 ip를 작성해야한다
공유기를 사용할 경우 ipconfig하면 무선 LAN 어뎁터 Wi-Fi 가 뜬다
만약 192.168.1.0/24가 ip 대역대라면
ping 192.168.1.10 -n 1로 ip를 쓰고있는 장비가 없는지 확인하고 사용하면됨
centos7말고 다른 운영체제 사용하고 싶으면 vagrant cloud를 확인!!
아래 저장소에서 제공하는 이미지를 사용하는 것이다
https://app.vagrantup.com/boxes/search
4. 앤서블 서버에 앤서블 플레이북 실행 환경 추가하기
ansible-playbook ansible_env_ready.yml
ansible-server에서 실행시킬 playbook 파일, ansible 사용할 수 있도록 환경 구성
---
- name: Setup for the Ansible's Environmen
hosts: localhost # 목적지
gather_facts: no
tasks:
- name: Add "/etc/ansible/hosts"
blockinfile:
path: /etc/ansible/hosts
block: |
# hosts 파일에 입력될 그룹이름과 ip
[CentOS]
192.168.1.11
192.168.1.12
192.168.1.13
- name: Install sshpass for Authentication
yum:
name: sshpass
state: present
- name: Create vim env's directories & files
shell: "{{item}}"
with_items:
- "mkdir -p /home/vagrant/.vim/autoload /home/vagrant/.vim/bundle"
- "touch /home/vagrant/.vimrc"
- "touch /home/vagrant/.bashrc"
- name: Install vim-enhanced
yum:
name: vim-enhanced
state: present
- name: Install git
yum:
name: git
state: present
- name: Download pathogen.vim
shell: "curl -fLo /home/vagrant/.vim/autoload/pathogen.vim
https://tpo.pe/pathogen.vim"
- name: Git clone vim-ansible-yaml
git:
repo: https://github.com/chase/vim-ansible-yaml.git
dest: /home/vagrant/.vim/bundle/vim-ansible-yaml
- name: Configure vimrc
lineinfile:
path: /home/vagrant/.vimrc
line: "{{item}}"
with_items:
- "set number"
- "execute pathogen#infect()"
- "syntax on"
- name: Configure Bashrc
lineinfile:
path: /home/vagrant/.bashrc
line: "{{item}}"
with_items:
- "alias ans='ansible'"
- "alias anp='ansible-playbook'"
※ 주의
yaml 파일을 작성할때 가장 중요한것은 들여쓰기이다 목록끼리 들여쓰기가 정확하게 맞아야 한다
또한, 탭키로 들여쓰기를 하면 안되고 무조건 '스페이스바'를 사용해야 한다
※ hosts 필드는 목적지이다
'/etc/ansible/hosts'에 해당 노드들에 대한 그룹 이름을 선언
ansible 환경 설정 파일
- 주 환경설정 파일 /etc/ansible/ansible.cfg
- ansible에 의해 관리되어지는 호스트 정보 /etc/ansible/hosts
호스트파일에 노드들을 입력시켜야 server에서 노드들에게 ansible 명령어를 실행시킬 수 있다
ex) ansible all -m ping -k
5. ansible-server에서 ansible-node들을 연결하기 위해서 ssh_config 수정
vgrant를 통해서 받은 centos는 ssh를 이용한 통신 시도 시에 암호를 통해서 로그인 할 수 없도록 설정되어 있다.
따라서 해당 설정을 변경해주어야 함.
bash_ssh_conf_4_CentOS.sh
sshd_config 내에 암호를 이용하여 인증하도록 설정을 변경
#! /usr/bin/env bash
now=$(date +"%m_%d_%Y")
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_$now.backup
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd
6. ansible-server에서 ansible-node들에 대한 known_hosts의 키를 자동으로 입력
known_hosts
접속하려는 주체(ansible-server)에서 이미 상대방(ansible-node)을 신뢰하고 있다
ansible-node에 접속을 시도하면 접속하려는 대상이 믿을만한지 사용자에게 확인 요청을 한다
사용자에게 확인이 끝난 이후에 접속 대상의 키를 ~/.ssh/known_hosts 에 저장하는 것이다
ansible-server에서 ans all -m ping을 통해서 known_hosts를 등록할 수도 있지만, 자동화 실습을 해보겠다
* playbook에 alias로 ans = ansible 넣어놨음
add_ssh_auth.sh
#! /usr/bin/env bash
#ssh key 생성
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@192.168.1.11
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@192.168.1.12
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@192.168.1.13
C:\HashiCorp> vagrant up
모든 실습 환경 구성이 끝났다!
* vagrant ssh 기본 설정
ID: vagrant
PW: vagrant
출처
https://daddyprogrammer.org/post/7369/ansible-vagrant/
'Ansible > 우아한앤서블' 카테고리의 다른 글
5장 Vagrant로 Ansible 사용하기 - 네트워크(nxos) (0) | 2021.05.02 |
---|---|
[Ansible] known_hosts 등록, 전자서명을 위한 authorized_keys 등록 (0) | 2021.04.30 |
4장 Vagrant로 Ansible 사용하기 - 윈도우 (0) | 2021.04.29 |