From 31c2ab20a47a101e33060b7fa22e06761c5ec5b3 Mon Sep 17 00:00:00 2001 From: Neill Cox Date: Thu, 28 Sep 2023 00:34:16 +0000 Subject: [PATCH] Dnf --- src/tripleo_aio_helpers/create_aio_vm.py | 78 ++++++++++++++----- src/tripleo_aio_helpers/prepare_deployment.py | 7 +- src/virt-install/user-data.tpl | 19 +++-- 3 files changed, 77 insertions(+), 27 deletions(-) diff --git a/src/tripleo_aio_helpers/create_aio_vm.py b/src/tripleo_aio_helpers/create_aio_vm.py index 96ee4a1..98ac977 100644 --- a/src/tripleo_aio_helpers/create_aio_vm.py +++ b/src/tripleo_aio_helpers/create_aio_vm.py @@ -5,6 +5,7 @@ Use virt-install to create a VM suitable for installing a RHOSP/tripleo AIO import argparse import pathlib import subprocess +import sys MD_PATH = "./meta-data" UD_PATH = "./user-data" @@ -13,16 +14,15 @@ ND_PATH = "./network-config" def parse_args(): """Parse the command line arguments""" + template_path = pathlib.Path(__file__).parent.parent / "virt-install" parser = argparse.ArgumentParser() parser.add_argument("--password", required=True) parser.add_argument("--public-key", required=True, type=open) + parser.add_argument("--local-hostname", required=True) + parser.add_argument("--user-data", default=template_path / "user-data.tpl") + parser.add_argument("--meta-data", default=template_path / "meta-data.tpl") parser.add_argument( - "--local-hostname", default="aio3.gpslab.cbr.redhat.com" - ) - parser.add_argument("--user-data", default="./src/virt-install/user-data.tpl", type=open) - parser.add_argument("--meta-data", default="./src/virt-install/meta-data.tpl", type=open) - parser.add_argument( - "--network-data", default="./src/virt-install/network-config.tpl", type=open + "--network-data", default=template_path / "network-config.tpl" ) parser.add_argument("--instance-id", required=True, help="Hostname for the new VM") parser.add_argument("--output-image", required=True) @@ -30,27 +30,54 @@ def parse_args(): parser.add_argument("--input-image", required=True) parser.add_argument("--os-variant", required=True) parser.add_argument("--name", required=True) - parser.add_argument("--memory", default=2048) # , type="int") - parser.add_argument("--gateway", required=True) - parser.add_argument("--cidr-1", required=True) - parser.add_argument("--cidr-2", required=True) - parser.add_argument("--dns", required=True) - parser.add_argument("--search-domain", required=True) + parser.add_argument("--memory", default=16384) # , type="int") + parser.add_argument("--cpus", default=4) # , type="int") + parser.add_argument("--gateway") + parser.add_argument("--cidr-1") + parser.add_argument("--cidr-2") + parser.add_argument("--mac-1",default="RANDOM") + parser.add_argument("--mac-2",default="RANDOM") + parser.add_argument("--dns",) + parser.add_argument("--search-domain") parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument("--rhn-user", required=True) parser.add_argument("--rhn-password", required=True) args = parser.parse_args() + if (args.cidr_1 or args.cidr_2) and not (args.cidr_1 and args.cidr_2): + print("You must specify two addresses if you specify any addresses") + sys.exit(1) + + if args.cidr_1 and not args.gateway: + print("You must specify a gateway if you specify any addresses") + sys.exit(1) + + if args.cidr_1 and not args.search_domain: + print("You must specify a search domain if you specify any addresses") + sys.exit(1) + + if args.cidr_1 and not args.dns: + print("You must specify a DNS server if you specify any addresses") + sys.exit(1) + + if not (args.cidr_1 or args.cidr_2) and (args.dns or args.gateway or args.search_domain): + print("There's no point specifying DNS, gateway or search_domain if yoou don't specify addresses") + sys.exit(1) + args.public_key = args.public_key.read() - args.user_data = args.user_data.read() + with open(args.user_data) as user_data: + args.user_data = user_data.read() + generate_boot_cmd(args) args.user_data = args.user_data.format(data=args) - args.meta_data = args.meta_data.read() + with open(args.meta_data) as meta_data: + args.meta_data = meta_data.read() args.meta_data = args.meta_data.format(data=args) - args.network_data = args.network_data.read() + with open(args.network_data) as network_data: + args.network_data = network_data.read() args.network_data = args.network_data.format(data=args) output_image = pathlib.Path(args.output_image) @@ -65,11 +92,22 @@ def parse_args(): return args +def generate_boot_cmd(data): + data.bootcmd="" + if data.cidr_1: + data.bootcmd = ( + "bootcmd:\n" + f' - "nmcli con modify \'System eth0\' ipv4.address {data.cidr_1} ipv4.method static ipv4.gateway {data.gateway} ipv4.dns {data.dns}"\n' + f' - "nmcli con modify \'Wired connection 1\' ipv4.address {data.cidr_2} ipv4.method static ipv4.gateway {data.gateway} ipv4.dns {data.dns}"\n' + ' - "nmcli networking off"\n' + ' - "nmcli networking on"\n' + ) -def write_user_data(user_data): +def write_user_data(data): """Write out a temporary user data file""" + with open(UD_PATH, "w", encoding="utf-8") as user_data_file: - user_data_file.write(user_data) + user_data_file.write(data) def write_meta_data(meta_data): @@ -108,6 +146,7 @@ def create_image(args): if args.verbose: print(result) + print("Image resized") def virt_install_cmd(args): """Build and execute the virt-install command""" @@ -117,14 +156,15 @@ def virt_install_cmd(args): --name {args.name} \\ --memory {args.memory} \\ --disk {args.output_image} \\ + --vcpus {args.cpus} \\ --import \\ --graphics spice,listen=127.0.0.1 \\ --video virtio \\ --channel spicevmc \\ --wait 0 \\ --cloud-init meta-data=./meta-data,user-data=./user-data \\ - --network bridge=bridge0 \\ - --network bridge=bridge0 + --network bridge=bridge0,mac={args.mac_1} \\ + --network bridge=bridge0,mac={args.mac_2} """ print("running virt-install") diff --git a/src/tripleo_aio_helpers/prepare_deployment.py b/src/tripleo_aio_helpers/prepare_deployment.py index 84ca42e..993805a 100644 --- a/src/tripleo_aio_helpers/prepare_deployment.py +++ b/src/tripleo_aio_helpers/prepare_deployment.py @@ -16,7 +16,7 @@ def parse_args(): parser.add_argument("-u", "--username", required=True) parser.add_argument("-p", "--password", required=True) parser.add_argument("-a", "--address", required=True) - parser.add_argument("-i", "--interface", default="enp1s0") + parser.add_argument("-i", "--interface", required=True) parser.add_argument("-m", "--netmask", default=24) parser.add_argument( "-d", "--dns", nargs="+", action="append", required=True @@ -151,6 +151,11 @@ def main(): deploy.write(deploy_sh(args)) print(f"deploy script written to {args.deploy}") + print("If you are running on a cloud image remenber to disable cloud-init before running the deploy.") + print("sudo systemctl stop cloud-init") + print("sudo systemctl disable cloud-init") + print("Make sure you have specifed the correct interface to use!") + if __name__ == "__main__": main() diff --git a/src/virt-install/user-data.tpl b/src/virt-install/user-data.tpl index 89cffe2..457d0f3 100644 --- a/src/virt-install/user-data.tpl +++ b/src/virt-install/user-data.tpl @@ -7,17 +7,22 @@ chpasswd: {{expire: False}} ssh_pwauth: True ssh_authorized_keys: - {data.public_key} -bootcmd: - - "nmcli conn delete 'System eth0'" - - "nmcli conn delete 'Wired connection 1'" - - "nmcli con add con-name eth0 ifname eth0 type ethernet ip4 {data.cidr_1} gw4 {data.gateway} ipv4.dns {data.dns}" - - "nmcli con add con-name eth1 ifname eth1 type ethernet ip4 {data.cidr_2} gw4 {data.gateway} ipv4.dns {data.dns}" +{data.bootcmd} runcmd: - - "subscription-manager register --username {data.rhn_username} --password '{data.rhn_password}'" + - "subscription-manager register --username {data.rhn_user} --password '{data.rhn_password}'" - "subscription-manager release --set=8.4" - "dnf install -y dnf-utils" - "subscription-manager repos --disable=*" - "subscription-manager repos --enable=rhel-8-for-x86_64-baseos-eus-rpms --enable=rhel-8-for-x86_64-appstream-eus-rpms --enable=rhel-8-for-x86_64-highavailability-eus-rpms --enable=ansible-2.9-for-rhel-8-x86_64-rpms --enable=openstack-16.2-for-rhel-8-x86_64-rpms --enable=fast-datapath-for-rhel-8-x86_64-rpms" - "dnf module disable -y container-tools:rhel8" - "dnf module enable -y container-tools:3.0" - - "dnf update -y" \ No newline at end of file + - "dnf update -y" + - "echo '***************************************************************************'" + - "echo '*** ***'" + - "echo '*** ***'" + - "echo '*** DNF UPDATE COMPLETE - REBOOT NOW ***'" + - "echo '*** ***'" + - "echo '*** ***'" + - "echo '***************************************************************************'" + - "reboot" +