メインコンテンツへスキップ
  1. Blogs/

ansibleでvyosのclone

·1307 文字·
Blog VMware VSphere Ansible Python
hiroki
著者
hiroki
クラウドを作るお仕事をしてます。
目次

1. ansibleを使用したVMのclone
#

clone元となるVMを置いて、linked-clone + ansible経由でのdeploy(vmwareのcustomizationやcloud-init)をして、検証用途に普段は使っています。 これの大きな利点は以下になります。

  • linked-cloneを使うのでVMが高速にストレージを圧迫せずに展開できる。
  • ansibleで構成管理をしつつ、ip等の基本的な設定を投入できる。
  • ansible化が難しい点は手動でclone元に変更を加えた後にsnapshotで保存しておける

実際に使っている様子がこちらです。

ansible inventory file
#

v0-k8s-01:
  ansible_host: 192.168.1.215
  networks:
    - name: vss-vlan0
      ip: "{{ ansible_host }}"
      netmask: 255.255.255.0
      gateway: 192.168.1.1
    - name: vss-vlan10
      ip: 10.0.10.215
      netmask: 255.255.254.0
      gateway: 10.0.10.1
v0-k8s-02:
  ansible_host: 192.168.1.216
  networks:
    - name: vss-vlan0
      ip: "{{ ansible_host }}"
      netmask: 255.255.255.0
      gateway: 192.168.1.1
    - name: vss-vlan10
      ip: 10.0.10.216
      netmask: 255.255.254.0
      gateway: 10.0.10.1
v0-k8s-03:
  ansible_host: 192.168.1.217
  networks:
    - name: vss-vlan0
      ip: "{{ ansible_host }}"
      netmask: 255.255.255.0
      gateway: 192.168.1.1
    - name: vss-vlan10
      ip: 10.0.10.217
      netmask: 255.255.254.0
      gateway: 10.0.10.1

ansible role
#

- name: Clone a virtual machine from Linux template and customize
  community.vmware.vmware_guest:
    hostname: "{{ vcenter_network.ip }}"
    username: "{{ vcenter_creds.user }}"
    password: "{{ vcenter_creds.password }}"
    validate_certs: false
    datacenter: Datacenter
    cluster: "{{ cluster }}"
    folder: /Datacenter/vm/
    name: "{{ inventory_hostname }}"
    template: /Datacenter/vm/ubuntu2204-seedos # clone元のVMは配置しておく
    linked_clone: true                         # linked-cloneをtrueに
    snapshot_src: base                         # clone元のsnapshotを指定する
    datastore: "{{ datastore }}"
    state: poweredon
    wait_for_ip_address: true
    networks: "{{ network }}"                  # inventoryで指定したnetworkがcustomizationを通じて自動で設定される。
    customization:
      dns_servers:
      - 192.168.1.202
      domain: lab.local
    hardware:
      num_cpus: 2
      memory_mb: 4096
  delegate_to: localhost

vCenter
#

img001

2. vyos(customiztaionをサポートしてない)の場合
#

customizationをサポートしているかどうかは、以下で確認できる。 http://partnerweb.vmware.com/programs/guestOS/guest-os-customization-matrix.pdf

customizationをサポートしてない場合に上記を使用すると、customizationが失敗しnetwork系の設定だった場合にはnicが外れてしまう。 その場合にはcloud-initに任せる方式で回避できるが、community.vmware.vmware_guestにはbug?仕様?により、networkを指定すると必ずcustomizationが走ってしまう。

- name: Clone a virtual machine from Linux template and customize
  community.vmware.vmware_guest:
    hostname: "{{ vcenter_network.ip }}"
    username: "{{ vcenter_creds.user }}"
    password: "{{ vcenter_creds.password }}"
    validate_certs: false
    ### 省略 ###
    networks:     # networksを無くせばOKだが、それだとPGがつけれない。
    - name: "PG1" # IP設定を入れず、PGだけ付けようとしても必ずcustomizationが走ってしまう。
    - name: "PG2"

3. nicはずれの対処法
#

この原因はvmware_guestのモジュールで、「networksを指定 & ipの指定がなかった場合」は、dhcpをcustomizationで設定する仕組みのためである。 従ってこの部分のコードをコメントアウトすることで対処できる。

  • 自分の環境
ansible-galaxy collection list | grep vmware
community.vmware              3.7.0  
community.vmware              3.8.0  
vmware.vmware_rest            2.3.1 
~/.ansible/collections/ansible_collections/community/vmware/plugins/modules/vmware_guest.py

root@v0-dev-01:~/hiroki783# ansible --version
ansible [core 2.15.2]
  • 編集するファイル
vi ~/.ansible/collections/ansible_collections/community/vmware/plugins/modules/vmware_guest.py 
                else:
                    # User wants network type as 'dhcp'
                    network['type'] = 'dhcp'

まとめ
#

moduleのverup,docker, pipenvを使った場合に巻き戻るので、あまりmoduleに変更を加えたくないが現状このような回避方法しかなさそうである。 とは言え、linked-clone + ansible経由でのdeployは非常に便利なので使ってみると活躍してくれます。

Related

ESXiを自動でインストール
·3901 文字
Blog VMware VSphere RedfishAPI Python Kickstart Ansible
cloud-initでOSの設定
·4291 文字
Blog VMware VSphere Cloud-Init
MINISFORUM UM580 review
·1923 文字
Blog Review Homelab