RedPlug's Tory

참고사항

책과는 다르게 Hyper-V 환경에서 진행하고 있습니다. (책은 VirtualBox기준)

베이그런트? 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 사용할 수 있는 상태로 만들어 줌.(프로비저닝)

베이그런트 다운로드 : https://vagrantup.com/downloads.html 

 

Vagrant by HashiCorp

Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.

www.vagrantup.com

베이그런트 초기화

vagrant init

베이스 이미지가 없어서 오류 발생, 베이스 이미지 서치 해서 확인

https://app.vagrantup.com/boxes/search 

https://app.vagrantup.com/centos/boxes/7

 

Vagrant Cloud by HashiCorp

Vagrant Cloud by HashiCorp

app.vagrantup.com

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

https://docs.microsoft.com/en-us/virtualization/community/team-blog/2017/20170706-vagrant-and-hyper-v-tips-and-tricks

 

Vagrant and Hyper-V -- Tips and Tricks

Blog post that includes various tips, including how to install and use various features within Hyper-V.

docs.microsoft.com

# -*- 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

 

GitHub - bjpublic/ansible

Contribute to bjpublic/ansible development by creating an account on GitHub.

github.com

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 자동등록