2017년 6월 29일 목요일

[Vagrant] 15분만에 윈도우에서 Ansible 테스트 환경 구축하기 (서버 1대 + 노드 5대)

- 11 개의 댓글


(자료화면은 vagrantfile을 sublime Text3에서 작성하던 화면~)

하하하 테스트 정말 오래 걸리네요
이게 테스트를 하려면 한번 쳐다보고 10분 지나고 이런 경우가 꽤 있다 보니...

설치를 하고 실행하는 것은 데모 동영상으로 진행할까 합니다.

요약

vagrantfile이 ini파일 처럼 구성할 파일들을 code로 정의해 놓으면, 해당 구성 정보에 맞게 vagrant가 virtualbox(또는 Hyper-V, Docker, VMware, AWS, KVM등) 아주 다양하게 올려줍니다. 

즉, 지속적으로 사용해야 하는 환경을 반복 구성하는데 최적화 되어 있습니다. 
또는 템플릿 형식처럼, 배포하는 것에도 쓰여질수가 있겠죠? UI만 잘 입히면요. :) 
위키 참조 : https://en.wikipedia.org/wiki/Vagrant_(software)



설치 및 실행

1. virtualbox 설치 

oracle Virtual Box (https://www.virtualbox.org/) 에서 적합한 윈도우 버전을 다운받습니다.


2. vagrant 설치 

https://www.vagrantup.com/ 에서 Download를 눌러서 파일을 다운 받고 실행한다. 그리고 설치를 다 마치고 나면, 정상적으로 설치되었는지 확인을 위해 'cmd'를 실행하고 버전을 확인해 보자.

C:\Users\pagai>vagrant --version
Vagrant 1.9.5


3. 설치할 OS 다운로드 

기본적으로 계속 사용할 OS들이 vagrant에 잘 패키지 되어 있는데, 이는 다운로드 해서 사용한다.

현재 다운로드 되어 쓸수 있는 것들은 'vagrant box list' 명령어로 확인가능하다.
(이미 꽤 반복 작업을 해서 여러개 나오는겁니다..보통은 없습니당)

C:\Users\pagai>vagrant box list
16.04           (virtualbox, 0)
16.04_docker    (virtualbox, 0)
centos/7        (virtualbox, 1705.02)
precise32       (virtualbox, 0)
ubuntu/trusty64 (virtualbox, 20170619.0.0)

우리는 우분투 이미지와 센트를 쓸겁니다.
센트는 Ansible-server용으로
우분투는 Ansible-Node용으로 사용할 것입니다.

이미지 다운로드는 신기하게 명령어가 'add'를 씁니다. 그래서 명령어가 다음과 같습니다.

vagrant box add <다운받을 이미지 이름 or 경로>




그리고 이미지 찾기는 여기서 가능합니다.
https://app.vagrantup.com/boxes/search

추가적으로 위의 그림과 같은 버전들을 선택한 이유는 간단한데..
남들이 많이 쓰는게 좋다는 지론때문입니다.

중간에 사람 얼굴이 있는데..제작자인가? 싶은데... 외국인은 대머리도 멋있네요.
vagrant 대신에 homestead를 쓰는 경우도 종종 있더라고요 나중에 시간이 되면 두개를 비교해 볼 필요도 있을 것 같습니다아~!




4. 설치후 vagrantfile 구성 

이미지가 준비되었다면,  vagrant init --force(만약에 기존에 만든게 있어서 오류가 난다면)
을 실행해 어떻게 설치할지 결정하는 초기 파일을 만들수 있지만, 어짜피 제시하는 코드(내가 만든 코드) 를 가지고 할 것이기때문에 초기화 할 필요는 없다.
그래도 궁금하다면, 파일이름도 있고 하니...vagrant init --force를 실행하고 현재의 경로에 vagrantfile이 생성된 것을 확인하자.

이제 부터 나올 것들은 코드인데.. vagrant는 기본적으로 'ruby'라는 언어로 되어 있다. 하지만~! 하지만~! 별로 쫄것이 없는게..복잡한 것은 안 쓴다.
그냥 python에 비하면, do가 쓰여지면, 아래에 들여쓰기가 생겨야 하고(하위 메뉴처럼) end로 마감되어야 한다. 오류를 보면 쉽게 알수 있는 내용이다.

5. 실행 

'vagrant up'을 실행하기 전에 vagrantfile을 아래의 내용에서 카피해서 생성해야 하고, 같은 디렉터리에 Bootstrap.sh, Ansible_env_ready.yml 도 생성해 두어야 한다.

그리고 중요한거 하나 'vagrant plugin install vagrant-vbguest를 실행해야만 Host에 있는 디렉토리와 sync할때 에러가 나지 않는다.


실행 데모는 다음과 같다.



6. 코드 설명 

하나하나 더 설명할수는 없지만, Ansible-Server를 한번 설명하면 나머지는 쉽게 알수 있으리라고 생각한다. 이 글을 보시는 분들은 분명히 대단하신 분들일꺼다 :)

[ 앤서블 서버 ]



  config.vm.define:"ansible-server" do |cfg|
    cfg.vm.box= "centos/7"                    # VM을 만들고자 하는 운영체제를 선택
    cfg.vm.provider:virtualbox do |vb|        # VM에 직접적인 그러니까 버추얼박스에 설정을 진행
      vb.name= "HoonJo-Ansible-Server"
      vb.customize ["modifyvm", :id, "--cpus", 2]
      vb.customize ["modifyvm", :id, "--memory", 2048]
    end
    cfg.vm.host_name="ansible-server"         # 실제 VM에 호스트이름 linux에서 hostname 치면 나오는 것
    # 호스트와 VM간에 파일 교환을 위한 건데, 기본 설정이 rsync로 되어 있어서 windows의 경우 변경을 안해주면 오류가 남
    cfg.vm.synced_folder ".", "/vagrant", type: "virtualbox" 
    # eth0은 내부 NAT로 고정되어 있고, eth1번을 인터넷과 연결하도록 public으로 설정
    cfg.vm.network "public_network", ip: "172.30.1.10"
    # 개별 네트워크들의 기본 fowarded_port는 guest 22, host: 2222인데 중복되면 에러가 발생함
    # 이것의 목적은 vagrant ssh <hostname>을 했을때 경로를 포워딩 해줌
    cfg.vm.network "forwarded_port", guest: 22, host: 30110, auto_correct: false, id: "ssh"
    # centos7/rhel7은 default route를 설정하는 명령어가 좀 다름...-_-;
    cfg.vm.provision "shell",
      inline: "ip route replace default via 172.30.1.254 dev eth1"
    #앤서블 자체를 설치하고 hosts 이름들을 설정함
    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"
  end

7. 실제 코드



[ vagrantfile ]

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

# Ansible 테스트 서버
  config.vm.define:"ansible-server" do |cfg|
    cfg.vm.box= "centos/7"
    cfg.vm.provider:virtualbox do |vb|
      vb.name= "HoonJo-Ansible-Server"
      vb.customize ["modifyvm", :id, "--cpus", 2]
      vb.customize ["modifyvm", :id, "--memory", 2048]
    end
    cfg.vm.host_name="ansible-server"
    cfg.vm.synced_folder ".", "/vagrant", type: "virtualbox"
    cfg.vm.network "public_network", ip: "172.30.1.10"
    cfg.vm.network "forwarded_port", guest: 22, host: 30110, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell",
      inline: "ip route replace default via 172.30.1.254 dev eth1"
    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"
  end



# Ansible 테스트 노드 1번
  config.vm.define:"ansible-node01" do |cfg|
    cfg.vm.box= "ubuntu/trusty64"
    cfg.vm.provider:virtualbox do |vb|
      vb.name= "HoonJo-Ansible-Node01"
      vb.customize ["modifyvm", :id, "--cpus", 1]
      vb.customize ["modifyvm", :id, "--memory", 1024]
    end
    cfg.vm.host_name="ansible-node01"
    cfg.vm.synced_folder ".", "/vagrant", disabled: true
    cfg.vm.network "public_network", ip: "172.30.1.11"
    cfg.vm.network "forwarded_port", guest: 22, host: 30111, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell",
      run: "always",
      inline: "route add default gw 172.30.1.254"
    cfg.vm.provision "shell",
      run: "always",
      inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
  end



# Ansible 테스트 노드 2번
  config.vm.define:"ansible-node02" do |cfg|
    cfg.vm.box= "ubuntu/trusty64"
    cfg.vm.provider:virtualbox do |vb|
      vb.name= "HoonJo-Ansible-Node02"
      vb.customize ["modifyvm", :id, "--cpus", 1]
      vb.customize ["modifyvm", :id, "--memory", 1024]
    end
    cfg.vm.host_name="ansible-node02"
    cfg.vm.synced_folder ".", "/vagrant", disabled: true
    cfg.vm.network "public_network", ip: "172.30.1.12"
    cfg.vm.network "forwarded_port", guest: 22, host: 30112, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell",
      run: "always",
      inline: "route add default gw 172.30.1.254"
    cfg.vm.provision "shell",
      run: "always",
      inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
  end



# Ansible 테스트 노드 3번
  config.vm.define:"ansible-node03" do |cfg|
    cfg.vm.box= "ubuntu/trusty64"
    cfg.vm.provider:virtualbox do |vb|
      vb.name= "HoonJo-Ansible-Node03"
      vb.customize ["modifyvm", :id, "--cpus", 1]
      vb.customize ["modifyvm", :id, "--memory", 1024]
    end
    cfg.vm.host_name="ansible-node03"
    cfg.vm.synced_folder ".", "/vagrant", disabled: true
    cfg.vm.network "public_network", ip: "172.30.1.13"
    cfg.vm.network "forwarded_port", guest: 22, host: 30113, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell",
      run: "always",
      inline: "route add default gw 172.30.1.254"
    cfg.vm.provision "shell",
      run: "always",
      inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
  end



# Ansible 테스트 노드 4번
  config.vm.define:"ansible-node04" do |cfg|
    cfg.vm.box= "ubuntu/trusty64"
    cfg.vm.provider:virtualbox do |vb|
      vb.name= "HoonJo-Ansible-Node04"
      vb.customize ["modifyvm", :id, "--cpus", 1]
      vb.customize ["modifyvm", :id, "--memory", 1024]
    end
    cfg.vm.host_name="ansible-node04"
    cfg.vm.synced_folder ".", "/vagrant", disabled: true
    cfg.vm.network "public_network", ip: "172.30.1.14"
    cfg.vm.network "forwarded_port", guest: 22, host: 30114, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell",
      run: "always",
      inline: "route add default gw 172.30.1.254"
    cfg.vm.provision "shell",
      run: "always",
      inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
  end



# Ansible 테스트 노드 5번
  config.vm.define:"ansible-node05" do |cfg|
    cfg.vm.box= "ubuntu/trusty64"
    cfg.vm.provider:virtualbox do |vb|
      vb.name= "HoonJo-Ansible-Node05"
      vb.customize ["modifyvm", :id, "--cpus", 1]
      vb.customize ["modifyvm", :id, "--memory", 1024]
    end
    cfg.vm.host_name="ansible-node05"
    cfg.vm.synced_folder ".", "/vagrant", disabled: true
    cfg.vm.network "public_network", ip: "172.30.1.15"
    cfg.vm.network "forwarded_port", guest: 22, host: 30115, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell",
      run: "always",
      inline: "route add default gw 172.30.1.254"
    cfg.vm.provision "shell",
      run: "always",
      inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
  end

end





[ Bootstrap.sh ]
#!/usr/bin/env bash

yum install epel-release -y
yum install ansible -y

#hosts file
echo "172.30.1.11 node01" >> /etc/hosts
echo "172.30.1.12 node02" >> /etc/hosts
echo "172.30.1.13 node03" >> /etc/hosts
echo "172.30.1.14 node04" >> /etc/hosts
echo "172.30.1.15 node05" >> /etc/hosts


#ansible hosts file
echo "[Nodes]" >> /etc/ansible/hosts
echo "node01" >> /etc/ansible/hosts
echo "node02" >> /etc/ansible/hosts
echo "node03" >> /etc/ansible/hosts
echo "node04" >> /etc/ansible/hosts
echo "node05" >> /etc/ansible/hosts

#환경설정 초기 파일 구성 for vagrant ONLY
mkdir /home/vagrant/.vim
touch /home/vagrant/.vimrc
touch /home/vagrant/.bashrc
[ Ansible_env_ready.yml ] --- - name: Ansible_vim   hosts: localhost   remote_user: vagrant   gather_facts: no   tasks:     - name: Install vim-enhanced        yum:          name: vim-enhanced         state: present     - name: Download ansible-vim       shell: "curl -fLo /home/vagrant/.vim/autoload/plug.vim --create-dirs \               https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim"     - name: configure vimrc        lineinfile:         dest: /home/vagrant/.vimrc         line: "{{ item }}"       with_items:         - "set autoindent"          - "set cindent"          - "set number"         - "set smartcase"         - "set smarttab"         - "call plug#begin('~/.vim/plugged')"          - "Plug 'pearofducks/ansible-vim'"         - "call plug#end()"     - name: configure bashrc       lineinfile:         dest: /home/vagrant/.bashrc         line: "{{ item }}"       with_items:         - "alias vi='vim'"          - "alias ans='ansible'"         - "alias anp='ansible-playbook'"     - name: install vim-Plugin       shell: "vim -E -c 'PlugInstall' -c 'source /home/vagrant/.vimrc' -c 'qa' || true"        ignore_errors: yes - name: Change .vim permission shell: chown -R vagrant:vagrant /home/vagrant/.vim     - name: bash reload       shell: "source /home/vagrant/.bashrc"


수정 (2017.07.03)
  - vagrant user에 맞게 경로를 좀 더 세밀하게 수정하였습니다. 


추가 정보 :

윈도우 환경에서는 ssh가 기본적으로 제공되지 않기 때문에 vagrant ssh가 실행되지 못함
따라서 저는 git에서 사용하고 있는 ssh를 환경변수/시스템 에 포함시켜주었음
putty를 선호한다면 다음을 참고하세여~(저는 해야 할게 많아서 안함)
https://github.com/nickryand/vagrant-multi-putty



힌트 & 팁 :

1. 개발할때?
그리고 이런 개발을 하다보면, 자주 반복적으로 vagrant halt, vagrant destroy -f, vagrant up 세단계를 계속 써야 하는데. 이를 배치파일을 만들어서 돌리면 편하다.


[ vag_reconf.bat ]
#!/usr/bin/env bash
vagrant halt
vagrant destroy -f
vagrant up


@echo off
setlocal 
set /p name=어느 vagrant를 재 구성 및 시작하시겠습니까? 모두는 그냥 enter를 입력 하세요: || set name=default
if %name%==default (
 vagrant halt && vagrant destroy -f && vagrant up
) else (
    vagrant halt %name% && vagrant destroy %name% -f && vagrant up %name%
)

변경(2017.07.03) :
모두 껐다 키는 것은 효율적이지 않고, 필요한 부분만 조율 가능하도록 변경했습니다.
수정 후에 앤서블 서버가 동작하는 영상은 다음과 같습니다.





2. 윈도우에서 앤서블을 쓰고 싶지 않나요?
cygwin을 이용해서 가능하도록 만들어 주는 방법입니다. 
하지만 꼭 이렇게까지 써야할지는 물음표~


참고 사이트:

vagrant의 바이블
https://www.vagrantup.com/docs/index.html

참고할만한 정보들이 있음 (bridge network 참조)
https://friendsofvagrant.github.io/v1/docs/bridged_networking.html

init --force 옵션 
https://stackoverflow.com/questions/23325109/vagrant-errorvagrantfile-already-exists-in-this-directory/23326656

default-gateway 제거 
https://superuser.com/questions/752954/need-to-do-bridged-adapter-only-in-vagrant-no-nat

rsync 이슈
https://stackoverflow.com/questions/34176041/vagrant-with-virtualbox-on-windows10-rsync-could-not-be-found-on-your-path

에러를 찾아볼 소스 파일 (vagrant.git)
https://searchcode.com/codesearch/view/71587663/

vagrant configuration file 참조
http://perfspy.blogspot.kr/2016/02/one-thing-to-rule-them-all-ansible-on.html
http://www.barrymorrison.com/2015/Apr/10/vagrant-ansible-or-how-to-make-your-life-better-as-a-developer/

리눅스처럼 윈도우에서 실행 시간 알고 싶을때 
https://blog.update.sh/archives/209

vagrant plugin uninstall
https://stackoverflow.com/questions/30336351/does-vagrant-destroy-also-remove-vagrant-plugins

만약에 플래이북을 직접 실행이 가능한 리눅스 환경이라면?
https://stackoverflow.com/questions/20952689/ansible-ssh-forwarding-doesnt-seem-to-work-with-vagrant

전반적으로 vagrant와 ansible을 잘 설명해 놓은 곳 
https://adamcod.es/2014/09/23/vagrant-ansible-quickstart-tutorial.html

ssh-keygen을 편하게 ansible로 
https://coderwall.com/p/_ryxma/generate-ssh-keys-with-ansible

[Continue reading...]

2017년 6월 26일 월요일

[Ansible] debug모듈과 debugger에 대한 고찰

- 0 개의 댓글


드디어 debug를 합니다 :)

debug 부분에는 크게 두가지 부분이 있는데요.
debug 모듈을 통해서 필요한 메세지를 출력하고 그에 따라 정보를 확인하는 부분이 있고..
debugger를 yml파일에 삽입해서 라이브로(gdb처럼) 인자 값을 확인하고 필요에 따라서 수정도 할수 있는 부분이 있습니다.

그런데 그런데...엄청나게 길고 복잡한 것들을 하지 않는 경우에서는...딱히 쓸모가...
그보다 더 유용한 것을 1-2개 정도 공유 할 겁니다.

1. debug 모듈

우선 볼 것은, 진행되는 사항을 특별한 옵션 없이 좀더 보고 싶을때 사용할 수 있는 디버그 모듈 입니다. 사용하는 방법은 여러가지가 있지만, 간단하게 살펴 보고 넘어가겠습니다아~
그게 제가 보기에는 이렇게 사용하는 것도 좋지만 그냥 -vvvv 옵션을 줘서 사용하는게 더 편리할 것 같더라고요.
배포 버전일 경우는 다르지만, 개발할때는 오고 가는걸 확인하면서 자세히 보는 -vvvv 가 더 변수를 보기에 편리한 것 같다능...

[ nginx_bulk.yml ]
---
- hosts: cuda
  remote_user: nginx_user
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx
      register: result
    - debug: var=result

  handlers:
    - name: start nginx
      service: name=nginx state=started


만약에 저 옵션이 없는 경우에는 그냥 이렇게 나옵니다.


그리고 -v가 붙으면 더 자세하게 진행되는 사항들을 볼수 있는데...

-vvvv로 실행하면 아래와 같이 위에 간단한 변수들을 포함하여 거의 모든 내용을 볼수가 있습니다. 저도 yaml 짜다가 막히면 이걸로 봤어요. 



2. debugger

페이스북 앤서블 유저 그룹에서 YongKi Kim님이 공유해 주신 자료에 나와 있듯 redo나 continue 그리고 variables등에 대한 현재 인풋 값을 보고 조치 또는 작업할 수 있긴 하나...수백 라인이 아니라면 굳이....가끔 변수 값이 정확하게 들어가 있는지 확인차 시도해 볼수도 있겠습니다.


많이 많이 답답하면 말이죠 
개발자에게 필요한 툴로 보여지네요. 저희야 유저니까요 :) 

파일 안에 strategy (전략)에 debug라는 문구만 추가해 주면 알아서 오류에 따라서 break 포인트를 잡습니다. 

[ nginx_bulk.yml ]
---
- hosts: cuda
  strategy: debug
  remote_user: nginx_user
  become: yes
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx
      register: result
    - debug: var=result

  handlers:
    - name: start nginx
      service: name=nginx state=started


debug로 빠진 다음에 p vars(출력해라 변수들을)를 입력하면 엄청 많은게 나옵니다. 
(경우에 따라서 초반이면 적을수도 있고요)
이걸 보고 변수 값들이 정확하게 돌아가도록 입력 되었는지 확인해 보면 되겠네요. 



3. 유용한 정보 

그런데 이거를 눈으로 쳐다보고 있으면 눈이 빠지겠죠?

그래서 두가지의 방법을 활용해 볼수 있을 것 같습니다. 
확실하게 해결된다는 보장은 없지만 ^^;; 좀더 개선이 됩니다. 

1) 앤서블 로그

앤서블 환경 설정에 보면 로그를 기록하게 하는 것은 디폴트로 활성화 되어 있지 않습니다. 
왜냐..하면 로그가 너무 많이 쌓이니까요 하하하 :) 

하지만 저희는 필요할때는 켜서 확인하면서 보면 더 편리할 것입니다.

  /etc/ansible/ansible.cfg
 92 # logging is off by default unless this path is defined
 93 # if so defined, consider logrotate
 94 log_path = /var/log/ansible.log    <<< 수정해야 할 부분 

예를 들면 'tail -f /var/log/ansible.log'를 해 놓고 다른 창에서 실행하면서 비교해 볼수도 있기도 할꺼구요. (왼쪽이 명령 실행, 오른쪽이 tail로 실행 결과 확인하는 것입니다.)



2) 인간이 읽기 좋게 변경하기 

이게 무슨 말이냐면 내부/외부의 플러그인(보통 python 파일)을 이용해서, 결과 값이 좀더 읽게 좋게 해주는 것입니다. 이게...완벽하지는 않은데....그래도 꽤 괜찮습니다. 안 하는 것보다는 하는게 더 좋음 
vim을 있는 그대로 쓰는 것보다 칼라 스키마를 적용하면 더 좋게 쓸수 있는 것 같다고 하면 가장 비슷한 비유 같네요 :) 


2-1) 가장 쉬운 방법
우선 가장 쉬운 방법은 이미 지정되어 있는 callback을 키는 것입니다. 
이는 앤서블 2.x 이상에 있습니다. 

해당 사항을 변경하기 전에는 그냥 한줄을 쭈욱 쭈욱 쭈욱 나옵니다. 
짧으면 사실 읽는데 큰 부담이 없는데, 보기 안 좋습니다. 
코드도 한줄을 쭈욱 쭈욱 짤수 있고, 문서는 한줄로 쓸수 있는데 줄 바꿈을 하는 이유는 우리들이 쉽게 읽으려고 하는거니까요. 



그럼 변경을 해 보면 

 /etc/ansible/ansible.cfg
 63 # change the default callback
 64 stdout_callback = debug        <<< 수정해야 할 부분 
 65 # enable additional callbacks
 66 #callback_whitelist = timer, mail



내용은 같지만 좀 더 보기가 편해졌죠?
인증이 실패하였군요 라는 것?
하하하 1초를 절약하는게 어디입니까;;;;;

2-2) 두번째로 쉽고 재미있는 방법?
이건 순수하게 저만 재미있다고 느낄수 있는데...외부 플러그인을 활용하는 방법입니다. 
세상에는 많은 착한 의지를 가지고 순수하게 개발해주는 사람들이 있는데, 그 사람들이 개발한 것을 그대로 사용하는 것입니다. 

몇개를 사용해 봤는데 그중에 한 2개 정도가 그나마 쓸만한 것 같네요. 
그 중에서 저는 openshift-ansible을 쓸겁니다. 이게 좀더 간단하고 칼라풀 하더라고요. 

openshift-ansible

ansible-human_log


우선 plugin을 인식하는 위치를 앤서블 컨피그 파일에서 확인합니다. 
디폴트 설정은 왠만하면 안 바꿉니다. 

 /etc/ansible/ansible.cfg
174 # set plugin path directories here, separate with colons
175 #action_plugins     = /usr/share/ansible/plugins/action
176 #cache_plugins      = /usr/share/ansible/plugins/cache
177 callback_plugins   = /usr/share/ansible/plugins/callback
178 #connection_plugins = /usr/share/ansible/plugins/connection
179 #lookup_plugins     = /usr/share/ansible/plugins/lookup
180 #inventory_plugins  = /usr/share/ansible/plugins/inventory
181 #vars_plugins       = /usr/share/ansible/plugins/vars
182 #filter_plugins     = /usr/share/ansible/plugins/filter
183 #test_plugins       = /usr/share/ansible/plugins/test
184 #terminal_plugins   = /usr/share/ansible/plugins/terminal
185 #strategy_plugins   = /usr/share/ansible/plugins/strategy


잡았다 요놈!

하지만 해당 디렉터리에 가보면 디렉터리가 없습니다. 따라서 우선 만들어 주고요. 
curl로 raw파일을 다운로드 받습니다. (git이 없습니당;;)

[root@ansible ~]# mkdir -p /usr/share/ansible/plugins/callback

[root@ansible ~]#
curl -o /usr/share/ansible/plugins/callback/default.py https://raw.githubusercontent.com/openshift/openshift-ansible/master/callback_plugins/default.py  


그리고 나서 다시 실행하면 거의 똑같이 사람이 읽기 좋은 결과를 보여줍니다. 
상황에 따라서, 다르게도 보여질수도 있고, 같게 나올수도 있어서...이건 선택의 문제 같네요 :) 



이런 것들은 활용한다면 좀더 쉽게 플레이북을 만들고 활용할 수 있겠네요 :) 



[Continue reading...]

2017년 6월 25일 일요일

[Ansible] '타워'로 NXOS에 vlan 만들기 (8)

- 0 개의 댓글


원래는 7번째 글에서 Ansible 시리즈를 완료하려고 하였으나~
생각해 보면 타워에서도 NXOS에 vlan 정도는 만들어줘야 궁금증이 해소 될 것 같아서..

타워가 약간 코어랑 다른 부분들이 있기도 하고...

그런 의미에서 준비했습니다 :)



결과부터 얘기하자면, (항상 테스트 다 하고 글을 씀) 당황스럽네요 ㅎㅎㅎㅎ
왜 다르지 -_-; 라는 생각이....


자 '앤서블 타워에서 NXOS에 vlan을 만들기'라는 주제로 순서대로 진행해 볼까요?

1. Credentials 만들기 
이전 글을 보셨다면, 다 아시겠지만~ 인증 절차를 통과하도록 만들어 줘야합니다.
근데 의문인게..네트워크 장비니까 (가상이지만) 나는 Machine 타입이 아니라 Network로 해야지 라고 하면..나중에 ssh 로긴이 안됩니다.

어디다가 쓰는 type일까요?
연구가 필요합니다...일단 Type을 Machine으로 해주어야 합니다.








네트워크로 지정하고 하면 모듈을 shell이나, command를 선택하면, 저쪽에서 진행이 안됩니다. 혹여나 나중에 모듈에 nxos가 추가되면 가능할수도 있을꺼 같긴 한데...일단은 안됩니다. 그러니 우리는 Machine을 타입으로 지정합니다.


2. 애드혹(Run command) 해보기
그러면 우리는 여기서 AD-Hoc(Run command로 한번만 처리하는 방식)을 하게 되면 에러를 계속 만나게 됩니다.




왜냐면...모듈이 NXOS가 아니니까요 제대로 로그인 이후에 환경을 못 불러옵니다.
왠지 예전에 NX-OS 테스트 환경 구축 실패 사례 가 떠오르지 않나요?

네 그거랑 같은 상황 입니다.

따라서...결국 NXOS를 핸들링 하려면 플레이북을 써야 합니다.
거기서는 모듈을 메뉴얼하게 입력해서 쓸수 있으니까요.

3. 프로젝트 만들기
타워에서 플레이북을 쓰려면 프로젝트라는 것을 만들어야 합니다.
왠지 쉽게 하려다가 일이 커지는 느낌이죠?



근데 원래 자주 사용하는 것은 이렇게 만들어 두고 쓴답니다.
매번 사용할 것들을 UI에서 하나하나 클릭 한다면 효율적이지 않으니까요.

졸지에 '타워에서 프로젝트랑 플레이북 만들기' 라는 글이 되어 버렸네요. 하하하;;;





처음에 프로젝트를 만들면 알수 없는 말들이 많지만, 그 중에서 가장 이상하게 보이는 것은 SCM Type이 인데요.


어떤 소스를 쓸꺼냐는 건데, 저희는 직접 작성한 소소를 쓸꺼라 Manual을 선택하면, 이런 에러가 나옵니다.
대략 보면, 나는 /var/lib/awx/projects에 위치한 것만 읽을 꺼고 또한, 유저 그룹이 모두 awx어야만 그걸 봐줄꺼라는 의미입니다.

따라서 yml 플래이북 파일을 여기에 옮기고, 오너십을 변경해 주어야합니다.
이렇게요.



그러고 나면 플래이북 yml파일을 프로젝트에서 읽어들일 수 있습니다.


4. 템플릿 만들기 

프로젝트를 실행하기 위해서는 해당 프로젝트가 실행되는데, 필요한 요소들이 입력되는 템플릿을 만들어줘야 하는데요(왠지 하다보니 꼭 네트워크에 클래스 맵 짜는거 같은 느낌이..)


여기서 재미있게 황당한 일을 겪습니다.
위에 보면 노란색 부분을 일부로 구분되게 한 인벤토리라는 부분이 있는데요.


즉 인벤토리란 제가 사용하고 싶은 호스트를 등록하고 그냥 쓰는 거였죠.
하지만 여기에는 왜 그룹이라는게 추가 되었을까요?

시연을 위해서? 기능 설명하려고?
아닙니다..저는 최소한의 노력으로...최대의 효과를....쿨럭....




네 이게 없으면, 호스트를 'extra-vars'로 받지 못합니다.
다른 방법은 아직 못 찾았는데요...

무슨 말인고 하면, 앤서블 타워가 아니라 앤서블 셸에서 아래와 같이 실행을 하면 잘 돌아갑니다.


[ vlan_ex.yml ]
---
- name: vlan management
  hosts: '{{ dest }}'
  connection: local
  gather_facts: no


  tasks:
    - name: vlan create
      nxos_vlan: 
        vlan_id: 10
        username: admin
        state: present 
        name: by_ansible 
        transport: nxapi



저 extra-vars를 호스트에 넣으면 인식하지 못합니다.


이 에러는 보통 hosts라는 건 입력 값이 아니라서 못 쓰는 경우인데요
yml 파일 안에서 hosts를 또 쓰면 발생합니다.

---
- name: vlan management
  hosts: '{{ hosts }}'
.....

근데 ...계속 저런 에러가 나더라고요...
그래서 방법을 찾고 찾고 찾아보니..두가지가 가능한데요.

1) yml파일에서 hosts파일을 fixed로 입력
예시 > hosts: 172.30.1.201

2) 그룹을 만들고 그룹 이름을 yml에 입력
예시 > hosts: switches

2)번 내용을 볼때는 /etc/ansible/hosts파일 대신에 앤서블 타워는 그룹 이름이 이걸 대체하는 것 같습니다.

같으면 좋긴 할텐데...다르네요...다르네요...


그래서 결론을 얘기하자면, 이런 그룹내용을 앤서블 타워가 읽어서 실행한다~!
입니다. 여기까지 오는데다가 쉽지가 않네요...두개가 동작하는게 약간 차이가 있어서...

[ vlan_ex.yml ]
---
- name: vlan management
  hosts: switches
  connection: local
  gather_facts: no


  tasks:
    - name: vlan create
      nxos_vlan: 
        vlan_id: 10
        username: admin
        state: present 
        name: by_ansible 
        transport: nxapi




실행 결과~


예전에 한 것처럼 쓸모 있게 하는건 나중에 아이디어가 떠오르면 포스팅 하겠습니다~



참고자료 : 
https://linuxsimba.com/ansible-tower-network-automation-example

[Continue reading...]

2017년 6월 22일 목요일

[Ansible] '타워'를 통해서 GUI로 쉽게 관리하기 (7)

- 2 개의 댓글


드디어 드디어~~
GUI를 !! 글을 올립니다.

그 대단원의 마지막을 장식할~~(사실 debug도 할 예정이긴 하지만;;)

시작하기 전에 굉장히 쉬울줄 알고 편한 마음을 가지고 했는데...
역시 인생을 쉽지가 않은지라...시행 착오가 여러가지 있었네요..


뭐하기만 하면, 자꾸 에러를 밷는 시스템...


최종 모델은 기존에 CLI에서 한 것처럼, nginx를 cuda 3총사에 배포할 것입니다.
아이디는 cuda이고 우분투 16.04버전입니당~!

결국 플레이북(PlayBook)으로 여러 대에 nginx을 한방에 설치하기 (3) 를 GUI로 구현한다고 보면 될 겁니다. :)

플레이북 짜기 어렵고, 나는 그냥 편하게 쓰고 싶은데 편하게 쓰게 해줘~!


의 컨셉으로 시작을 했는데......쉬운 것도 있고 어려운 것도 있고..그러네요 이건 마지막에 소감에서..


시작은 언제나 그렇듯 :) 

구성
             Ansible-controller (RHEL 7.2)               << 172.30.1.53
             |               |                   |
        cuda#1        cuda#2         cuda#3            << 172.30.1. (101, 102, 103)


1. 설치 파일 다운로드 

앤서블 컨트롤러에서 타워를 설치하는 파일을 다운로드부터 받습니다.

[root@Ansible ansible_tower]# curl -O https://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 3761k  100 3761k    0     0   425k      0  0:00:08  0:00:08 --:--:--  530k

2. 사전 구성

그리고 압축을 해제하고, 설치(setup.sh)를 실행하기 이전에 세팅을 해야 할 것들이 있습니다. 바로 인벤토리 구성 파일에 암호 설정 입니다.





주의
그냥 설치하면 이렇게 됩니다. 



암호 설정을 안 했다고 에러를 밷는 친절한 설치 파일 


그런데~!그런데~~! 다 한거 같은데 이상한 에러를 밷습니다. 


정말 여러가지를 해 보면서, 아래와 같이....계속 삽질하다가..



두가지의 주요한 정보를 찾았는데 

[Errno 14] yum fails with HTTP/HTTPS Error 404
https://access.redhat.com/articles/1320623

How to solve %24releasever error when doing yum update?
https://access.redhat.com/solutions/1417753

결론부터 얘기하자면, 버전 정보를 해석하지 못해 다음과 같은 yum repo를 경로를 찾지 못한 것이었다.

시스템이 찾고자 하는 경로 
http://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-%24releasever-x86_64/repodata/repomd.xml

실제 repodata가 있는 경로 
http://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7.2-x86_64/repodata/repomd.xml



경로가 해석이 안되니, repo 업데이트를 못함 


그래서 다음과 같이 해결했다. 
[root@Ansible]# touch /etc/yum/vars/releasever
[root@Ansible]# echo "7.2" >> /etc/yum/vars/releasever

실행전 
[root@Ansible yum.repos.d]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Loaded plugins: fastestmirror, product-id
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'r': '7.2',
 'releasever': '$releasever',
 'uuid': 'fb0d8a73-9a42-47ec-844d-fac61c101a3c'}

실행후
[root@Ansible yum.repos.d]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Loaded plugins: fastestmirror, product-id
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'releasever': '7.2',
 'uuid': 'fb0d8a73-9a42-47ec-844d-fac61c101a3c'}

그러면 이제 설치가 쑥쑥 됩니다. 




이렇게 설치 완료~~~!!!

3. 앤서블 타워를 웹브라우저에서 접속 

(admin / password)  < 아까 인벤토리에서 입력했었음 



4. 라이센스 입력하기 
관대하게도 R사에서 10개 노드까지는 무료로 쭈욱~~ 쓰라고 했으니..편하게 10개를 테스트하기 위해서 라이센스를 받읍시다.


정보를 잘 입력하고 나면 이메일로 라이센스 파일이 온다.


 그러면 그 라이센스 파일을 'BROWSE' 버튼을 눌러서 입력하면 끝~!


5. ping 테스트 

사실 여기까지 하고 나서는...이제 쉽게 되는거만 보여주면 끝나겠지?
야호 이제 다 했다..라고 생각했었지....

미래의 나에게 애도를..


문제가 어떤거냐면....자료가 없다..
앤서블 코어나 플레이북 같은 경우는 아주 구글에 널리고 널린게 자료에 레퍼런스인데..
타워는 타워 도큐먼트를 제외하고는..거의 없다고 보면 된다..

특이하게는 시연은 많은데..내가 해보고 싶은건...간단하게 기능테스트인데..그런 설명을 찾아 볼수가 없다..

뭐..시작을 했으니...통밥으로 해야지하고 ...그냥 시도함..
사실 ping 테스트도 안 하고 바로 nginx를 설치하고 잘 되죠 끝~!
이런 계획이었으나...메뉴도 몇개 없는데..어디서 부터 해야 할지 몰라서 
ping 테스트부터 잘 되는 것을 확인하고자 했다.~~

삽질 중에 한 장면


우선 관리할 호스트들을 등록해야 하는데, 숫자가 많지 않으니 그룹을 만들진 않고 인벤토리에서 Cuda 인벤토리를 만들고 거기에 호스트들을 추가해줬다. 
(여긴 이미 Cuda를 만들어 둬서 밑에 인벤토리에 존재하는 것이다.)



그러고 나서 Cuda를 눌러서 들어가 보면, 호스트를 추가할 수 있게 하는 화면이 나온다.
관리할 호스트들을 여기서 추가해주자~!



추가가 끝나면, ping 테스트를 할꺼니까 그 중에 하나를 클릭 하고, 'RUN COMMANDS' 버튼을 누른다. 


이 상태에서 모듈은 ping으로 'MACHINE CREDENTIA'은 'Demo Credential'로 설정하고 진행하면 에러가 난다. 


곧 에러가 날 화면 

그게 이제는 알겠는데, Module은 yum, apt, shell 등과 같이 task에서 쓰여지는 진짜 모듈이고, Machine Credential은 이때 필요한 권한들인 것이다..
이게 의외로 설명이....자세히 꼼꼼히 메뉴얼을 정독하면서 볼수도 있겠지만...

어쨌든..이제는 유저 설정 및 권한 설정을 해야 한다는걸 알고 있으니, 
위에 톱니바퀴를 누르고 'CREDENTIALS' 타일(이런걸 타일 GUI라고 불러서;;) 을 누르자. 



그리고 다음과 같이 설정하고, 저장한다. 
(우분투들의 계정이름은 'cuda'이다. )



자 이제 다시 인벤토리를 가서 'RUN COMMAND'를 해본다. 



내 머리 속엔 앤서블, 너, 로맨틱, 성공적




5. 3개의 호스트에 한번에 nginx 설치 

드디어 대단원은 마지막이다.
다음과 같이 실행한다. 


여기서 all이라고 하면 모든 호스트(101번, 102번, 103번)를 말한다.


자 그러면 직접 호스트에서도 확인해 보자. 


잘 설치 되었다.~~~~!!!

6. 3개의 호스트에 한번에 nginx 삭제

그래도 설치도 해 봤으니 삭제도 해보는게 좋겠다. 
기존에 썼던 autoremove 옵션도 줬다. 



일단 성공적이라고 한다~~! 하지만 검증도 해봐야지

삭제도 어느정도 잘 되었다. 
(기존과 동일하게 연관 파일이 삭제 안되긴 했지만..이건 앤서블하고는 무관하다.)
두번째 실행한 것에 한개만 남아 있는걸 확인하시라~!


총평 

쉽고 편하고 재미가 있긴 한데..외부에 자료가 너무 없다..
그래서 따라하기 수준으로 하고자 할때 참고할만한 블로그, 기사, 튜토리얼이 전무한 실정이다..물론 CLI명령어가 편하고 가공도 쉽고 하겠지만, 생산성을 생각했을때는 ...
(업무를 효율적으로 하기 위해서 또 다른 업무를 배워야 하는가?)

일단은 간단한 결과라는 것은 이제는 알겠는데...여기까지 오는게 쉽지가 않다..
참고 할만한 데이터 혹은 자료가 공홈 말고는 거의 없는 실정이기 때문이다..

여하튼 기회된다면, 한번씩 써보시면서 즐거운 앤서블 생활이 되면 좋겠다~!
쉽게 AWESOME TOOL의 느낌이다. 


참고 자료 : 

앱서블 타워 소개

설치 가이드 

퀵스타드 가이드

유저 가이드 

어드민 가이드

애저용 앤서블 타워 가이드
[Continue reading...]
 
Copyright © . 쿠버네티스 전문가 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger