Merge branch 'dnf' into 'master'

Dnf

See merge request neillc/tripleo-aio-helpers!1
This commit is contained in:
Neill Cox 2023-09-28 00:34:16 +00:00
commit 0d036d93b3
3 changed files with 77 additions and 27 deletions

View file

@ -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")

View file

@ -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()

View file

@ -7,13 +7,9 @@ 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=*"
@ -21,3 +17,12 @@ runcmd:
- "dnf module disable -y container-tools:rhel8"
- "dnf module enable -y container-tools:3.0"
- "dnf update -y"
- "echo '***************************************************************************'"
- "echo '*** ***'"
- "echo '*** ***'"
- "echo '*** DNF UPDATE COMPLETE - REBOOT NOW ***'"
- "echo '*** ***'"
- "echo '*** ***'"
- "echo '***************************************************************************'"
- "reboot"