Ansible/우아한앤서블

우아한앤서블 3장 Vagrant로 Ansible 사용하기 - centos/7

Jen'_' 2021. 4. 29. 17:39
반응형

 

Ansible 이란?

Ansible은 Devops도구로서 IT인프라를 쉽게 관리하기 위한 도구이다.

코드로서 인프라를 구축하기 때문에 infrastructure as code라고 불리기도 한다.

 

Vagrant란?

여러개의 가상 환경을 쉽게 구축하고 관리할 수 있도록 도와주는 도구이다.

사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요시 시스템을 사용할 수 있는 상태로 만들어주는 도구로서 프로비저닝 도구라고도 한다.

Ansible을 실습하기 위해서는 여러대의 Linux서버가 필요한데 개인이 여러대의 Linux 환경을 구축하는 것은 쉽지 않다.

Vagrant를 이용하면 로컬PC에 여러대의 Linux서버를 가상으로 설치하여 쉽게 Ansible 테스트 환경을 만들수 있다.

 

 

 

환경구성

1. VirtualBox 설치

https://www.virtualbox.org/

 

Oracle VM VirtualBox

Welcome to VirtualBox.org! News Flash New April 20th, 2021VirtualBox 6.1.20 released! Oracle today released a 6.1 maintenance release which improves stability and fixes regressions. See the Changelog for details. New January 19th, 2021VirtualBox 6.1.18 rel

www.virtualbox.org

 

 

2. vagrant 설치

https://www.vagrantup.com/downloads

 

Downloads | Vagrant by HashiCorp

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

www.vagrantup.com

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

 

Vagrant Cloud by HashiCorp

Vagrant Cloud by HashiCorp

app.vagrantup.com

 

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/

 

반응형