[응용] 다양한 환경을 앤서블(Ansible)로 관리하기 with 베이그런트(Vagrant) - 인프런 | 강의 (inflearn.com)
1. Vagrantfile 작성
# Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant_API_Version ="2"
Vagrant.configure(Vagrant_API_Version) do |config|
#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)"
vb.customize ["modifyvm", :id, "--cpus",1]
vb.customize ["modifyvm", :id, "--memory",512]
end
cfg.vm.host_name="ansible-node01"
cfg.vm.synced_folder ".", "/vagrant", disabled: true
cfg.vm.network "public_network", ip: "192.168.1.11"
cfg.vm.network "forwarded_port", guest: 22, host: 19211, auto_correct: false, id: "ssh"
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)"
vb.customize ["modifyvm", :id, "--cpus",1]
vb.customize ["modifyvm", :id, "--memory",512]
end
cfg.vm.host_name="ansible-node02"
cfg.vm.synced_folder ".", "/vagrant", disabled: true
cfg.vm.network "public_network", ip: "192.168.1.12"
cfg.vm.network "forwarded_port", guest: 22, host: 19212, auto_correct: false, id: "ssh"
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.synced_folder ".", "/vagrant", disabled: true
cfg.vm.network "public_network", ip: "192.168.1.10"
cfg.vm.network "forwarded_port", guest: 22, host: 19210, auto_correct: false, id: "ssh"
cfg.vm.provision "shell", path: "bootstrap.sh"
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
- vb.customize ["modifyvm", :id, "--cpus",1]
생성될 가상 머신의 cpu 개수 설정
- vb.customize ["modifyvm", :id, "--memory",1024]
생성될 가상 머신의 memory 설정
- cfg.vm.provision "shell", path: "add_ssh_auth.sh", privileged: false
add_sh_auth.sh의 쉘 스크립트를 실행하기 위해 설정한다. priviliged를 false로 설정하여 root의 권한이 아닌 vagrant 사용자의 권한으로 실행하게 설정한다. 권한을 획득하지 않겠다는 의미이다.
2. bootstrap.sh 작성
# bootstrap.sh
#! /usr/bin/env bash
#ansible 설치
yum install epel-release -y
yum install ansible -y
#환경설정 초기 파일 구성 for vagrant Only
mkdir -p /home/vagrant/.vim/autoload /home/vagrant/.vim/bundle
touch /home/vagrant/.vimrc
touch /home/vagrant/.bashrc
bootstrap.sh는 이번 글에서 수정되지 않고 그대로 사용한다.
3. add_ssh_auth.sh 작성
# add_ssh_auth.sh
#! /usr/bin/env bash
#ssh key 생성
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@node01
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@node02
sshpass라는 utility를 통해 vagrant 사용자로 vagrant@node01과 vagrant@node02로 ssh 접속하여 ssh키를 생성하는 명령어이다.
StrictHostKeyChecking=no 옵션을 사용하면 ssh 접속할 때 키를 한 번 더 확인하라는 경고창이 출력되는데 이 부분을 확인하지 않겠다는 옵션이다. 이 부분이 있으면 경고창이 뜨지않고 자동으로 키를 입력하게 된다.
4. Ansible_env_ready.yml 작성
# Ansible_env_ready.yml
---
- name: Setup for the Ansible's Enviroment
hosts: localhost
gather_facts: no
tasks:
- name: Add "/etc/hosts"
blockinfile: |
dest=/etc/hosts
content="
192.168.1.10 server
192.168.1.11 node01
192.168.1.12 node02"
- name: Add "/etc/ansible/hosts"
blockinfile: |
dest=/etc/ansible/hosts
content="
[CentOS]
node01
node02"
- name: Install sshpass for Authentication
yum:
name: sshpass
state: present
- 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:
dest: /home/vagrant/.vimrc
line: "{{ item }}"
with_items:
- "set number"
- "execute pathogen#infect()"
- "syntax on"
- name: Configure Bashrc
lineinfile:
dest: /home/vagrant/.bashrc
line: "{{ item }}"
with_items:
- "alias vi='vim'"
- "alias ans='ansible'"
- "alias anp='ansible-playbook'"
blockinfile : 특정 파일에 내용을 블록단위로 구분해서 수정 및 저장하는 모듈이다.
- name: Add "/etc/hosts" : host 이름을 등록하는 task를 작성한 부분이다.
- name: Add "/etc/ansible/hosts" : Ansible이 호출하는 호스트를 등록하는 task이다.
- name: Install sshpass for Authentication : sshpass 유틸리티 설치를 위한 task이다.
5. 프로비저닝 및 테스트
5.1 프로비저닝
C:\HashiCorp>vagrant destroy ansible-server
ansible-server: Are you sure you want to destroy the 'ansible-server' VM? [y/N] y
==> ansible-server: Destroying VM and associated drives...
C:\HashiCorp>vagrant up
cmd에서 HashiCorp로 경로를 변경하고 기존에 생성한 ansible server를 vagrant destroy 명령어를 사용하여 삭제한다.
제거가 완료되면 vagrant up을 입력하여 ansible-server와 ansible-node01, ansible-node02를 생성한다.
5.2 테스트
vagrant ssh를 사용하여 ansible-server에 접속한 뒤 cat .ssh/known_hosts을 입력하여 ssh 키가 정상적으로 생성되었는지 확인한다.
/etc/hosts의 내용을 확인하면 호스트들이 등록되어있어야 한다.
/etc/ansible/hosts에 관리할 대상 노드가 등록되어있어야 한다.
마지막으로 ansible node와 ansible server간에 통신을 테스트 확인한다. 하지만 통신이 되지 않고 이 문제를 지금부터 해결해야 한다.
6. Ansible-Server와 Node 간에 통신 문제 해결
6.1 원인 찾기
ping을 테스트하면 정상적으로 ping을 주고받는 것을 볼 수 있다.
각 노드들에 ssh 접속을 시도하면 permission denied 에러가 발생한다.
즉, 이 문제는 ssh 통신이 이루어지지 않아서 생기는 문제이다.
6.2 문제 해결 방안
/etc/ssh/sshd_config 파일의 PasswordAuthentication no를 yes로 변경해야 이 문제를 해결 가능하다.
첫 번째 방법은 Ansible Playbook에서 replace 모듈을 사용하는 것이다.
두 번째 방법은 Bash Shell Programming을 사용하여 sed 명령어를 사용하는 방법이다.
첫 번째 방법은 ansible 코어가 설치되어 있는 Ansible-Server에 적용할 것이며 두 번째 방법은 나머지 노드들에게 적용할 것이다.
6.3 첫 번째 방법 적용
# Ansible_ssh_conf_4_CentOS.yml
---
- name: Ansible_ssh_conf_4_CentOS
hosts: localhost
gather_facts: no
tasks:
- name: PasswordAuthentication change from no to yes
replace:
dest: /etc/ssh/sshd_config
regexp: 'PasswordAuthentication no'
replace: 'PasswordAuthentication yes'
backup: yes
- name: sshd restart to apply "PasswordAuthentication"
service:
name: sshd
state: restarted
Ansible_env_ready.yml 파일에 위 내용을 추가한다.
replace 모듈을 사용하여 설정 내용을 no에서 yes로 변경하며 service 모듈을 사용하여 변경사항이 적용되도록 sshd 데몬을 재시작한다.
6.4 두 번째 방법 적용
# bash_ssh_conf_4_CentOS.sh
#! /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
- now=$(date +"%m_%d_%Y")
현재시작을 설정한다.
- cp /etc/ssh/sshd_config /etc/ssh/sshd_config_$now.backup
기존 설정 내용을 백업
- sed -i -e 's/PaaswordAuthentication no/PaaswordAuthentication yes/g' /etc/ssh/sshd_config
'PaaswordAuthentication no' 을 'PaaswordAuthentication yes'로 sshd_config 설정 내용 수정 명령어
- systemctl restart sshd
변경된 설정 적용을 위해 sshd 데몬 재시작
6.5 Vagrantfile 수정
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
#Ansible-Node01
config.vm.define:"ansible-node01" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider:virtualbox do |vb|
vb.name="Ansible-Node01(Udemy-Bloter)"
vb.customize ["modifyvm", :id, "--cpus",1]
vb.customize ["modifyvm", :id, "--memory",512]
end
cfg.vm.host_name="ansible-node01"
cfg.vm.synced_folder ".", "/vagrant", disabled: true
cfg.vm.network "public_network", ip: "192.168.1.11"
cfg.vm.network "forwarded_port", guest: 22, host: 19211, auto_correct: false, id: "ssh"
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(Udemy-Bloter)"
vb.customize ["modifyvm", :id, "--cpus",1]
vb.customize ["modifyvm", :id, "--memory",512]
end
cfg.vm.host_name="ansible-node02"
cfg.vm.synced_folder ".", "/vagrant", disabled: true
cfg.vm.network "public_network", ip: "192.168.1.12"
cfg.vm.network "forwarded_port", guest: 22, host: 19212, auto_correct: false, id: "ssh"
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(Udemy-Bloter)"
end
cfg.vm.host_name="ansible-server"
cfg.vm.synced_folder ".", "/vagrant", disabled: true
cfg.vm.network "public_network", ip: "192.168.1.10"
cfg.vm.network "forwarded_port", guest: 22, host: 19210, auto_correct: false, id: "ssh"
cfg.vm.provision "shell", path: "bootstrap.sh"
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
cfg.vm.provision "file", source: "Ansible_ssh_conf_4_CentOS.yml", destination: "Ansible_ssh_conf_4_CentOS.yml"
cfg.vm.provision "shell", inline: "ansible-playbook Ansible_ssh_conf_4_CentOS.yml"
end
end
- cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
ansible-node01과 ansible-node02에 추가하여 bash_ssh_conf_4_CentOS.sh 스크립트가 실행될 수 있도록 설정한다.
- cfg.vm.provision "file", source: "Ansible_ssh_conf_4_CentOS.yml", destination: "Ansible_ssh_conf_4_CentOS.yml"
Ansible_ssh_conf_4_CentOS.yml을 ansible-server로 복사
- cfg.vm.provision "shell" inline: "ansible-playbook Ansible_ssh_conf_4_CentOS.yml"
Ansible_ssh_conf_4_CentOS.yml을 플레이북 명령어로 실행
6.6 프로비저닝 및 테스트
c:\HashiCorp>vagrant provision
변경사항만 적용하기 위해서 vagrant provision을 입력한다.
c:\HashiCorp>vagrant ssh ansible-server
vagrant ssh를 사용하여 ansible-server에 ssh로 접속한다.
ans all -m ping -k를 입력하여 정상적으로 ping 모듈이 동작하는지 테스트한다.
'Ansible' 카테고리의 다른 글
기존 구성에 Ubuntu node 추가 및 서버 구성 (0) | 2021.07.16 |
---|---|
Vagrant로 구성한 CentOS 관리하기 (0) | 2021.07.15 |
Vagrant를 활용하여 Ansible server 추가 설정 프로비저닝 (0) | 2021.07.13 |
Vagrant를 활용하여 Ansible server 프로비저닝 (0) | 2021.07.13 |
Ansible과 사용할 Vagrant 설치 및 알아보기 (0) | 2021.07.12 |