Ansible로 vSphere의 가상 머신에 여러 Disk 추가

목차


  • 1. 소개
  • 2. 사용 환경
  • 3. Ansible 구성
  • 4. hosts 만들기
  • 5. tasks 만들기
  • 6. playbook 만들기
  • 7. vars 만들기
  • 8. Ansible 실행
  • 9. 결론
  • 10. 기술 정보
  • 11. 참고 URL

  • 1. 소개



    Ansible을 사용하여 vSphere에 가상 머신을 구축할 때 vmware_guest_disk 모듈을 사용하여 하드 디스크를 추가했습니다.
    하나의 디스크를 추가하면 간단하지만 2장 이상의 추가를 할 경우 unit_number의 루프 방법을 생각해야 했기 때문에 Playbook에 정리했습니다.

    2. 사용 환경



    · CentOS 8
    ・Ansible 2.9.10
    · vSphere 7.0

    3. Ansible 구성


    .
    |-- add_disk.yml
    |-- host_vars
    |   `-- vcsa7
    |       `-- main.yml
    |-- hosts
    `-- include_add_disk.yml
    

    4. hosts 만들기



    hosts의 내용은 다음과 같습니다. 호스트 이름과 IP를 나열합니다.
    [target]
    vcsa7 ansible_host="vcenter ip"
    

    5. tasks 만들기



    다음과 같은 태스크(include_add_disk.yml)를 작성해 갑니다.
    ---
    - name: 仮想マシンのディスク情報を取得
      vmware_guest_disk_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
        name: "{{ vm_name }}"
        datacenter: "{{ datacenter }}"
      register: disk_info
      delegate_to: localhost
      ignore_errors: true
    
    - name: set fact - controllerFacts
      set_fact:
        controllerFacts: "{{ disk_info.guest_disk_info.values()| map(attribute='controller_key') | list  }}"
      delegate_to: localhost
      ignore_errors: true
    
    - name: set facts - controllerKey
      set_fact:
        controllerKey: "{{ controllerFacts | sort | last  }}"
      delegate_to: localhost
      ignore_errors: true
    
    - name: debug
      debug:
        var: "{{ disk_info.guest_disk_info.values() | selectattr('controller_key','equalto',(controllerKey | int)) | map(attribute='unit_number') | list | sort | last |int +1 }}"
      delegate_to: localhost
    
    - name: set fact - unitNumber
      set_fact:
        unitNumber: "{{ disk_info.guest_disk_info.values() | selectattr('controller_key','equalto',(controllerKey | int)) | map(attribute='unit_number') | list | sort | last |int +1 }}"
      delegate_to: localhost
      ignore_errors: true
    
    - name: Skip SCSI controller No 7
      set_fact:
        unitNumber: "{{ unitNumber | int+1 }}"
      delegate_to: localhost
      ignore_errors: true
      when:
        - "unitNumber is defined"
        - "unitNumber == '7'"
    
    - name: ディスクを追加
      vmware_guest_disk:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
        name: "{{ vm_name }}"
        datacenter: "{{ datacenter }}"
        disk:
        - size_gb: "{{ loop_disks.disk_size }}"
          type: "{{ disk_type }}"
          state: present
          datastore: "{{ datastore_name }}"
          scsi_type: "{{ scsi_type }}"
          scsi_controller: "{{ controllerKey[3:4] }}"
          unit_number: "{{ unitNumber }}"
      register: add_disk
      delegate_to: localhost
    

    우선, 실행 대상의 가상 머신의 디스크 정보를 취득합니다.
    ---
    - name: 仮想マシンのディスク情報を取得
      vmware_guest_disk_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
        name: "{{ vm_name }}"
        datacenter: "{{ datacenter }}"
      register: disk_info
      delegate_to: localhost
      ignore_errors: true
    
    

    debug의 결과는 다음과 같습니다.
    TASK [debug] ****************************************************************************************
    ok: [vcsa7] => {
        "disk_info": {
            "changed": false,
            "failed": false,
            "guest_disk_info": {
                "0": {
                    "backing_datastore": "2_QNAP_datastore",
                    "backing_eagerlyscrub": false,
                    "backing_filename": "[2_QNAP_datastore] ansible_test/ansible_test.vmdk",
                    "backing_thinprovisioned": false,
                    "backing_type": "FlatVer2",
                    "backing_uuid": "6000C294-982e-e8d1-f5dc-f106b7fca5fc",
                    "backing_writethrough": false,
                    "capacity_in_bytes": 17179869184,
                    "capacity_in_kb": 16777216,
                    "controller_bus_number": 0,
                    "controller_key": 1000,
                    "controller_type": "paravirtual",
                    "key": 2000,
                    "label": "Hard disk 1",
                    "summary": "16,777,216 KB",
                    "unit_number": 0
                }
            }
        }
    }
    

    그런 다음 현재 사용 중인 컨트롤러 키를 가져옵니다.
    컨트롤러 유형에 따라 컨트롤러 키가 결정됩니다.
    (예 : SCSI 컨트롤러 0 : 1000, SCSI 컨트롤러 1 : 1001 등 ...)
    - name: set fact - controllerFacts
      set_fact:
        controllerFacts: "{{ disk_info.guest_disk_info.values()| map(attribute='controller_key') | list  }}"
      delegate_to: localhost
      ignore_errors: true
    
    

    debug의 결과는 다음과 같습니다.
    TASK [debug] ****************************************************************************************
    ok: [vcsa7] => {
        "controllerFacts": [
            1000
        ]
    }
    

    취득한 controllerFacts 를 소트 합니다.
    - name: set facts - controllerKey
      set_fact:
        controllerKey: "{{ controllerFacts | sort | last  }}"
      delegate_to: localhost
      ignore_errors: true
    
    

    debug의 결과는 다음과 같습니다.
    TASK [debug] *****************************************************************************************************
    ok: [vcsa7] => {
        "controllerKey": "1000"
    }
    

    ※ 참고로 SCSI 컨트롤러 0(1000)과 SCSI 컨트롤러 1(1001)을 사용했을 경우는 아래와 같이 『1001』이 컨트롤러 키로 저장됩니다. 따라서 여러 컨트롤러를 사용하는 경우 고려해야 합니다.
    TASK [set fact - controllerFacts] *****************************************************************************************************
    ok: [vcsa7]
    
    TASK [debug] *****************************************************************************************************
    ok: [vcsa7] => {
        "controllerFacts": [
            1000,
            1001
        ]
    }
    
    TASK [set facts - controllerKey] *****************************************************************************************************
    ok: [vcsa7]
    
    TASK [debug] *****************************************************************************************************
    ok: [vcsa7] => {
        "controllerKey": "1001"
    }
    
    

    단위 번호를 가져옵니다. 마지막 'int +1'에 의해 취득한 unit_number에 +1 하고 있는 값이 세트 됩니다.
    - name: set fact - unitNumber
      set_fact:
        unitNumber: "{{ disk_info.guest_disk_info.values() | selectattr('controller_key','equalto',(controllerKey | int)) | map(attribute='unit_number') | list | sort | last |int +1 }}"
      delegate_to: localhost
      ignore_errors: true
    
    

    debug의 결과는 다음과 같습니다.
    TASK [debug] *****************************************************************************************************
    ok: [vcsa7] => {
        "unitNumber": "1"
    }
    

    유닛 넘버로 7번은 할당할 수 없기 때문에 스킵을 실시하도록 합니다.
    - name: Skip SCSI controller No 7
      set_fact:
        unitNumber: "{{ unitNumber | int+1 }}"
      delegate_to: localhost
      ignore_errors: true
      when:
        - "unitNumber is defined"
        - "unitNumber == '7'"
    

    제어 키와 유닛 번호의 변수화가 완료되면 'vmware_guest_disk' 모듈을 사용하여 디스크를 추가합니다.
    『controllerKey[3:4]』는 컨트롤러 키(1000)의 네 번째 자리(0)를 취득하고 있습니다.
    - name: ディスクを追加する
      vmware_guest_disk:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
        name: "{{ vm_name }}"
        datacenter: "{{ datacenter }}"
        disk:
        - size_gb: "{{ loop_disks.disk_size }}"
          type: "{{ disk_type }}"
          state: present
          datastore: "{{ datastore_name }}"
          scsi_type: "{{ scsi_type }}"
          scsi_controller: "{{ controllerKey[3:4] }}"
          unit_number: "{{ unitNumber }}"
      register: add_disk
      delegate_to: localhost
    

    6. playbook 만들기



    방금 만든 작업으로 playbook(add_disk.yml)을 만듭니다.
    ---
    - hosts: all
      gather_facts: false
      tasks:
        - name: タスクを読み込む
          include_tasks: include_add_disk.yml
          with_items:
             "{{ disks }}"
          loop_control:
            loop_var: loop_disks
    

    7. vars 만들기



    변수는 host_vars에 저장됩니다. 사용 환경에 따라 값을 변경하십시오.
    vcenter_hostname: "vcenter hostname"
    vcenter_username: "vcenter username"
    vcenter_password: "vcenter password"
    vm_name: test_vm
    datacenter: /Datacenter/vm
    disks:
     - disk_size: 10
     - disk_size: 14
    disk_type: thin
    datastore_name: datastore1
    scsi_type: paravirtual
    

    8. Ansible 실행



    가상 머신을 설정하기 전의 상태입니다.

    Ansible을 실행합니다.
    [root@localhost ansible]# ansible-playbook add_disk.yml -i hosts
    
    ・
    ・
    ・
    PLAY RECAP **************************************************************************************************
    vcsa7                      : ok=22   changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
    

    Playbook이 성공하면 가상 머신을 확인합니다. 디스크 2, 디스크 3이 지정된 크기로 추가되었는지 확인할 수 있습니다.


    9. 결론



    이번에는 SCSI 컨트롤러를 사용하여 디스크를 추가했습니다.
    결정타입의 실행이라면 여기까지 고려할 필요는 없습니다만, 가능한 한 범용적으로 태스크를 작성하려면 궁리가 필요하게 됩니다.

    10. 기술 정보



    Ansible Molecule을 사용한 테스트 자동화 의 기사를 작성하고 있습니다. role을 테스트해 주는 툴이 됩니다. 실행환경을 자동으로 구축하고, 환경의 삭제도 실시할 수 있으므로, 균등성을 검증하기에 편리한 툴이 됩니다.

    또, Ansible 입문자를위한 학습 가이드 (CentOS) 이나 Ansible 입문자용 학습 가이드(Windows편) 등 입문자용의 기사도 집필하고 있으므로, 참고로 해 주시면 좋겠습니다.

    11. 참고 URL



    htps : // v 곤푸 g. pl / 2019/08/17 / 안시 b ぇ ー d ぢ sk ー ー v ms きぴん g sc し ー d x 7 /
    htps : // 테카로 my. jp/마가지네/28100
    htps : // / cs. 안시 bぇ. 이 m / 안시 b ぇ / ぁ st / 모즈 s / vm 되 _ 구 st_ ぢ sk_ 모즈. HTML

    좋은 웹페이지 즐겨찾기