vHoge

VMwareのアレコレ備忘録。CLIでがんばるネタ多め。

Photon OS でのサンプル実装

VMware DevOps Meetup #2 - connpass 用のネタ。
詳しくは当日の LT にて…(資料も上がると思います)

Photon OS 初期設定コード

#!/bin/python3
import xml.etree.ElementTree as ET
import subprocess
import textwrap
import os

VMTOOLSD = "/usr/bin/vmtoolsd --cmd 'info-get guestinfo.ovfenv'"
HOSTNAMECTL = "hostnamectl set-hostname {}"
NS_OE = {'oe': 'http://schemas.dmtf.org/ovf/environment/1'}
VALKEY = "{http://schemas.dmtf.org/ovf/environment/1}value"
VCENTERID = "{http://www.vmware.com/schema/ovfenv}vCenterId"
ENV_XPATH = "oe:PropertySection/oe:Property[@oe:key='{}']"
OVFKEY = ["ip", "prefix", "gateway", "hostname", "dns"]
LOCKFILE = "/var/lib/misc/photoninit.lck"
NETFILE = "/etc/systemd/network/10-static-en.network"
DHCPFILE = "/etc/systemd/network/99-dhcp-en.network"


def getOvfEnv():
    try:
        res = subprocess.check_output(VMTOOLSD, shell=True).decode('utf-8')
    except SubprocessError:
        raise
    return res


def chkLock(vmid):
    if os.path.exists(LOCKFILE):
        with open(LOCKFILE, "r") as f:
            s = f.read()
            if s == vmid:
                return True
    return False


def setLock(vmid):
    with open(LOCKFILE, "w") as f:
        f.write(vmid)


def deployHostname(hostname):
    try:
        subprocess.run(HOSTNAMECTL.format(hostname), shell=True)
    except SubprocessError:
        raise


def deployNetwork(ip, prefix, gateway, dns):
    conf = textwrap.dedent('''
    [Match]
    Name=eth0

    [Network]
    Address={t_ip}/{t_prefix}
    Gateway={t_gateway}
    DNS={t_dns}
    ''').format(t_ip=ip, t_prefix=prefix, t_gateway=gateway, t_dns=dns).strip()
    with open(NETFILE, "w") as f:
        f.write(conf)
    os.chmod(NETFILE, 0o644)
    if os.path.exists(DHCPFILE):
        disableDHCP()


def disableDHCP():
    conf = textwrap.dedent('''
    [Match]
    Name=e*

    [Network]
    DHCP=no
    ''').strip()
    with open(DHCPFILE, "w") as f:
        f.write(conf)
    os.chmod(DHCPFILE, 0o644)


def main():
    try:
        xml = getOvfEnv()
    except Exception as e:
        print("vmtoolsd error:{}".format(e))
        return 1

    tree = ET.fromstring(xml)
    vmid = tree.attrib[VCENTERID]

    if chkLock(vmid):
        print("Nothing to do.")
        return 0

    dic = {}
    for key in OVFKEY:
        attr = ENV_XPATH.format(key)
        dic[key] = tree.find(attr, NS_OE).attrib[VALKEY]

    try:
        deployHostname(dic["hostname"])
    except Exception as e:
        print("Hostname setting error:{}".format(e))
        return 1
    deployNetwork(dic["ip"], dic["prefix"], dic["gateway"], dic["dns"])
    setLock(vmid)

    return 0


if __name__ == '__main__':
    exit(main())

service

[Unit]
Description=photoninit
Before=getty@tty1.service systemd-networkd.service systemd-resolved.service
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/photoninit
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

git でないのはアカウント無かったから…そのうち作るかも?