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 #
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は非常に便利なので使ってみると活躍してくれます。