[우아하게 앤서블] Chapter 3 - 베이그런트를 이용해서 앤서블의 실습 환경 구성하기
참고사항
책과는 다르게 Hyper-V 환경에서 진행하고 있습니다. (책은 VirtualBox기준)
베이그런트? 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 사용할 수 있는 상태로 만들어 줌.(프로비저닝)
베이그런트 다운로드 : https://vagrantup.com/downloads.html
베이그런트 초기화
vagrant init
베이스 이미지가 없어서 오류 발생, 베이스 이미지 서치 해서 확인
https://app.vagrantup.com/boxes/search
https://app.vagrantup.com/centos/boxes/7
vagrant up
centos7을 사용할 예정이기 때문에 vagrantfile에서 config.vm.box = "centos/7" 로 변경
다시 vagrant up 후 정상적으로 설치중
책에서는 VirtualBox를 사용해서 혹시 hyper-v를 지원안하면 다시 해야하나 싶었는데 다행히 hyper-v도 정상적으로 지원하는것으로 확인, 스위치가 여러개 설정되있을 경우 중간에 선택해야 하는 과정 추가
vagrant up
정상적으로 켜진것으로 확인
ssh접속 후 uptime과 릴리즈 확인
vagrant ssh
uptime
cat /etc/*release*
책 내용중 포트포워딩관련 에드온 설치가 필요한 것으로 나와있으나 Hyper-V의 경우 별도의 포트포워딩 없이 브릿시 네트워크 사용으로 바로 접속이 가능하여 별도의 포트포워딩 과정없이 진행.
생성한 VM 삭제
vagrant destroy
vagrantfile 설정시 참고,
provider 설정 시 hyperv가 먹히지 않아서 hyper-v로 설정했더니 정상적으로 작동
Learning to Use Vagrant on Windows 10
# -*- mode: ruby -*-
# vi: set ft=ruby :
#================#
# Ansible Server #
#================#
Vagrant.configure("2") do |config|
config.vm.define "ansiable-server" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-Server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
end
end
ssh 접속 시도, ansible 설치 확인, 종료
vagrant ssh
ansible
exit
ansible no package 문제로 epel-release 추가
# -*- mode: ruby -*-
# vi: set ft=ruby :
#================#
# Ansible Server #
#================#
Vagrant.configure("2") do |config|
config.vm.define "ansiable-server" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-Server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", ip: "192.168.0.70"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", inline: "yum install epel-release -y && yum install ansible -y"
end
end
설치 후 정상 작동 확인
vagrant ssh
ansible
앤서블플레이북 실행환경 추가
yml 코드는 https://github.com/bjpublic/ansible
vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
#================#
# Ansible Server #
#================#
Vagrant.configure("2") do |config|
config.vm.define "ansiable-server" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-Server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", ip: "192.168.0.70"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", inline: "yum install epel-release -y && 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"
end
end
vagrant provision
vagrant ssh
ans
anp
vi ansible_env_ready.yml
가상머신 강제 삭제
vagrant destroy -f
노드 추가한 코드 입력
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
#==============#
# CentOS nodes #
#==============#
#Ansible-Node01
config.vm.define "ansiable-node01" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-node01"
end
cfg.vm.host_name = "ansible-node01"
cfg.vm.network "public_network", ip: "192.168.0.71", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
end
#Ansible-Node02
config.vm.define "ansiable-node02" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-node02"
end
cfg.vm.host_name = "ansible-node02"
cfg.vm.network "public_network", ip: "192.168.0.72", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
end
#Ansible-Node03
config.vm.define "ansiable-node03" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-node03"
end
cfg.vm.host_name = "ansible-node03"
cfg.vm.network "public_network", ip: "192.168.0.73", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
end
#================#
# Ansible Server #
#================#
config.vm.define "ansiable-server" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-Server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", ip: "192.168.0.70", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "shell", inline: "yum install epel-release -y && 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"
end
end
vagrant up
설치완료
접속 확인, 앤시아블은..넘어가도록 한다..
아이피를 설정해둔게 적용이 안되는것 같아서 설정을 변경(고정)
각 노드 별 아이피 설정 파일 생성
#!/bin/sh
#ip-node03
echo 'Setting static IP address for Hyper-V...'
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
PREFIX=24
IPADDR=192.168.0.73
GATEWAY=192.168.0.1
DNS1=8.8.8.8
EOF
dhcp로 잡히는걸 static ip로 변경 후에 네트워크 재시작(백그라운드에서 하지 않을 경우 넘어가지 않아서 백그라운드에서 시작)
# -*- 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 "hyper-v" do |hv|
hv.name = "Ansible-node01"
end
cfg.vm.host_name = "ansible-node01"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-node01.sh",
destination: "ip-node01.sh"
cfg.vm.provision "shell", inline: "source ./ip-node01.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
end
#Ansible-Node02
config.vm.define "ansible-node02" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-node02"
end
cfg.vm.host_name = "ansible-node02"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-node02.sh",
destination: "ip-node02.sh"
cfg.vm.provision "shell", inline: "source ./ip-node02.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
end
#Ansible-Node03
config.vm.define "ansible-node03" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-node03"
end
cfg.vm.host_name = "ansible-node03"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-node03.sh",
destination: "ip-node03.sh"
cfg.vm.provision "shell", inline: "source ./ip-node03.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
end
#================#
# Ansible Server #
#================#
config.vm.define "ansible-server" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "hyper-v" do |hv|
hv.name = "Ansible-Server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-server.sh",
destination: "ip-server.sh"
cfg.vm.provision "shell", inline: "source ./ip-server.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
cfg.vm.provision "shell", inline: "yum install epel-release -y && 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"
end
end
정상적으로 아이피 변경까지 확인
ansible_env_ready.yml 파일에 하기 내용 추가
---
- name: Setup for the Ansible's Environment
hosts: localhost
gather_facts: no
tasks:
- name: Add "/etc/ansible/hosts"
blockinfile:
path: /etc/ansible/hosts
block: |
[CentOS]
192.168.0.71
192.168.0.72
192.168.0.73
vagrant ssh ansible-server
ans all -m ping
yes
yes
yes
ans all -m pink -k
bash_ssh_confi_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
Vagrantfile
# -*- 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 "hyper-v" do |hv|
hv.name = "Ansible-node01"
end
cfg.vm.host_name = "ansible-node01"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-node01.sh",
destination: "ip-node01.sh"
cfg.vm.provision "shell", inline: "source ./ip-node01.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
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 "hyper-v" do |hv|
hv.name = "Ansible-node02"
end
cfg.vm.host_name = "ansible-node02"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-node02.sh",
destination: "ip-node02.sh"
cfg.vm.provision "shell", inline: "source ./ip-node02.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
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 "hyper-v" do |hv|
hv.name = "Ansible-node03"
end
cfg.vm.host_name = "ansible-node03"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-node03.sh",
destination: "ip-node03.sh"
cfg.vm.provision "shell", inline: "source ./ip-node03.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
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 "hyper-v" do |hv|
hv.name = "Ansible-Server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", bridge: "External_Switch"
cfg.vm.synced_folder "../data", "/vagrant", disabled: true
cfg.vm.provision "file", source: "ip-server.sh",
destination: "ip-server.sh"
cfg.vm.provision "shell", inline: "source ./ip-server.sh"
cfg.vm.provision "shell", inline: "systemctl restart network &"
cfg.vm.provision "shell", inline: "yum install epel-release -y && 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"
end
end
정상 핑 확인
vagrant provision
vagrant ssh ansible-server
ans all -m pingg -k
ansible_env_ready.yml
---
- name: Setup for the Ansible's Environment
hosts: localhost
gather_facts: no
tasks:
- name: Add "/etc/ansible/hosts"
blockinfile:
path: /etc/ansible/hosts
block: |
[CentOS]
192.168.0.71
192.168.0.72
192.168.0.73
- 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'"
known_hosts 자동등록