kakao Cloud school 2기 D+34

LEE EUI JOO·2022년 12월 19일
0

Ansible & Vagrant

목록 보기
3/7
post-thumbnail

  • Review : Shell 은 멱등성을 보장하지 못하기 때문에 되도록 Shell 은 쓰지말자

1. 실습

  • sample.war 파일을 배포하는 tomcat 서버를 playbook으로 작성해보기

<tomcat.yml>

- name: Apache Tomcat server Installation
 hosts: all
 gather_facts: no
 become: yes
 
  tasks:
    - name: install openjdk
      yum:
      name: java-1.8.0-openjdk
     
 	- name: Create Directory
   	  file:
	    path: /tomcat
       state: directory
       mode: 0777
     
    - name: Tomcat Download
      get_url:
 	    url:
          https://downloads.apache.org/tomcat/tomcat-10/v10.0.27/bin/apachetomcat-10.0.27.tar.gz
        dest: /tomcat
     
    - name: unzip tar.gz
      unarchive:
        src: "/tomcat/apache-tomcat-10.0.27.tar.gz"
        dest: "/tomcat/"
        remote_src: true    # remote_src 가 yes 인 경우, 타겟 서버의 src path에서 압축 파일을 푼다.
     
    - name: selinux OFF
      shell: setenforce 0
   
    - name: Starting Tomcat
      shell: nohup "/tomcat/apache-tomcat-10.0.27/bin/startup.sh"
   
    - name: Tomcat smaple war download & show
      get_url:
        url: https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war
        dest: /tomcat/apache-tomcat-10.0.27/webapps/
        validate_certs: false

  • extra_opts: [--strip-components=1] - 바로 앞 상위디렉토리를 무시한다
  • remote_src: true - 타겟서버의 src path에서 압축파일을 해제한다
  • nohup "/tomcat/apache-tomcat-10.0.27/bin/startup.sh" - 백그라운드에서도 실행 시킬 수 있다 즉, 끊기지 않는다는 소리이다.
[root@vagrant sim]# ansible-playbook tomcat.yml -i tom_inven.txt -k


2. Vagrant 설치

  • 도커 이미지를 생각하면 편하다! 도커는 컨테이너를 다루었다면, vagrant는 어떤 불변의 인프라를 구성하는 것이다.
    또한, 여러가지 하이퍼바이저와 연동을 시킬 수 있다.
    보통 버츄얼 박스와 연동을 많이 시키지만, 우리는 kvm 이 이미 설치되어 있기 때문에 우리는 kvm과 연동을 시킬 것이다.

    먼저, plug-in 을 설치해야 한다.


[root@vagrant ~]# vagrant plugin install vagrant-libvirt
[root@vagrant ~]# systemctl restart libvirtd
[root@vagrant ~]# mkdir vagrant
[root@vagrant ~]# cd vagrant/
[root@vagrant vagrant]# mkdir test

  • 원하는 버츄얼 머신을 띄어야 하는데, 주의해야 할 점은 타겟디렉토리에서 실행시켜야 한다.
    왜냐하면 그 디렉토리에 Vagrantfile 이 생성되기 때문이다.

[root@vagrant vagrant]# cd test/

[root@vagrant test]# vagrant init centos/7

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

<Vagrantfile  생성됨>
[root@vagrant test]# ls
Vagrantfile

  • 우리가 타이핑하는 명령어는 /vagrant/test/ 라는 디렉토리에 종속되어 있다. 따라서 다른 디렉토리에서 명령어를 실행시킬 수 없다.

< Default Vagrantfile> - Ruby 언어로 이루어져 있음!


  • Vagrant.configure("2") do | config|
    • "2" - version 을 의미
    • do - 명령어를 압축시켜서 config라는 파일을 만든다.
  • config.vm.box = "centos/7"
    • 방금 init 을 centos/7 버전의 이미지를 베이스로 하고자 하기 때문

  • 일단 이렇게 두고 exit 명령어로 빠져 나와 베이스 이미지가 없기 때문에 docker hub 처럼 이미지를 다운받아 보자

<이전에 다운받았던 plug-in 버전에 오류가 있어 다른 버전으로 다운로드>

[root@vagrant test]# vagrant plugin uninstall vagrant-libvirt
[root@vagrant test]# vagrant plugin install vagrant-libvirt --plugin-version
0.10.8
Installed the plugin 'vagrant-libvirt (0.10.8)'!
[root@vagrant test]# ls
Vagrantfile

<이미지 다운로드>
[root@vagrant test]# vagrant up

  • Vagrantfile 을 어떻게 작성하느냐에 따라 커스텀 머신을 만들 수 있다.

[root@vagrant test]# vagrant status
Current machine states:

default running (libvirt)

The Libvirt domain is running. To stop this machine, you can run
`vagrant halt`. To destroy the machine, you can run `vagrant destroy`.

  • kvm 하이퍼 바이저를 통해서 가상 머신을 띄움
[root@vagrant test]# virsh list
Id Name State
----------------------------------------------------
1 centos1 running
2 centos2 running
3 centos3 running
5 test_default running

# test는 디렉토리의 이름이고 default 는 Vagrant 파일에 명시되어 있는 머신의 이름이다.

  • 가상 머신을 중지하고 싶다면
[root@vagrant test]# vagrant halt
==> default: Attempting graceful shutdown of VM...

[root@vagrant test]# vagrant status
Current machine states:
default shutoff (libvirt)
The Libvirt domain is not running. Run `vagrant up` to start it.
  • 가상 머신을 shutoff 상태에서 running 상태로 바꾸고 싶다면
[root@vagrant test]# vagrant reload
  • 가상 머신을 삭제(destroy) 하고 싶다면
[root@vagrant test]# vagrant destroy
 default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Removing domain...
==> default: Deleting the machine folder

<vm 목록상에서도 사라짐을   있다>

[root@vagrant test]# virsh list --all
Id Name State
----------------------------------------------------
1 centos1 running
2 centos2 running
3 centos3 running
  • 가상 머신(ansible console 처럼) 내부로 들어가고 싶다면
[root@vagrant test]# vagrant ssh


  • 192.168.121.xx 대역대는 어디일까?
    qemu networks를 들여다 보자
[root@vagrant test]# cd /etc/libvirt/qemu/networks/
[root@vagrant networks]# ls
autostart default.xml vagrant-libvirt.xml
[root@vagrant networks]# vi vagrant-libvirt.xml 


  • 가상머신이 띄어져 있는 상태인지 GUI 상으로 확인하는 법 Wok 서비스로 확인해볼 수 있음
    port : 8000


  • Vagrantfile을 수정해보자
[root@vagrant networks]# cd ~/vagrant/
[root@vagrant vagrant]# cd test/
[root@vagrant test]# ls
Vagrantfile

<일단 기존의 vm 삭제>

[root@vagrant test]# vagrant destroy
 default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Removing domain...
==> default: Deleting the machine folder

[root@vagrant test]# ls
Vagrantfile

Vagrantfile 수정을 통해 앤서블 서버 구성해보기

[root@vagrant test]# vi Vagrantfile

<Vagrantfile>
******************

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|      # version 은 "2" config 파일로 압축한다
 config.vm.define "ansible-server" do |cfg|  # config 파일을 cfg파일로 정의 한다고 생각하자
 cfg.vm.box = "centos/7"  					# 이미지는 centos/7 기반의 이미지
 cfg.vm.host_name = "ansible-server"		# 호스트 네임은 ansible-server
 cfg.vm.network "private_network", ip: "172.16.1.10"	# 네트워크의 이름은 private network 이고 ip를 정의
 cfg.vm.network "forwarded_port" , guest: 22, host: 60010,	# 포트포워딩을 60010번으로 하겠다
auto_correct: true, id: "ssh"  # 만약 겹치는 포트가 있다면 자동으로 포트를 변경해준다
 cfg.vm.synced_folder "../data", "vagrant" , disabled: true
 end
end

******************
<up  통해 가상머신을 배포>
[root@vagrant test]# vagrant up
  • 콘솔로 접속하여 인터페이스를 확인해보자
[root@vagrant test]# vagrant ssh ansible-server

  • 접속된 뒤에는 앞어 살펴본 것처럼 외부 연결용 인터페이스를 통해 연결된 주소 대역(DHCP)과 사설로 지정한 172.168.1.10 주소를 확인할 수 있다. 앤서블 노드와는 이 사설 주소를 통하여 연결할 계획이므로 관리의 유연함을 위하여 정적으로 IP 주소를 지정하는 것이 좋다.
    아직 생성된 앤서블 서버에는 ansible 이 설치되어 있지 않다

앤서블 서버에 앤서블 코어 설치하기

방금 작성했던 Vagrantfile을 일부수정하여 추가해주자

<Vagrantfile>
 config.vm.define "ansible-server" do |cfg|
 cfg.vm.box = "centos/7"
 cfg.vm.host_name = "ansible-server"
 cfg.vm.network "private_network", ip: "172.16.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 install -y epel-release"
 cfg.vm.provision "shell", inline: "yum install -y ansible"
 end
end
  • 추가된 내용만을 적용할 때에는 provision 으로 작성하고, vagrant provision 으로 실행하여 적용할 수 있다. 멱등성에 의해 기존의 내용은 적용되지 않는다.

앤서블 서버 환경설정하기

  • ansible, ansible playbook 라는 명령어는 그냥 입력하기에는 너무 길고 불편하다.
    또한 vi 편집기를 사용하다 보면 문법의 오류가 잦다 따라서 vi 편집기를 이용할 때 코드에 색과 줄 번호를 주도록 vi 환경을 추가로 설정해보자. 이를 위해서는 Vargant 파일의 수정과 별도의 yaml 파일 작성이 필요하다

<수정된 Vagrantfile>
**********
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
 config.vm.define "ansible-server" do |cfg|
 cfg.vm.box = "centos/7"
 cfg.vm.host_name = "ansible-server"
 cfg.vm.network "private_network", ip: "172.16.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 install -y epel-release"
 cfg.vm.provision "shell", inline: "yum install -y ansible"
 ----------------------------추가--------------------------------
 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
**********

[root@vagrant test]# vi ansible_env_ready.yml
**********
- name: Setup for the Ansible's Environment
 hosts: localhost
 gather_facts: no
 tasks:
   - 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'"

**********
profile
무럭무럭 자라볼까

2개의 댓글

comment-user-thumbnail
2022년 12월 19일

잘 보고 갑니다~~

1개의 답글