Merge branch 'dnf' into 'master'
Dnf See merge request neillc/tripleo-aio-helpers!1
This commit is contained in:
commit
0d036d93b3
3 changed files with 77 additions and 27 deletions
|
|
@ -5,6 +5,7 @@ Use virt-install to create a VM suitable for installing a RHOSP/tripleo AIO
|
||||||
import argparse
|
import argparse
|
||||||
import pathlib
|
import pathlib
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
MD_PATH = "./meta-data"
|
MD_PATH = "./meta-data"
|
||||||
UD_PATH = "./user-data"
|
UD_PATH = "./user-data"
|
||||||
|
|
@ -13,16 +14,15 @@ ND_PATH = "./network-config"
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
"""Parse the command line arguments"""
|
"""Parse the command line arguments"""
|
||||||
|
template_path = pathlib.Path(__file__).parent.parent / "virt-install"
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--password", required=True)
|
parser.add_argument("--password", required=True)
|
||||||
parser.add_argument("--public-key", required=True, type=open)
|
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(
|
parser.add_argument(
|
||||||
"--local-hostname", default="aio3.gpslab.cbr.redhat.com"
|
"--network-data", default=template_path / "network-config.tpl"
|
||||||
)
|
|
||||||
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
|
|
||||||
)
|
)
|
||||||
parser.add_argument("--instance-id", required=True, help="Hostname for the new VM")
|
parser.add_argument("--instance-id", required=True, help="Hostname for the new VM")
|
||||||
parser.add_argument("--output-image", required=True)
|
parser.add_argument("--output-image", required=True)
|
||||||
|
|
@ -30,27 +30,54 @@ def parse_args():
|
||||||
parser.add_argument("--input-image", required=True)
|
parser.add_argument("--input-image", required=True)
|
||||||
parser.add_argument("--os-variant", required=True)
|
parser.add_argument("--os-variant", required=True)
|
||||||
parser.add_argument("--name", required=True)
|
parser.add_argument("--name", required=True)
|
||||||
parser.add_argument("--memory", default=2048) # , type="int")
|
parser.add_argument("--memory", default=16384) # , type="int")
|
||||||
parser.add_argument("--gateway", required=True)
|
parser.add_argument("--cpus", default=4) # , type="int")
|
||||||
parser.add_argument("--cidr-1", required=True)
|
parser.add_argument("--gateway")
|
||||||
parser.add_argument("--cidr-2", required=True)
|
parser.add_argument("--cidr-1")
|
||||||
parser.add_argument("--dns", required=True)
|
parser.add_argument("--cidr-2")
|
||||||
parser.add_argument("--search-domain", required=True)
|
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("-v", "--verbose", action="store_true")
|
||||||
parser.add_argument("--rhn-user", required=True)
|
parser.add_argument("--rhn-user", required=True)
|
||||||
parser.add_argument("--rhn-password", required=True)
|
parser.add_argument("--rhn-password", required=True)
|
||||||
|
|
||||||
args = parser.parse_args()
|
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.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.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.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)
|
args.network_data = args.network_data.format(data=args)
|
||||||
|
|
||||||
output_image = pathlib.Path(args.output_image)
|
output_image = pathlib.Path(args.output_image)
|
||||||
|
|
@ -65,11 +92,22 @@ def parse_args():
|
||||||
|
|
||||||
return 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"""
|
"""Write out a temporary user data file"""
|
||||||
|
|
||||||
with open(UD_PATH, "w", encoding="utf-8") as 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):
|
def write_meta_data(meta_data):
|
||||||
|
|
@ -108,6 +146,7 @@ def create_image(args):
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
print(result)
|
print(result)
|
||||||
|
|
||||||
|
print("Image resized")
|
||||||
|
|
||||||
def virt_install_cmd(args):
|
def virt_install_cmd(args):
|
||||||
"""Build and execute the virt-install command"""
|
"""Build and execute the virt-install command"""
|
||||||
|
|
@ -117,14 +156,15 @@ def virt_install_cmd(args):
|
||||||
--name {args.name} \\
|
--name {args.name} \\
|
||||||
--memory {args.memory} \\
|
--memory {args.memory} \\
|
||||||
--disk {args.output_image} \\
|
--disk {args.output_image} \\
|
||||||
|
--vcpus {args.cpus} \\
|
||||||
--import \\
|
--import \\
|
||||||
--graphics spice,listen=127.0.0.1 \\
|
--graphics spice,listen=127.0.0.1 \\
|
||||||
--video virtio \\
|
--video virtio \\
|
||||||
--channel spicevmc \\
|
--channel spicevmc \\
|
||||||
--wait 0 \\
|
--wait 0 \\
|
||||||
--cloud-init meta-data=./meta-data,user-data=./user-data \\
|
--cloud-init meta-data=./meta-data,user-data=./user-data \\
|
||||||
--network bridge=bridge0 \\
|
--network bridge=bridge0,mac={args.mac_1} \\
|
||||||
--network bridge=bridge0
|
--network bridge=bridge0,mac={args.mac_2}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
print("running virt-install")
|
print("running virt-install")
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ def parse_args():
|
||||||
parser.add_argument("-u", "--username", required=True)
|
parser.add_argument("-u", "--username", required=True)
|
||||||
parser.add_argument("-p", "--password", required=True)
|
parser.add_argument("-p", "--password", required=True)
|
||||||
parser.add_argument("-a", "--address", 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("-m", "--netmask", default=24)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-d", "--dns", nargs="+", action="append", required=True
|
"-d", "--dns", nargs="+", action="append", required=True
|
||||||
|
|
@ -151,6 +151,11 @@ def main():
|
||||||
deploy.write(deploy_sh(args))
|
deploy.write(deploy_sh(args))
|
||||||
print(f"deploy script written to {args.deploy}")
|
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__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,9 @@ chpasswd: {{expire: False}}
|
||||||
ssh_pwauth: True
|
ssh_pwauth: True
|
||||||
ssh_authorized_keys:
|
ssh_authorized_keys:
|
||||||
- {data.public_key}
|
- {data.public_key}
|
||||||
bootcmd:
|
{data.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}"
|
|
||||||
runcmd:
|
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"
|
- "subscription-manager release --set=8.4"
|
||||||
- "dnf install -y dnf-utils"
|
- "dnf install -y dnf-utils"
|
||||||
- "subscription-manager repos --disable=*"
|
- "subscription-manager repos --disable=*"
|
||||||
|
|
@ -21,3 +17,12 @@ runcmd:
|
||||||
- "dnf module disable -y container-tools:rhel8"
|
- "dnf module disable -y container-tools:rhel8"
|
||||||
- "dnf module enable -y container-tools:3.0"
|
- "dnf module enable -y container-tools:3.0"
|
||||||
- "dnf update -y"
|
- "dnf update -y"
|
||||||
|
- "echo '***************************************************************************'"
|
||||||
|
- "echo '*** ***'"
|
||||||
|
- "echo '*** ***'"
|
||||||
|
- "echo '*** DNF UPDATE COMPLETE - REBOOT NOW ***'"
|
||||||
|
- "echo '*** ***'"
|
||||||
|
- "echo '*** ***'"
|
||||||
|
- "echo '***************************************************************************'"
|
||||||
|
- "reboot"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue