Ansible

Vagrant를 활용하여 Ansible 서버와 노드 구성하기

Joon0464 2021. 7. 14. 16:07

[응용] 다양한 환경을 앤서블(Ansible)로 관리하기 with 베이그런트(Vagrant) - 인프런 | 강의 (inflearn.com)

 

[응용] 다양한 환경을 앤서블(Ansible)로 관리하기 with 베이그런트(Vagrant) - 인프런 | 강의

센트OS 이외에 얼마나 다양한 시스템에 엔서블이 사용될 수 있는지 배워봅시다. 앤서블을 리눅스 이외에 윈도우 및 네트워크 시스템과 같은 여러가지 시스템에 대해서 다양한 목적으로 사용하

www.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 모듈이 동작하는지 테스트한다.