Ansible Playbook CI를 GitLab을 사용하여 VMware의 VM 인스턴스로 시도

여기에서는 Ansible의 Playbook CI를 하기 위해 컨테이너를 사용하지 않고 VMware의 VM 인스턴스에서 실행해 보겠습니다.

환경




품목
버전


Ansible
2.8.1

GitLab
11.11.0-ce

VMware vCenter
6.7.0

VMware ESXi
6.7.0


CI 흐름


  • GitLab에 로컬 리포지토리 푸시
  • GitLab CI로 시작한 컨테이너에서 vCenter에 CI 용 VM 인스턴스를 생성 (클론)하는 Playbook 실행
  • 동작 테스트를 원하는 Playbook 실행
  • CI 용 VM 인스턴스가 시작되면 SSH로 연결하고 테스트하는 Playbook 실행
  • Playbook 실행 종료 후 CI 용으로 만든 VM 인스턴스 삭제

  • 그건 그렇고, 여기서 CI 용 VM 인스턴스는 DHCP에서 IP를 얻고 있습니다.

    사용할 Playbook



    구조



    리포지토리의 구조는 다음과 같습니다.
    .
    ├── .gitlab-ci.yml
    ├── ci
    │   ├── operation_ci_vm.yml
    │   ├── playbook_ci.yml
    │   └── vars
    │       └── main.yml
    └── main.yml
    

    파일 설명



    operation_ci_vm.yml



    CI용 VM 인스턴스를 만들거나 삭제하는 Playbook입니다.
    ---
    - name: Operation of VM for CI
      hosts: localhost
      gather_facts: no
      vars_files:
        - vars/main.yml
      tasks:
        - name: Operation the virtual machine for CI.
          vmware_guest:
            hostname: "{{ vcenter }}"
            username: "{{ username }}"
            password: "{{ password }}"
            validate_certs: no
            datacenter: "{{ datacenter }}"
            name: "{{ vm_name }}"
            template: "{{ template }}"
            folder: "{{ datacenter }}/vm"
            state: "{{ item }}"
          loop: "{{ state }}"
    

    playbook_ci.yml



    CI용 VM 인스턴스가 시작되기를 기다리고 시작한 후 VMware Tools를 통해 IP를 검색하고add_host 인벤토리에 추가하는 Playbook입니다.
    VM 인스턴스가 시작되면 테스트를 원하는 Playbook을 로드하고 실행합니다.
    ---
    - name: Add host for CI to inventory
      hosts: localhost
      gather_facts: no
      vars_files:
        - vars/main.yml
      tasks:
        - name: Wait for VMware tools.
          vmware_guest_tools_wait:
            hostname: "{{ vcenter }}"
            username: "{{ username }}"
            password: "{{ password }}"
            validate_certs: no
            name: "{{ vm_name }}"
    
        - name: Gather facts from vm.
          vmware_guest_facts:
            hostname: "{{ vcenter }}"
            username: "{{ username }}"
            password: "{{ password }}"
            validate_certs: no
            datacenter: "{{ datacenter }}"
            name: "{{ vm_name }}"
          register: gather_facts_from_vm_result
          retries: 60
          delay: 5
          until: gather_facts_from_vm_result.instance.ipv4 is not none
    
        - name: Add ci host.
          add_host:
            hostname: "{{ vm_name }}"
            ansible_host: "{{ gather_facts_from_vm_result.instance.ipv4 }}"
            ansible_user: root
            ansible_password: secret
            groups:
              - all
    
    - name: Playbook test
      import_playbook: "{{ test_playbook_path }}"
    

    vars/main.yml



    CI용 VM 인스턴스를 작성하기 위한 변수를 정리한 파일입니다.
    ---
    vcenter: 192.168.0.111
    username: [email protected]
    password: secret
    datacenter: DC
    vm_name: CentOS7-CI
    template: CentOS7_TMP
    


    변수
    설명


    vcenter
    vCenter IP 또는 호스트 이름을 지정합니다.

    username
    vCenter에 로그인할 사용자 이름을 지정합니다.

    password
    vCenter에 로그인할 암호를 지정합니다.

    datacenter
    CI용 VM 인스턴스를 만들 데이터 센터를 지정합니다.

    vm_name
    만들 VM 이름을 지정합니다.

    template
    복제 원본 VM을 지정합니다.


    main.yml



    여기에서는 테스트에서 Apache를 설치하고 시작하는 Playbook을 만들어 보았습니다.
    이것은 VM 인스턴스에서 실행되는 Playbook입니다.
    ---
    - name: test playbook
      hosts: all
      gather_facts: no
      tasks:
        - name: install apache.
          yum:
            name: httpd
            state: present
    
        - name: start apache.
          systemd:
            name: httpd
            state: started
    

    gitlab-ci.yml



    GitLab CI 파일은 다음과 같이 만들었습니다.
    ---
    image: centos:7
    stages:
      - test
    
    variables:
      ANSIBLE_HOST_KEY_CHECKING: "False"
    
    before_script:
      - yum -y install openssh-clients sshpass epel-release
      - yum -y install python2-pip
      - pip install ansible requests pyvmomi
      - "ansible-playbook ci/operation_ci_vm.yml -e \"{'state': ['poweredon']}\""
    
    after_script:
      - "ansible-playbook ci/operation_ci_vm.yml -e \"{'state': ['poweredoff', 'absent']}\""
    
    playbook_test:
      stage: test
      script:
        - "ansible-playbook ci/playbook_ci.yml -e \"{'test_playbook_path': '../main.yml'}\""
    

    GitLab CI/CD 파이프라인 구성 참조

    CI 실행



    CI를 실행하면 다음과 같습니다.



    이제 VM 인스턴스를 사용하여 Playbook의 CI를 만들었습니다 :)

    좋은 웹페이지 즐겨찾기