Ansible에서 ESXi 6.5 VM 관리하기 Computer Tip

회사에서 어찌 저찌 하다보니 혼자 DevOps를 구축하게 되었네요.
이제 그 끝이 보여갑니다.


각 회사마다 처해진 상황이 다르기 때문에 범용 DevOps라 하기에는 아직 좀 멀지만,
조금 다듬으면 ESXi 서버에 몽땅 필요한 것을 담아 넣고 DevOps 를 기동시킬 수 있겠습니다.
(나중에 기회가 되면 정리를 별도로 할 생각입니다)

그 중에 정리를 위해서 하나의 그림으로 먼저 시작을 해 봅니다.

위의 그림처럼 ESXi 6.5에 Photon Linux를 설치하고나서 위에 링크 중에 있는 "Ansible을 포함한 젠킨스 컨테이너"가 돌고 있습니다.
재미난 것은 이 ansible을 할아버지 뻘에 해당하는 VMware ESXi 서버를 핸들링하여 그 안에 있는 VM을 켜고/끄고, 실행하고, 스냅샷
관리하고 등등의 재미난 것들을 다 할 수 있다는 사실입니다.

여기에서 소프트웨어를 테스트하다보면 VM의 진가가 발휘하기 시작하는 순간이 드디어 옵니다.

예를 들어 Windows 7, 10,...(4가지 정도) / 영문, 한글, ... (5가지 언어) / 32bit, 64bit 등등의 조합으로 실제 머신에 설치한다면,
4 * 5 * 2 = 40 대의 머신이 필요합니다. 많아지만 질 수록 테스트할 개수가 엄청나 집니다.

물론 VM으로도 최초 한번은 설치를 하면 되고, 최소 설치해 놓고 몇가지 기본 사항만 정리한 다음,
Export 해 놓으면 다른 곳에서도 쉽게 가져다 사용할 수 있습니다.
Import 하면 새로 설치해야 하는 시간이 무척 단축되지요.

암튼 이런 상황에서 스냅샷이라는 개념이 아주 긴요하게 사용되는데요,
예를 들어 최초 OS가 설치되고 아무것도 설치되지 않은 상태에서 스냅샷을 "AfterOS"라고 걸어놓고,
어떤 설치 프로그램을 설치할 때 항상 AfterOS 스냅샷으로 되돌리기를 한 다음 설치를 하면
항상 클린 설치를 테스트해 볼 수 있습니다.

그렇지 않고 어떤 패키지를 이전 버전에서 업그레이드 테스트를 하려면
마지막 설치된 위치에서 스냅샷을 걸고 업그레이들 한 다음 실패하면 다시 되돌려서
업그레이드만 재시도를 해보고 성공하면 바로전의 스냅샷을 지우면 됩니다.

그러면 ansible에서는 이런 VM을 관리하기 위해서 어떤 것들이 있을까요?

여담이지만 10년전인 2008년에 ESXi 서버의 VM을 관리하기 위해서는 VIX API 라는 것이 있었는데
지원 언어가 C와 Perl 이 있던 기억이 납니다. C 보다는 Perl 이 낫다고 판단되어 Perl로 Logic 작업을 하였고,
일년 후 Perl의 제일 꽝인 Readability 를 극복하고자 파이썬을 시작했던 경험이 있습니다.

암튼 지금은 VMOMI (VMware Managed Object Management Interface) 라는 이름의 API를 VMWare에서 
제공하고 파이썬과 Go 로 지원을 하는데 파이썬 모듈이 pyVmomi 입니다. 그리고 ansible의 vmware관련 모듈은
하위에 pyVmomi를 사용합니다.
(위의 젠킨스 with 앤시블 컨테이너에 포함시켜놓았습니다)

다음은 아주 기초적인 것으로 ESXi 서버 중, 특정 VM에 명령을 실행하는 것을 해 보겠습니다.

앤시블 플레이북은 다음과 같습니다.

- name: VM shell playbook
  gather_facts: false
  hosts: linux
  tasks:
  - name: Run command inside a vm
    vmware_vm_shell:
      hostname: {{ esxi_host }}
      username: {{ esxi_user }}
      password: {{ esxi_pass }}
      #datacenter: myDatacenter
      #folder: /vm
      validate_certs: False
      vm_id: {{ vm_name }}
      vm_username: {{ vm_user }}
      vm_password: {{ vm_pass }}
      vm_shell: /bin/echo
      vm_shell_args: " 'Hello World' > /tmp/hw.txt "
      vm_shell_env:
        - "PATH=/bin"
        - "VAR=test"
      vm_shell_cwd: "/tmp"
    delegate_to: localhost
    register: shell_command_output

위에서 esxi_host, esxi_user, esxi_pass 는 ESXi 서버 연결 정보이고,
vm_name, vm_user, vm_pass 는 특정 VM의 연결 정보 입니다.
(datacenter 가 없으므로 해당 정보는 막고 돌렸습니다)

위에 변수 대신 실제 정보를 넣고 해당 컨테이너에서 실행시킨 모습입니다.

위의 명령을 돌리면 우분투 데스크탑인 VM에서 /tmp/hw.txt 에 "Hello World" 파일을 생성하는 것인데,

생각처럼 잘 되었습니다.
이후에는 ansible 문서에서 vmware 관련된 모듈을 참조하여 작업하면 쉽게 작업할 수 있습니다.


어느 분께는 도움이 되셨기를..

핑백

덧글

댓글 입력 영역

구글애드텍스트