diff options
Diffstat (limited to 'build/f_isoroot')
-rw-r--r-- | build/f_isoroot/Makefile | 8 | ||||
-rwxr-xr-x | build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh | 339 | ||||
-rwxr-xr-x | build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh.orig | 339 | ||||
-rw-r--r-- | build/f_isoroot/f_kscfg/ks.cfg | 456 | ||||
-rw-r--r-- | build/f_isoroot/f_kscfg/ks.cfg.orig | 457 |
5 files changed, 1044 insertions, 555 deletions
diff --git a/build/f_isoroot/Makefile b/build/f_isoroot/Makefile index 63f894b22..d8ac3c9e3 100644 --- a/build/f_isoroot/Makefile +++ b/build/f_isoroot/Makefile @@ -13,11 +13,15 @@ PLUGINS = f_odlpluginbuild f_qemupluginbuild f_ovs-nsh-dpdk-pluginbuild f_onosfw # If the BUILD_FUEL_PLUGINS environment variable is set, only build the plugins # indicated therein. +# Temporarilu disabling f_repobuild that currently have some issues on +# Fuel 8. ifdef BUILD_FUEL_PLUGINS -SUBDIRS = f_kscfg f_bootstrap f_repobuild $(BUILD_FUEL_PLUGINS) +#SUBDIRS = f_kscfg f_bootstrap f_repobuild $(BUILD_FUEL_PLUGINS) +SUBDIRS = f_kscfg f_bootstrap $(BUILD_FUEL_PLUGINS) $(warning Overriding plugin build selection to $(BUILD_FUEL_PLUGINS)) else -SUBDIRS = f_kscfg f_bootstrap f_repobuild $(PLUGINS) +#SUBDIRS = f_kscfg f_bootstrap f_repobuild $(PLUGINS) +SUBDIRS = f_kscfg f_bootstrap $(PLUGINS) endif SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) diff --git a/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh b/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh index 065d0cb7d..d057d0aee 100755 --- a/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh +++ b/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh @@ -1,5 +1,53 @@ #!/bin/bash +mkdir -p /var/log/puppet +exec > >(tee -i /var/log/puppet/bootstrap_admin_node.log) +exec 2>&1 + FUEL_RELEASE=$(grep release: /etc/fuel/version.yaml | cut -d: -f2 | tr -d '" ') +BOOTSTRAP_NODE_CONFIG="/etc/fuel/bootstrap_admin_node.conf" +bs_build_log='/var/log/fuel-bootstrap-image-build.log' +bs_status=0 +# Backup network configs to this folder. Folder will be created only if +# backup process actually will be. +bup_folder="/var/bootstrap_admin_node_bup_$(date +%Y-%m-%d-%H-%M-%S)/" +### Long messages inside code makes them more complicated to read... +# bootstrap messages +# FIXME fix help links +bs_skip_message="WARNING: Ubuntu bootstrap build has been skipped. \ +Please build and activate bootstrap manually with CLI command \ +\`fuel-bootstrap build --activate\`. \ +While you don't activate any bootstrap - new nodes cannot be discovered \ +and added to cluster. \ +For more information please visit \ +https://docs.mirantis.com/openstack/fuel/fuel-master/" +bs_error_message="WARNING: Failed to build the bootstrap image, see $bs_build_log \ +for details. Perhaps your Internet connection is broken. Please fix the \ +problem and run \`fuel-bootstrap build --activate\`. \ +While you don\'t activate any bootstrap - new nodes cannot be discovered \ +and added to cluster. \ +For more information please visit \ +https://docs.mirantis.com/openstack/fuel/fuel-master/" +bs_progress_message="There is no active bootstrap. Bootstrap image building \ +is in progress. Usually it takes 15-20 minutes. It depends on your internet \ +connection and hardware performance. Please reboot failed to discover nodes \ +after bootstrap image become available." +bs_done_message="Default bootstrap image building done. Now you can boot new \ +nodes over PXE, they will be discovered and become available for installing \ +OpenStack on them" +bs_centos_message="WARNING: Deprecated Centos bootstrap has been chosen \ +and activated. Now you can boot new nodes over PXE, they will be discovered \ +and become available for installing OpenStack on them." +# Update issues messages +update_warn_message="There is an issue connecting to the Fuel update repository. \ +Please fix your connection prior to applying any updates. \ +Once the connection is fixed, we recommend reviewing and applying \ +Maintenance Updates for this release of Mirantis OpenStack: \ +https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ +release-notes.html#maintenance-updates" +update_done_message="We recommend reviewing and applying Maintenance Updates \ +for this release of Mirantis OpenStack: \ +https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ +release-notes.html#maintenance-updates" function countdown() { local i @@ -14,16 +62,139 @@ function fail() { echo "ERROR: Fuel node deployment FAILED! Check /var/log/puppet/bootstrap_admin_node.log for details" 1>&2 exit 1 } + +function get_ethernet_interfaces() { + # Get list of all ethernet interfaces, non-virtual, not a wireless + for DEV in /sys/class/net/* ; do + # Take only links into account, skip files + if test ! -L $DEV ; then + continue + fi + DEVPATH=$(readlink -f $DEV) + # Avoid virtual devices like loopback, tunnels, bonding, vlans ... + case $DEVPATH in + */virtual/*) + continue + ;; + esac + IF=${DEVPATH##*/} + # Check ethernet only + case "`cat $DEV/type`" in + 1) + # TYPE=1 is ethernet, may also be wireless, bond, tunnel ... + # Virtual lo, bound, vlan, tunneling has been skipped before + if test -d $DEV/wireless -o -L $DEV/phy80211 ; + then + continue + else + # Catch ethernet non-virtual device + echo $IF + fi + ;; + *) continue + ;; + esac + done +} + +# Get value of a key from ifcfg-* files +# Usage: +# get_ifcfg_value NAME /etc/sysconfig/network-scripts/ifcfg-eth0 +function get_ifcfg_value { + local key=$1 + local path=$2 + local value='' + if [[ -f ${path} ]]; then + value=$(awk -F\= "\$1==\"${key}\" {print \$2}" ${path}) + value=${value//\"/} + fi + echo ${value} +} + +# Workaround to fix dracut network configuration approach: +# Bring down all network interfaces which have the same IP +# address statically configured as 'primary' interface +function ifdown_ethernet_interfaces { + local adminif_ipaddr + local if_config + local if_name + local if_ipaddr + + adminif_ipaddr=$(get_ifcfg_value IPADDR /etc/sysconfig/network-scripts/ifcfg-${ADMIN_INTERFACE}) + if [[ -z "${adminif_ipaddr}" ]]; then + return + fi + for if_config in $(find /etc/sysconfig/network-scripts -name 'ifcfg-*' ! -name 'ifcfg-lo'); do + if_name=$(get_ifcfg_value NAME $if_config) + if [[ "${if_name}" == "${ADMIN_INTERFACE}" ]]; then + continue + fi + if_ipaddr=$(get_ifcfg_value IPADDR $if_config) + if [[ "${if_ipaddr}" == "${adminif_ipaddr}" ]]; then + echo "Interface '${if_name}' uses the same ip '${if_ipaddr}' as admin interface '${ADMIN_INTERFACE}', removing ..." + ifdown ${if_name} + mkdir -p "${bup_folder}" + mv -f "${if_config}" "${bup_folder}" + fi + done +} + +# Check if interface name is valid by checking that +# a config file with NAME equal to given name exists. +function ifname_valid { + local adminif_name=$1 + local if_name + local if_config + for if_config in $(find /etc/sysconfig/network-scripts -name 'ifcfg-*' ! -name 'ifcfg-lo'); do + if_name=$(get_ifcfg_value NAME $if_config) + if [[ "${if_name}" == "${adminif_name}" ]]; then + return 0 + fi + done + return 1 +} + + # LANG variable is a workaround for puppet-3.4.2 bug. See LP#1312758 for details export LANG=en_US.UTF8 -export ADMIN_INTERFACE=eth0 +# Be sure, that network devices have been initialized +udevadm trigger --subsystem-match=net +udevadm settle + +# Import bootstrap_admin_node.conf if exists +if [ -f "${BOOTSTRAP_NODE_CONFIG}" ]; then + source "${BOOTSTRAP_NODE_CONFIG}" +fi -showmenu="no" -if [ -f /etc/fuel/bootstrap_admin_node.conf ]; then - . /etc/fuel/bootstrap_admin_node.conf - echo "Applying admin interface '$ADMIN_INTERFACE'" +# Set defaults to unset / empty variables +# Although eth0 is not always valid it's a good well-known default +# If there is no such interface it will fail to pass ifname_valid +# check and will be replaced. +OLD_ADMIN_INTERFACE=${ADMIN_INTERFACE} +ADMIN_INTERFACE=${ADMIN_INTERFACE:-'eth0'} +showmenu=${showmenu:-'no'} + +# Now check that ADMIN_INTERFACE points to a valid interface +# If it doesn't fallback to getting the first interface name +# from a list of all available interfaces sorted alphabetically +if ! ifname_valid $ADMIN_INTERFACE; then + # Take the very first ethernet interface as an admin interface + ADMIN_INTERFACE=$(get_ethernet_interfaces | sort -V | head -1) +fi + +if [[ "${OLD_ADMIN_INTERFACE}" != "${ADMIN_INTERFACE}" ]]; then + echo "Saving ADMIN_INTERFACE value" + sed -ie "s/^ADMIN_INTERFACE=.*/ADMIN_INTERFACE=${ADMIN_INTERFACE}/g" \ + ${BOOTSTRAP_NODE_CONFIG} fi +echo "Applying admin interface '$ADMIN_INTERFACE'" +export ADMIN_INTERFACE + +echo "Bringing down ALL network interfaces except '${ADMIN_INTERFACE}'" +ifdown_ethernet_interfaces +systemctl restart network + echo "Applying default Fuel settings..." set -x fuelmenu --save-only --iface=$ADMIN_INTERFACE @@ -61,6 +232,15 @@ if [[ "$showmenu" == "yes" || "$showmenu" == "YES" ]]; then fi fi +# Enable sshd +systemctl enable sshd +systemctl start sshd + +# Enable iptables +systemctl enable iptables.service +systemctl start iptables.service + + if [ "$wait_for_external_config" == "yes" ]; then wait_timeout=3000 pidfile=/var/lock/wait_for_external_config @@ -93,11 +273,13 @@ hostname "$HOSTNAME" # and egg problem. Fortunately cobbler is pretty happy with empty files # so it's easy to break the loop. make_ubuntu_bootstrap_stub () { - local bootstrap_dir='/var/www/nailgun/bootstrap/ubuntu' - mkdir -p $bootstrap_dir - for item in linux initramfs.img; do - touch "$bootstrap_dir/$item" - done + local bootstrap_dir='/var/www/nailgun/bootstraps/active_bootstrap' + local bootstrap_stub_dir='/var/www/nailgun/bootstraps/bootstrap_stub' + mkdir -p ${bootstrap_stub_dir} + for item in vmlinuz initrd.img; do + touch "${bootstrap_stub_dir}/$item" + done + ln -s ${bootstrap_stub_dir} ${bootstrap_dir} || true } get_bootstrap_flavor () { @@ -105,47 +287,60 @@ get_bootstrap_flavor () { python <<-EOF from fuelmenu.fuelmenu import Settings conf = Settings().read("$ASTUTE_YAML").get('BOOTSTRAP', {}) - print(conf.get('flavor', 'centos')) + print(conf.get('flavor', 'centos').lower()) + EOF +} + +get_bootstrap_skip () { + local ASTUTE_YAML='/etc/fuel/astute.yaml' + python <<-EOF + from fuelmenu.fuelmenu import Settings + conf = Settings().read("$ASTUTE_YAML").get('BOOTSTRAP', {}) + print(conf.get('skip_default_img_build', False)) + EOF +} + +set_ui_bootstrap_error () { + # This notify can't be closed or removed by user. + # For remove notify - send empty string. + local message=$1 + python <<-EOF + from fuel_bootstrap.utils import notifier + notifier.notify_webui('${message}') EOF } # Actually build the bootstrap image build_ubuntu_bootstrap () { - local ret=1 - local max_attempts=3 - local config='/etc/fuel-bootstrap-image.conf' - local log='/var/log/fuel-bootstrap-image-build.log' - if ! grep -qE '^BOOTSTRAP_SSH_KEYS' "$config"; then - # FIXME: config file generated by fuelmenu has no trailing newline - echo >> "$config" - cat >> "$config" <<-EOF - BOOTSTRAP_SSH_KEYS=/root/.ssh/id_rsa.pub - EOF - fi - for n in `seq 1 $max_attempts`; do - echo "Bulding bootstrap image, attempt $n" >&2 - if fuel-bootstrap-image >>"$log" 2>&1; then - ret=0 - fuel-bootstrap-image-set "ubuntu" - break - fi - done - if [ $ret -ne 0 ]; then - warning="WARNING: failed to build the bootstrap image, see $log for details. -Perhaps your Internet connection is broken. Please fix the problem and run -\`fuel-bootstrap-image-set ubuntu\`" - fuel notify --topic warning --send "$warning" - fi - return $ret + local ret=1 + echo ${bs_progress_message} >&2 + set_ui_bootstrap_error "${bs_progress_message}" >&2 + if fuel-bootstrap -v --debug build --activate >>"$bs_build_log" 2>&1; then + ret=0 + fuel notify --topic "done" --send "${bs_done_message}" + else + ret=1 + set_ui_bootstrap_error "${bs_error_message}" >&2 + fi + # perform hard-return from func + # this part will update input $1 variable + local __resultvar=$1 + eval $__resultvar="'${ret}'" + return $ret } - # Create empty files to make cobbler happy # (even if we don't use Ubuntu based bootstrap) make_ubuntu_bootstrap_stub service docker start +old_sysctl_vm_value=$(sysctl -n vm.min_free_kbytes) +if [ ${old_sysctl_vm_value} -lt 65535 ]; then + echo "Set vm.min_free_kbytes..." + sysctl -w vm.min_free_kbytes=65535 +fi + if [ -f /root/.build_images ]; then #Fail on all errors set -e @@ -157,7 +352,7 @@ if [ -f /root/.build_images ]; then echo "Building Fuel Docker images..." WORKDIR=$(mktemp -d /tmp/docker-buildXXX) SOURCE=/var/www/nailgun/docker - REPO_CONT_ID=$(docker -D run -d -p 80 -v /var/www/nailgun:/var/www/nailgun fuel/centos sh -c 'mkdir /var/www/html/os;ln -sf /var/www/nailgun/centos/x86_64 /var/www/html/os/x86_64;/usr/sbin/apachectl -DFOREGROUND') + REPO_CONT_ID=$(docker -D run -d -p 80 -v /var/www/nailgun:/var/www/nailgun fuel/centos sh -c 'mkdir -p /var/www/html/repo/os;ln -sf /var/www/nailgun/centos/x86_64 /var/www/html/repo/os/x86_64;ln -s /var/www/nailgun/mos-centos/x86_64 /var/www/html/mos-repo;/usr/sbin/apachectl -DFOREGROUND') RANDOM_PORT=$(docker port $REPO_CONT_ID 80 | cut -d':' -f2) for imagesource in /var/www/nailgun/docker/sources/*; do @@ -170,6 +365,10 @@ if [ -f /root/.build_images ]; then mkdir -p $WORKDIR/$image/etc cp -R /etc/puppet /etc/fuel $WORKDIR/$image/etc sed -e "s/_PORT_/${RANDOM_PORT}/" -i $WORKDIR/$image/Dockerfile + sed -r -e 's/^"?PRODUCTION"?:.*/PRODUCTION: "docker-build"/' -i $WORKDIR/$image/etc/fuel/astute.yaml + # FIXME(kozhukalov): Once this patch https://review.openstack.org/#/c/219581/ is merged + # remove this line. fuel-library is to use PRODUCTION value from astute.yaml instead of + # the same value from version.yaml. It is a part of version.yaml deprecation plan. sed -e 's/production:.*/production: "docker-build"/' -i $WORKDIR/$image/etc/fuel/version.yaml docker build -t fuel/${image}_${FUEL_RELEASE} $WORKDIR/$image done @@ -184,19 +383,37 @@ else docker load -i /var/www/nailgun/docker/images/fuel-images.tar fi +if [ ${old_sysctl_vm_value} -lt 65535 ]; then + echo "Restore sysctl vm.min_free_kbytes value..." + sysctl -w vm.min_free_kbytes=${old_sysctl_vm_value} +fi + # apply puppet puppet apply --detailed-exitcodes -d -v /etc/puppet/modules/nailgun/examples/host-only.pp if [ $? -ge 4 ];then fail fi +# Sync time +systemctl stop ntpd +systemctl start ntpdate || echo "Failed to synchronize time with 'ntpdate'" +systemctl start ntpd + rmdir /var/log/remote && ln -s /var/log/docker-logs/remote /var/log/remote dockerctl check || fail bash /etc/rc.local if [ "`get_bootstrap_flavor`" = "ubuntu" ]; then - build_ubuntu_bootstrap || true + if [ "`get_bootstrap_skip`" = "False" ]; then + build_ubuntu_bootstrap bs_status || true + else + fuel notify --topic "warning" --send "${bs_skip_message}" + bs_status=2 + fi +else + fuel notify --topic "warning" --send "${bs_centos_message}" + bs_status=3 fi ### OPNFV addition BEGIN @@ -213,7 +430,7 @@ shopt -u nullglob cat > /etc/yum.repos.d/mos${FUEL_RELEASE}-updates.repo << EOF [mos${FUEL_RELEASE}-updates] name=mos${FUEL_RELEASE}-updates -baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos6-fuel/updates/x86_64/ +baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos\$releasever-fuel/updates/x86_64/ gpgcheck=0 skip_if_unavailable=1 EOF @@ -222,14 +439,14 @@ EOF cat > /etc/yum.repos.d/mos${FUEL_RELEASE}-security.repo << EOF [mos${FUEL_RELEASE}-security] name=mos${FUEL_RELEASE}-security -baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos6-fuel/security/x86_64/ +baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos\$releasever-fuel/security/x86_64/ gpgcheck=0 skip_if_unavailable=1 EOF #Check if repo is accessible echo "Checking for access to updates repository..." -repourl=$(grep baseurl /etc/yum.repos.d/*updates* 2>/dev/null | cut -d'=' -f2- | head -1) +repourl=$(yum repolist all -v | awk '{if ($1 ~ "baseurl" && $3 ~ "updates") print $3}' | head -1) if urlaccesscheck check "$repourl" ; then UPDATE_ISSUES=0 else @@ -237,30 +454,34 @@ else fi if [ $UPDATE_ISSUES -eq 1 ]; then - message="There is an issue connecting to the Fuel update repository. \ -Please fix your connection prior to applying any updates. \ -Once the connection is fixed, we recommend reviewing and applying \ -Maintenance Updates for this release of Mirantis OpenStack: \ -https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ -release-notes.html#maintenance-updates" + message=${update_warn_message} level="warning" else - message="We recommend reviewing and applying Maintenance Updates \ -for this release of Mirantis OpenStack: \ -https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ -release-notes.html#maintenance-updates" + message=${update_done_message} level="done" fi echo echo "*************************************************" echo -e "${message}" echo "*************************************************" -echo "Sending notification to Fuel UI..." -fuel notify --topic "${level}" --send "${message}" +fuel notify --topic "${level}" --send $(echo "${message}" | tr '\r\n' ' ') 2>&1 -# TODO(kozhukalov) If building of bootstrap image fails -# and if this image was supposed to be a default bootstrap image -# we need to warn a user about this and give her -# advice how to treat this. +# Perform bootstrap messaging to stdout +case ${bs_status} in + 1) + echo -e "${bs_error_message}" + echo "*************************************************" + ;; + 2) + echo -e "${bs_skip_message}" + echo "*************************************************" + ;; + 3) + echo -e "${bs_centos_message}" + echo "*************************************************" + ;; +esac echo "Fuel node deployment complete!" +# Sleep for agetty autologon +sleep 3 diff --git a/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh.orig b/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh.orig index 1bc349314..e1c3c7365 100755 --- a/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh.orig +++ b/build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh.orig @@ -1,5 +1,53 @@ #!/bin/bash +mkdir -p /var/log/puppet +exec > >(tee -i /var/log/puppet/bootstrap_admin_node.log) +exec 2>&1 + FUEL_RELEASE=$(grep release: /etc/fuel/version.yaml | cut -d: -f2 | tr -d '" ') +BOOTSTRAP_NODE_CONFIG="/etc/fuel/bootstrap_admin_node.conf" +bs_build_log='/var/log/fuel-bootstrap-image-build.log' +bs_status=0 +# Backup network configs to this folder. Folder will be created only if +# backup process actually will be. +bup_folder="/var/bootstrap_admin_node_bup_$(date +%Y-%m-%d-%H-%M-%S)/" +### Long messages inside code makes them more complicated to read... +# bootstrap messages +# FIXME fix help links +bs_skip_message="WARNING: Ubuntu bootstrap build has been skipped. \ +Please build and activate bootstrap manually with CLI command \ +\`fuel-bootstrap build --activate\`. \ +While you don't activate any bootstrap - new nodes cannot be discovered \ +and added to cluster. \ +For more information please visit \ +https://docs.mirantis.com/openstack/fuel/fuel-master/" +bs_error_message="WARNING: Failed to build the bootstrap image, see $bs_build_log \ +for details. Perhaps your Internet connection is broken. Please fix the \ +problem and run \`fuel-bootstrap build --activate\`. \ +While you don\'t activate any bootstrap - new nodes cannot be discovered \ +and added to cluster. \ +For more information please visit \ +https://docs.mirantis.com/openstack/fuel/fuel-master/" +bs_progress_message="There is no active bootstrap. Bootstrap image building \ +is in progress. Usually it takes 15-20 minutes. It depends on your internet \ +connection and hardware performance. Please reboot failed to discover nodes \ +after bootstrap image become available." +bs_done_message="Default bootstrap image building done. Now you can boot new \ +nodes over PXE, they will be discovered and become available for installing \ +OpenStack on them" +bs_centos_message="WARNING: Deprecated Centos bootstrap has been chosen \ +and activated. Now you can boot new nodes over PXE, they will be discovered \ +and become available for installing OpenStack on them." +# Update issues messages +update_warn_message="There is an issue connecting to the Fuel update repository. \ +Please fix your connection prior to applying any updates. \ +Once the connection is fixed, we recommend reviewing and applying \ +Maintenance Updates for this release of Mirantis OpenStack: \ +https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ +release-notes.html#maintenance-updates" +update_done_message="We recommend reviewing and applying Maintenance Updates \ +for this release of Mirantis OpenStack: \ +https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ +release-notes.html#maintenance-updates" function countdown() { local i @@ -14,16 +62,139 @@ function fail() { echo "ERROR: Fuel node deployment FAILED! Check /var/log/puppet/bootstrap_admin_node.log for details" 1>&2 exit 1 } + +function get_ethernet_interfaces() { + # Get list of all ethernet interfaces, non-virtual, not a wireless + for DEV in /sys/class/net/* ; do + # Take only links into account, skip files + if test ! -L $DEV ; then + continue + fi + DEVPATH=$(readlink -f $DEV) + # Avoid virtual devices like loopback, tunnels, bonding, vlans ... + case $DEVPATH in + */virtual/*) + continue + ;; + esac + IF=${DEVPATH##*/} + # Check ethernet only + case "`cat $DEV/type`" in + 1) + # TYPE=1 is ethernet, may also be wireless, bond, tunnel ... + # Virtual lo, bound, vlan, tunneling has been skipped before + if test -d $DEV/wireless -o -L $DEV/phy80211 ; + then + continue + else + # Catch ethernet non-virtual device + echo $IF + fi + ;; + *) continue + ;; + esac + done +} + +# Get value of a key from ifcfg-* files +# Usage: +# get_ifcfg_value NAME /etc/sysconfig/network-scripts/ifcfg-eth0 +function get_ifcfg_value { + local key=$1 + local path=$2 + local value='' + if [[ -f ${path} ]]; then + value=$(awk -F\= "\$1==\"${key}\" {print \$2}" ${path}) + value=${value//\"/} + fi + echo ${value} +} + +# Workaround to fix dracut network configuration approach: +# Bring down all network interfaces which have the same IP +# address statically configured as 'primary' interface +function ifdown_ethernet_interfaces { + local adminif_ipaddr + local if_config + local if_name + local if_ipaddr + + adminif_ipaddr=$(get_ifcfg_value IPADDR /etc/sysconfig/network-scripts/ifcfg-${ADMIN_INTERFACE}) + if [[ -z "${adminif_ipaddr}" ]]; then + return + fi + for if_config in $(find /etc/sysconfig/network-scripts -name 'ifcfg-*' ! -name 'ifcfg-lo'); do + if_name=$(get_ifcfg_value NAME $if_config) + if [[ "${if_name}" == "${ADMIN_INTERFACE}" ]]; then + continue + fi + if_ipaddr=$(get_ifcfg_value IPADDR $if_config) + if [[ "${if_ipaddr}" == "${adminif_ipaddr}" ]]; then + echo "Interface '${if_name}' uses the same ip '${if_ipaddr}' as admin interface '${ADMIN_INTERFACE}', removing ..." + ifdown ${if_name} + mkdir -p "${bup_folder}" + mv -f "${if_config}" "${bup_folder}" + fi + done +} + +# Check if interface name is valid by checking that +# a config file with NAME equal to given name exists. +function ifname_valid { + local adminif_name=$1 + local if_name + local if_config + for if_config in $(find /etc/sysconfig/network-scripts -name 'ifcfg-*' ! -name 'ifcfg-lo'); do + if_name=$(get_ifcfg_value NAME $if_config) + if [[ "${if_name}" == "${adminif_name}" ]]; then + return 0 + fi + done + return 1 +} + + # LANG variable is a workaround for puppet-3.4.2 bug. See LP#1312758 for details export LANG=en_US.UTF8 -export ADMIN_INTERFACE=eth0 +# Be sure, that network devices have been initialized +udevadm trigger --subsystem-match=net +udevadm settle + +# Import bootstrap_admin_node.conf if exists +if [ -f "${BOOTSTRAP_NODE_CONFIG}" ]; then + source "${BOOTSTRAP_NODE_CONFIG}" +fi -showmenu="no" -if [ -f /etc/fuel/bootstrap_admin_node.conf ]; then - . /etc/fuel/bootstrap_admin_node.conf - echo "Applying admin interface '$ADMIN_INTERFACE'" +# Set defaults to unset / empty variables +# Although eth0 is not always valid it's a good well-known default +# If there is no such interface it will fail to pass ifname_valid +# check and will be replaced. +OLD_ADMIN_INTERFACE=${ADMIN_INTERFACE} +ADMIN_INTERFACE=${ADMIN_INTERFACE:-'eth0'} +showmenu=${showmenu:-'no'} + +# Now check that ADMIN_INTERFACE points to a valid interface +# If it doesn't fallback to getting the first interface name +# from a list of all available interfaces sorted alphabetically +if ! ifname_valid $ADMIN_INTERFACE; then + # Take the very first ethernet interface as an admin interface + ADMIN_INTERFACE=$(get_ethernet_interfaces | sort -V | head -1) +fi + +if [[ "${OLD_ADMIN_INTERFACE}" != "${ADMIN_INTERFACE}" ]]; then + echo "Saving ADMIN_INTERFACE value" + sed -ie "s/^ADMIN_INTERFACE=.*/ADMIN_INTERFACE=${ADMIN_INTERFACE}/g" \ + ${BOOTSTRAP_NODE_CONFIG} fi +echo "Applying admin interface '$ADMIN_INTERFACE'" +export ADMIN_INTERFACE + +echo "Bringing down ALL network interfaces except '${ADMIN_INTERFACE}'" +ifdown_ethernet_interfaces +systemctl restart network + echo "Applying default Fuel settings..." set -x fuelmenu --save-only --iface=$ADMIN_INTERFACE @@ -51,6 +222,15 @@ if [[ "$showmenu" == "yes" || "$showmenu" == "YES" ]]; then fi fi +# Enable sshd +systemctl enable sshd +systemctl start sshd + +# Enable iptables +systemctl enable iptables.service +systemctl start iptables.service + + if [ "$wait_for_external_config" == "yes" ]; then wait_timeout=3000 pidfile=/var/lock/wait_for_external_config @@ -83,11 +263,13 @@ hostname "$HOSTNAME" # and egg problem. Fortunately cobbler is pretty happy with empty files # so it's easy to break the loop. make_ubuntu_bootstrap_stub () { - local bootstrap_dir='/var/www/nailgun/bootstrap/ubuntu' - mkdir -p $bootstrap_dir - for item in linux initramfs.img; do - touch "$bootstrap_dir/$item" - done + local bootstrap_dir='/var/www/nailgun/bootstraps/active_bootstrap' + local bootstrap_stub_dir='/var/www/nailgun/bootstraps/bootstrap_stub' + mkdir -p ${bootstrap_stub_dir} + for item in vmlinuz initrd.img; do + touch "${bootstrap_stub_dir}/$item" + done + ln -s ${bootstrap_stub_dir} ${bootstrap_dir} || true } get_bootstrap_flavor () { @@ -95,47 +277,60 @@ get_bootstrap_flavor () { python <<-EOF from fuelmenu.fuelmenu import Settings conf = Settings().read("$ASTUTE_YAML").get('BOOTSTRAP', {}) - print(conf.get('flavor', 'centos')) + print(conf.get('flavor', 'centos').lower()) + EOF +} + +get_bootstrap_skip () { + local ASTUTE_YAML='/etc/fuel/astute.yaml' + python <<-EOF + from fuelmenu.fuelmenu import Settings + conf = Settings().read("$ASTUTE_YAML").get('BOOTSTRAP', {}) + print(conf.get('skip_default_img_build', False)) + EOF +} + +set_ui_bootstrap_error () { + # This notify can't be closed or removed by user. + # For remove notify - send empty string. + local message=$1 + python <<-EOF + from fuel_bootstrap.utils import notifier + notifier.notify_webui('${message}') EOF } # Actually build the bootstrap image build_ubuntu_bootstrap () { - local ret=1 - local max_attempts=3 - local config='/etc/fuel-bootstrap-image.conf' - local log='/var/log/fuel-bootstrap-image-build.log' - if ! grep -qE '^BOOTSTRAP_SSH_KEYS' "$config"; then - # FIXME: config file generated by fuelmenu has no trailing newline - echo >> "$config" - cat >> "$config" <<-EOF - BOOTSTRAP_SSH_KEYS=/root/.ssh/id_rsa.pub - EOF - fi - for n in `seq 1 $max_attempts`; do - echo "Bulding bootstrap image, attempt $n" >&2 - if fuel-bootstrap-image >>"$log" 2>&1; then - ret=0 - fuel-bootstrap-image-set "ubuntu" - break - fi - done - if [ $ret -ne 0 ]; then - warning="WARNING: failed to build the bootstrap image, see $log for details. -Perhaps your Internet connection is broken. Please fix the problem and run -\`fuel-bootstrap-image-set ubuntu\`" - fuel notify --topic warning --send "$warning" - fi - return $ret + local ret=1 + echo ${bs_progress_message} >&2 + set_ui_bootstrap_error "${bs_progress_message}" >&2 + if fuel-bootstrap -v --debug build --activate >>"$bs_build_log" 2>&1; then + ret=0 + fuel notify --topic "done" --send "${bs_done_message}" + else + ret=1 + set_ui_bootstrap_error "${bs_error_message}" >&2 + fi + # perform hard-return from func + # this part will update input $1 variable + local __resultvar=$1 + eval $__resultvar="'${ret}'" + return $ret } - # Create empty files to make cobbler happy # (even if we don't use Ubuntu based bootstrap) make_ubuntu_bootstrap_stub service docker start +old_sysctl_vm_value=$(sysctl -n vm.min_free_kbytes) +if [ ${old_sysctl_vm_value} -lt 65535 ]; then + echo "Set vm.min_free_kbytes..." + sysctl -w vm.min_free_kbytes=65535 +fi + if [ -f /root/.build_images ]; then #Fail on all errors set -e @@ -147,7 +342,7 @@ if [ -f /root/.build_images ]; then echo "Building Fuel Docker images..." WORKDIR=$(mktemp -d /tmp/docker-buildXXX) SOURCE=/var/www/nailgun/docker - REPO_CONT_ID=$(docker -D run -d -p 80 -v /var/www/nailgun:/var/www/nailgun fuel/centos sh -c 'mkdir /var/www/html/os;ln -sf /var/www/nailgun/centos/x86_64 /var/www/html/os/x86_64;/usr/sbin/apachectl -DFOREGROUND') + REPO_CONT_ID=$(docker -D run -d -p 80 -v /var/www/nailgun:/var/www/nailgun fuel/centos sh -c 'mkdir -p /var/www/html/repo/os;ln -sf /var/www/nailgun/centos/x86_64 /var/www/html/repo/os/x86_64;ln -s /var/www/nailgun/mos-centos/x86_64 /var/www/html/mos-repo;/usr/sbin/apachectl -DFOREGROUND') RANDOM_PORT=$(docker port $REPO_CONT_ID 80 | cut -d':' -f2) for imagesource in /var/www/nailgun/docker/sources/*; do @@ -160,6 +355,10 @@ if [ -f /root/.build_images ]; then mkdir -p $WORKDIR/$image/etc cp -R /etc/puppet /etc/fuel $WORKDIR/$image/etc sed -e "s/_PORT_/${RANDOM_PORT}/" -i $WORKDIR/$image/Dockerfile + sed -r -e 's/^"?PRODUCTION"?:.*/PRODUCTION: "docker-build"/' -i $WORKDIR/$image/etc/fuel/astute.yaml + # FIXME(kozhukalov): Once this patch https://review.openstack.org/#/c/219581/ is merged + # remove this line. fuel-library is to use PRODUCTION value from astute.yaml instead of + # the same value from version.yaml. It is a part of version.yaml deprecation plan. sed -e 's/production:.*/production: "docker-build"/' -i $WORKDIR/$image/etc/fuel/version.yaml docker build -t fuel/${image}_${FUEL_RELEASE} $WORKDIR/$image done @@ -174,26 +373,44 @@ else docker load -i /var/www/nailgun/docker/images/fuel-images.tar fi +if [ ${old_sysctl_vm_value} -lt 65535 ]; then + echo "Restore sysctl vm.min_free_kbytes value..." + sysctl -w vm.min_free_kbytes=${old_sysctl_vm_value} +fi + # apply puppet puppet apply --detailed-exitcodes -d -v /etc/puppet/modules/nailgun/examples/host-only.pp if [ $? -ge 4 ];then fail fi +# Sync time +systemctl stop ntpd +systemctl start ntpdate || echo "Failed to synchronize time with 'ntpdate'" +systemctl start ntpd + rmdir /var/log/remote && ln -s /var/log/docker-logs/remote /var/log/remote dockerctl check || fail bash /etc/rc.local if [ "`get_bootstrap_flavor`" = "ubuntu" ]; then - build_ubuntu_bootstrap || true + if [ "`get_bootstrap_skip`" = "False" ]; then + build_ubuntu_bootstrap bs_status || true + else + fuel notify --topic "warning" --send "${bs_skip_message}" + bs_status=2 + fi +else + fuel notify --topic "warning" --send "${bs_centos_message}" + bs_status=3 fi # Enable updates repository cat > /etc/yum.repos.d/mos${FUEL_RELEASE}-updates.repo << EOF [mos${FUEL_RELEASE}-updates] name=mos${FUEL_RELEASE}-updates -baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos6-fuel/updates/x86_64/ +baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos\$releasever-fuel/updates/x86_64/ gpgcheck=0 skip_if_unavailable=1 EOF @@ -202,14 +419,14 @@ EOF cat > /etc/yum.repos.d/mos${FUEL_RELEASE}-security.repo << EOF [mos${FUEL_RELEASE}-security] name=mos${FUEL_RELEASE}-security -baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos6-fuel/security/x86_64/ +baseurl=http://mirror.fuel-infra.org/mos-repos/centos/mos${FUEL_RELEASE}-centos\$releasever-fuel/security/x86_64/ gpgcheck=0 skip_if_unavailable=1 EOF #Check if repo is accessible echo "Checking for access to updates repository..." -repourl=$(grep baseurl /etc/yum.repos.d/*updates* 2>/dev/null | cut -d'=' -f2- | head -1) +repourl=$(yum repolist all -v | awk '{if ($1 ~ "baseurl" && $3 ~ "updates") print $3}' | head -1) if urlaccesscheck check "$repourl" ; then UPDATE_ISSUES=0 else @@ -217,30 +434,34 @@ else fi if [ $UPDATE_ISSUES -eq 1 ]; then - message="There is an issue connecting to the Fuel update repository. \ -Please fix your connection prior to applying any updates. \ -Once the connection is fixed, we recommend reviewing and applying \ -Maintenance Updates for this release of Mirantis OpenStack: \ -https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ -release-notes.html#maintenance-updates" + message=${update_warn_message} level="warning" else - message="We recommend reviewing and applying Maintenance Updates \ -for this release of Mirantis OpenStack: \ -https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\ -release-notes.html#maintenance-updates" + message=${update_done_message} level="done" fi echo echo "*************************************************" echo -e "${message}" echo "*************************************************" -echo "Sending notification to Fuel UI..." -fuel notify --topic "${level}" --send "${message}" +fuel notify --topic "${level}" --send $(echo "${message}" | tr '\r\n' ' ') 2>&1 -# TODO(kozhukalov) If building of bootstrap image fails -# and if this image was supposed to be a default bootstrap image -# we need to warn a user about this and give her -# advice how to treat this. +# Perform bootstrap messaging to stdout +case ${bs_status} in + 1) + echo -e "${bs_error_message}" + echo "*************************************************" + ;; + 2) + echo -e "${bs_skip_message}" + echo "*************************************************" + ;; + 3) + echo -e "${bs_centos_message}" + echo "*************************************************" + ;; +esac echo "Fuel node deployment complete!" +# Sleep for agetty autologon +sleep 3 diff --git a/build/f_isoroot/f_kscfg/ks.cfg b/build/f_isoroot/f_kscfg/ks.cfg index 8c20971f8..c09a09be9 100644 --- a/build/f_isoroot/f_kscfg/ks.cfg +++ b/build/f_isoroot/f_kscfg/ks.cfg @@ -1,6 +1,7 @@ install text -%include /tmp/source.ks +#%include /tmp/source.ks +cdrom reboot --eject lang en_US.UTF-8 keyboard us @@ -12,9 +13,69 @@ selinux --disabled unsupported_hardware # SKIP CONFIGURING X skipx +repo --name="mos-centos" --baseurl=file:///run/install/repo/mos-centos/ --cost=100 + # NEVER ever place zerombr here, it breaks automated installation %include /tmp/bootloader.ks %include /tmp/partition.ks +%include /tmp/post_partition.ks + + + + + +%packages --nobase +@Core +fuel +fuel-library +fuel-dockerctl +authconfig +bind-utils +bridge-utils +cronie +crontabs +curl +dhcp +docker +fuel-bootstrap-cli +fuel-bootstrap-image +# NOTE(kozhukalov): We don't need target centos images in 8.0 +# fuel-target-centos-images7.1.1503 +fuelmenu +fuel-docker-images +fuel-mirror +fuel-openstack-metadata +gdisk +lrzip +lsof +man +mlocate +nmap-ncat +ntp +ntpdate +openssh-clients +policycoreutils +python-pypcap +rsync +puppet +rubygem-netaddr +rubygem-openstack +selinux-policy-targeted +strace +sysstat +system-config-firewall-base +tcpdump +telnet +vim +virt-what +wget +yum +yum-plugin-priorities +%end + + + + # PREINSTALL SECTION # HERE ARE COMMANDS THAT WILL BE LAUNCHED BEFORE @@ -38,7 +99,13 @@ default_drive=`echo ${drives} ${removable_drives} | awk '{print $1}'` installdrive="undefined" forceformat="no" -for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done +for I in $(cat /proc/cmdline); do + case "$I" in + *=*) + if ! [[ "${I}" =~ "." ]]; then eval "$I"; fi + ;; + esac +done set ${drives} ${removable_drives} numdrives=`echo $#` @@ -177,20 +244,20 @@ fi tgtdrive=$(echo $tgtdrive | sed -e 's/!/\//') # source -if test -e /dev/disk/by-label/"OpenStack_Fuel"; then - echo "harddrive --partition=LABEL="OpenStack_Fuel" --dir=/" > /tmp/source.ks +if test -e /dev/disk/by-label/OpenStack_Fuel; then + echo "harddrive --partition=LABEL=OpenStack_Fuel --dir=/" > /tmp/source.ks elif test -e /dev/disk/by-uuid/will_be_substituted_with_actual_uuid; then echo "harddrive --partition=UUID=will_be_substituted_with_actual_uuid --dir=/" > /tmp/source.ks else echo "cdrom" > /tmp/source.ks fi -vgremove -ff os +vgdisplay -c | cut -d':' -f1 | xargs vgremove -ff dd if=/dev/zero of=/dev/${tgtdrive} bs=10M count=10 sleep 3 hdparm -z /dev/${tgtdrive} parted -s /dev/${tgtdrive} mklabel gpt -parted -a none -s /dev/${tgtdrive} unit MiB mkpart primary 0 24 +parted -a none -s /dev/${tgtdrive} unit MiB mkpart primary 0% 24 parted -s /dev/${tgtdrive} set 1 bios_grub on parted -a none -s /dev/${tgtdrive} unit MiB mkpart primary fat16 24 224 parted -s /dev/${tgtdrive} set 2 boot on @@ -206,20 +273,24 @@ if echo ${tgtdrive} | grep -q -e cciss ; then else bootdev=${tgtdrive} fi -echo > /tmp/partition.ks -echo "partition /boot --onpart=/dev/${bootdev}3" >> /tmp/partition.ks -echo "partition /boot/efi --onpart=/dev/${bootdev}2" >> /tmp/partition.ks -echo "partition pv.001 --ondisk=${tgtdrive} --size=41000 --grow" >> /tmp/partition.ks -echo "volgroup os pv.001" >> /tmp/partition.ks -echo "logvol swap --vgname=os --recommended --name=swap" >> /tmp/partition.ks -echo "logvol / --vgname=os --size=10000 --name=root --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var --vgname=os --size=10000 --percent 30 --grow --name=var --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var/lib/docker --vgname=os --size=17000 --percent 20 --grow --name=varlibdocker --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var/log --vgname=os --size=4096 --percent 50 --grow --name=varlog --fstype=ext4" >> /tmp/partition.ks + +cat << EOF > /tmp/partition.ks +part /boot --onpart=/dev/${bootdev}3 +part /boot/efi --onpart=/dev/${bootdev}2 +part pv.001 --ondisk=${tgtdrive} --size=1 --grow +part pv.002 --ondisk=${tgtdrive} --size=20000 +volgroup os pv.001 +volgroup docker pv.002 +logvol swap --vgname=os --recommended --name=swap +logvol / --vgname=os --size=10000 --name=root --fstype=ext4 +logvol /var --vgname=os --size=10000 --name=var --fstype=ext4 +logvol /var/log --vgname=os --size=4000 --grow --name=varlog --fstype=ext4 +EOF + # bootloader -echo "bootloader --location=partition --driveorder=${tgtdrive} --append=' biosdevname=0 crashkernel=none'" > /tmp/bootloader.ks +echo "bootloader --driveorder=${tgtdrive} --append=' biosdevname=0 crashkernel=none'" > /tmp/bootloader.ks # Anaconda can not install grub 0.97 on disks which are >4T. # The reason is that grub does not support such large geometries @@ -234,80 +305,61 @@ echo "echo \"root (hd0,2)\" >> /tmp/grub.script" >> /tmp/post_partition.ks echo "echo \"install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf\" >> /tmp/grub.script" >> /tmp/post_partition.ks echo "echo quit >> /tmp/grub.script" >> /tmp/post_partition.ks echo "cat /tmp/grub.script | chroot /mnt/sysimage /sbin/grub --no-floppy --batch" >> /tmp/post_partition.ks - +echo "%end" >> /tmp/post_partition.ks %end -%packages --nobase --excludedocs -@Core -fuel -fuel-library >= 7.0 -fuel-dockerctl -authconfig -bind-utils -cronie -crontabs -curl -daemonize -dhcp -docker-io -fuel-bootstrap-image -fuel-bootstrap-image-builder -fuel-createmirror -fuel-target-centos-images6.6 -fuel-package-updates -fuelmenu -fuel-docker-images -gdisk -lrzip -lsof -man -mlocate -nmap-ncat -ntp -ntpdate -openssh-clients -policycoreutils -python-daemon -rsync -ruby21-puppet -ruby21-rubygem-netaddr -ruby21-rubygem-openstack -selinux-policy-targeted -strace -subscription-manager -sysstat -system-config-firewall-base -tcpdump -telnet -vim-enhanced -virt-what -wget -yum -yum-plugin-priorities -%include /tmp/post_partition.ks -# POSTINSTALL SECTION + + +# POSTINSTALL SECTIONS # HERE ARE COMMANDS THAT WILL BE LAUNCHED JUST AFTER # INSTALLATION ITSELF COMPLETED -%post -echo -e "modprobe nf_conntrack_ipv4\nmodprobe nf_conntrack_ipv6\nmodprobe nf_conntrack_tftp\nmodprobe nf_nat_tftp" >> /etc/rc.modules -chmod +x /etc/rc.modules -echo -e "net.nf_conntrack_max=1048576" >> /etc/sysctl.conf -mkdir -p /var/log/coredump -echo -e "kernel.core_pattern=/var/log/coredump/core.%e.%p.%h.%t" >> /etc/sysctl.conf -chmod 777 /var/log/coredump -echo -e "* soft core unlimited\n* hard core unlimited" >> /etc/security/limits.conf + + +# Parse /proc/cmdline and save for next steps +%post --log=/root/anaconda-parse-cmdline.log +#!/bin/bash +set -x + +# Parse cmdline to alter keys which contains dot in their names +# Such keys can't be used as variables in bash, +# so every dot is replaced with double underscore. +# Double underscore needed to avoid possible naming collisions. +for item in $(cat /proc/cmdline); do + if [[ "${item}" =~ '=' ]]; then + key="${item%%=*}" + value="${item#*=}" + else + key="${item}" + value='yes' + fi + key="${key//\./__}" + value="${value:-'yes'}" + echo "${key}=${value}" >> /root/anaconda.cmdline.vars +done + +source /root/anaconda.cmdline.vars + +if [[ ! -z $ifname ]]; then + echo "adminif=$(udevadm info --query=property -p /sys/class/net/${ifname%%:*} | \ + awk -F\= '$1 == "ID_NET_NAME_ONBOARD" {s=$2; exit}; $1 == "ID_NET_NAME_SLOT" {s=$2; exit}; $1 == "ID_NET_NAME_PATH" {s=$2; next}; END {print s}')" >> /root/anaconda.cmdline.vars +fi + +%end + + + + # Mount installation media in chroot %post --nochroot --log=/mnt/sysimage/root/anaconda-post-before-chroot.log -#!/bin/sh - +#!/bin/bash set -x -SOURCE="/mnt/sysimage/tmp/source" +source "/mnt/sysimage/root/anaconda.cmdline.vars" -for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done +SOURCE="/mnt/sysimage/tmp/source" mkdir -p "${SOURCE}" @@ -322,81 +374,32 @@ case "${repo}" in fi ;; esac +%end -%post --log=/root/anaconda-post-after-chroot.log -#!/bin/bash -set -x -function save_cfg { - scrFile="/etc/sysconfig/network-scripts/ifcfg-$admin_interface" - search="domain $domain\nsearch $domain" - sed -i -e 's#^\(HOSTNAME=\).*$#\1'"$hostname"'#' /etc/sysconfig/network - grep -q "^\s*$ip\s+$hostname" /etc/hosts || echo "$ip $hostname" >> /etc/hosts - echo "${search}\nnameserver 127.0.0.1" > /etc/resolv.conf - [ $dns1 ] && echo -e "${search}\nnameserver $dns1" > /etc/resolv.conf - [ $dns1 ] && echo -e "${search}\nnameserver $dns1" > /etc/dnsmasq.upstream - [ $dns2 ] && echo "nameserver $dns2" >> /etc/resolv.conf - [ $dns2 ] && echo "nameserver $dns2" >> /etc/dnsmasq.upstream - - echo DEVICE=$admin_interface > $scrFile - echo ONBOOT=yes >> $scrFile - echo NM_CONTROLLED=no >> $scrFile - echo HWADDR=$hwaddr >> $scrFile - echo USERCTL=no >> $scrFile - echo PEERDNS=no >> $scrFile - if [ $ip ]; then - echo BOOTPROTO=static >> $scrFile - echo IPADDR=$ip >> $scrFile - echo NETMASK=$netmask >> $scrFile - else - echo BOOTPROTO=dhcp >> $scrFile - fi - scrDHCPFile="/etc/sysconfig/network-scripts/ifcfg-$dhcp_interface" - #Ignore gateway and set up DHCP if it is used, otherwise apply it - if [ $dhcp_interface ] && [ "$dhcp_interface" != "$admin_interface" ]; then - echo "DEVICE=$dhcp_interface" > $scrDHCPFile - echo "BOOTPROTO=dhcp" >> $scrDHCPFile - echo "ONBOOT=yes" >> $scrDHCPFile - echo "USERCTL=no" >> $scrDHCPFile - else - echo GATEWAY=$gw >> /etc/sysconfig/network - fi - [ -n "$build_images" -a "$build_images" != "0" ] && echo -e "$build_images" > /root/.build_images -} -# Default FQDN -hostname="nailgun.mirantis.com" - -for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done -hostname=$hostname -domain=${hostname#*.} -ip=$ip -netmask=$netmask -gw=$gw -admin_interface=${admin_interface:-"eth0"} -hwaddr=`ifconfig $admin_interface | grep -i hwaddr | sed -e 's#^.*hwaddr[[:space:]]*##I'` -dhcp_interface=$dhcp_interface -build_images=$build_images -wait_for_external_config=$wait_for_external_config -save_cfg + +%post --log=/root/anaconda-post-configure-repos.log +#!/bin/bash +set -x # Mounting installation source SOURCE=/tmp/source FS=/tmp/fs -echo mkdir -p ${SOURCE} mkdir -p ${FS} -if test -e /dev/disk/by-label/"OpenStack_Fuel"; then - mount /dev/disk/by-label/"OpenStack_Fuel" ${SOURCE} +if test -e /dev/disk/by-label/OpenStack_Fuel; then + mount /dev/disk/by-label/OpenStack_Fuel ${SOURCE} elif test -e /dev/disk/by-uuid/will_be_substituted_with_actual_uuid; then mount /dev/disk/by-uuid/will_be_substituted_with_actual_uuid ${FS} mount -o loop ${FS}/nailgun.iso ${SOURCE} fi -OPENSTACK_VERSION=`cat ${SOURCE}/openstack_version` +# this file is provided by fuel-openstack-metadata package +OPENSTACK_VERSION=`cat /etc/fuel_openstack_version` # ---------------------- # UNPACKING REPOSITORIES @@ -407,10 +410,14 @@ repodir="${wwwdir}/${OPENSTACK_VERSION}" # Copying Centos files mkdir -p ${repodir}/centos/x86_64 +mkdir -p ${repodir}/mos-centos/x86_64 cp -r ${SOURCE}/images ${repodir}/centos/x86_64 cp -r ${SOURCE}/isolinux ${repodir}/centos/x86_64 cp -r ${SOURCE}/repodata ${repodir}/centos/x86_64 cp -r ${SOURCE}/Packages ${repodir}/centos/x86_64 +cp -r ${SOURCE}/mos-centos/repodata ${repodir}/mos-centos/x86_64 +cp -r ${SOURCE}/mos-centos/Packages ${repodir}/mos-centos/x86_64 +cp -r ${SOURCE}/extra-repos ${repodir}/ cp ${SOURCE}/.treeinfo ${repodir}/centos/x86_64 # Copying Ubuntu files @@ -428,29 +435,11 @@ touch ${repodir}/ubuntu/x86_64/images/initrd.gz # make links for backward compatibility ln -s ${repodir}/centos ${wwwdir}/centos ln -s ${repodir}/ubuntu ${wwwdir}/ubuntu +#Make a symlink for mos-centos in /var/www/nailgun in iso/ks.template +ln -s ${repodir}/mos-centos ${wwwdir}/mos-centos +ln -s ${repodir}/extra-repos ${wwwdir}/extra-repos -# -------------------------- -# UNPACKING PUPPET MANIFESTS -# -------------------------- - -# create folders -#mkdir -p /etc/puppet/${OPENSTACK_VERSION}/manifests/ -#mkdir -p /etc/puppet/${OPENSTACK_VERSION}/modules/ -#rm -rf /etc/puppet/modules/ - -# TODO(ikalnitsky): investigate why we need this -#cp ${SOURCE}/puppet-slave.tgz ${wwwdir}/ - -# place modules and manifests -#tar zxf ${SOURCE}/puppet-slave.tgz -C /etc/puppet/${OPENSTACK_VERSION}/modules -#cp /etc/puppet/${OPENSTACK_VERSION}/modules/osnailyfacter/examples/site.pp /etc/puppet/${OPENSTACK_VERSION}/manifests/site.pp -cp ${SOURCE}/centos-versions.yaml ${SOURCE}/ubuntu-versions.yaml /etc/puppet/${OPENSTACK_VERSION}/manifests/ - -# make links for backward compatibility -#pushd /etc/puppet -#ln -s ${OPENSTACK_VERSION}/manifests/ /etc/puppet/manifests -#ln -s ${OPENSTACK_VERSION}/modules/ /etc/puppet/modules -#popd +mkdir -p ${wwwdir}/targetimages cp ${SOURCE}/send2syslog.py /bin/send2syslog.py mkdir -p /var/lib/hiera @@ -458,12 +447,35 @@ touch /var/lib/hiera/common.yaml /etc/puppet/hiera.yaml # Prepare local repository specification rm /etc/yum.repos.d/CentOS*.repo +cp ${SOURCE}/extra-repos/extra.repo /etc/yum.repos.d/ cat > /etc/yum.repos.d/nailgun.repo << EOF [nailgun] name=Nailgun Local Repo baseurl=file:/var/www/nailgun/${OPENSTACK_VERSION}/centos/x86_64 gpgcheck=0 +[mos] +name=MOS Local Repo +baseurl=file:/var/www/nailgun/${OPENSTACK_VERSION}/mos-centos/x86_64 +gpgcheck=0 EOF +%end + + + + + +%post --log=/root/anaconda-post-configure-sysconfig.log +#!/bin/bash +set -x + +source "/root/anaconda.cmdline.vars" +SOURCE=/tmp/source + +# Set correct docker volume group +echo "VG=docker" >> /etc/sysconfig/docker-storage-setup + +# Disable create iptables rules by docker +echo "DOCKER_NETWORK_OPTIONS=--iptables=false" > /etc/sysconfig/docker-network # Disable subscription-manager plugins sed -i 's/^enabled.*/enabled=0/' /etc/yum/pluginconf.d/product-id.conf || : @@ -482,19 +494,16 @@ All environments use online repositories by default. Use the following commands to create local repositories on master node and change default repository settings: -* CentOS: fuel-package-updates (see --help for options) -* Ubuntu: fuel-createmirror (see --help for options) +* CentOS: fuel-mirror (see --help for options) +* Ubuntu: fuel-mirror (see --help for options) Please refer to the following guide for more information: https://docs.mirantis.com/openstack/fuel/fuel-7.0/reference-architecture.html#fuel-rep-mirror EOF -# Copying bootstrap_admin_node.sh, chmod it and -# adding /etc/init/bootstrap_admin_node.conf -cp ${SOURCE}/bootstrap_admin_node.sh /usr/local/sbin/bootstrap_admin_node.sh -chmod 0777 /usr/local/sbin/bootstrap_admin_node.sh -cp ${SOURCE}/bootstrap_admin_node.conf /etc/init/bootstrap_admin_node.conf +# Install bootstrap_admin_node.sh and enabling it +install -m 0777 -D ${SOURCE}/bootstrap_admin_node.sh /usr/local/sbin/bootstrap_admin_node.sh echo "ENABLED=1" > /etc/sysconfig/bootstrap_admin_node # Copying version.yaml file. It contains COMMIT_SHA of last commit. @@ -508,32 +517,31 @@ cp ${SOURCE}/version.yaml /etc/fuel/release_versions/`cat ${SOURCE}/openstack_v # Generete Fuel UUID uuidgen > /etc/fuel/fuel-uuid -# Run fuel menu -[ -z "$showmenu" ] && showmenu="no" - -# Pause during bootstrap_admin_node to wait for external config -[ -z "$wait_for_external_config" ] && wait_for_external_config="no" - - # Prepare bootstrap_admin_node config cat > /etc/fuel/bootstrap_admin_node.conf << EOF #Set to yes to run Fuel Setup #Set to no to accept default settings -ADMIN_INTERFACE=${admin_interface} -showmenu=${showmenu} -wait_for_external_config=${wait_for_external_config} +ADMIN_INTERFACE=${adminif} +showmenu=${showmenu:-no} +wait_for_external_config=${wait_for_external_config:-no} EOF # Prepare custom /etc/issue logon banner and script for changing IP in it -cat > /etc/issue << EOF +# We can have several interface naming schemes applied and several interface +# UI will listen on +ipstr="" +NL=$'\n' +for ip in `ip -o -4 a | grep -e "e[nt][hopsx].*" | awk '{print \$4 }' | cut -d/ -f1`; do + ipstr="${ipstr}https://${ip}:8443${NL}" +done +cat > /etc/issue <<EOF ######################################### # Welcome to the Fuel server # ######################################### Server is running on \m platform Fuel UI is available on: -https://:8443 - +$ipstr Default administrator login: root Default administrator password: r00tme @@ -544,31 +552,6 @@ Please change root password on first login. EOF - -cat >> '/etc/rc.local' << EOF -first=yes -for ip in \$(ip -o -4 addr | grep "eth." | awk '{print \$4 }' | cut -d/ -f1); do -if [ "\$first" = "yes" ]; then - ipstr="Fuel UI is available on: https://\$ip:8443" - first=no -else - ipstr=\$(printf "%s\n%25s%s" "\$ipstr" " " "https://\$ip:8443") -fi -done -tmpissue=\$(mktemp) -while read -r line; do - if [[ "\$line" =~ "Fuel UI is available on" ]]; then - echo -e "\$ipstr" >> \$tmpissue - elif [[ "\$line" =~ :8443$ ]]; then - : - else - echo -e "\$line" >> \$tmpissue - fi -done < /etc/issue -mv "\$tmpissue" /etc/issue - -EOF - ######### OPNFV addition BEGIN ############ # Copy data into /opt/opnfv # TODO: This ought to be a package instead! @@ -586,24 +569,63 @@ rm -rf ${FS} echo "tos orphan 7" >> /etc/ntp.conf -# Do not show error message on ntpdate failure. Customers should not be confused -# if admin node does not have access to the internet time servers. -sed -i /etc/rc.d/init.d/ntpdate -e 's/\([ $RETVAL -eq 0 ] && success || \)failure/\1success/' - # Disabling splash -sed -i --follow-symlinks -e '/^\skernel/ s/rhgb//' /etc/grub.conf -sed -i --follow-symlinks -e '/^\skernel/ s/quiet//' /etc/grub.conf - -# Disabling console clearing -sed -i 's/getty/getty --noclear/' /etc/init/tty.conf - -# Disabling starting first console from start-ttys service -sed -i --follow-symlinks -e 's/ACTIVE_CONSOLES=.*/ACTIVE_CONSOLES=\/dev\/tty\[2-6\]/' /etc/sysconfig/init +sed -i --follow-symlinks -e '/^\slinux16/ s/rhgb/debug/' /boot/grub2/grub.cfg # Copying default bash settings to the root directory cp -f /etc/skel/.bash* /root/ # Blacklist i2c_piix4 module for VirtualBox so it does not create kernel errors -[[ $(virt-what) = "virtualbox" ]] && echo "blacklist i2c_piix4" > /etc/modprobe.d/blacklist-i2c-piix4.conf +(virt-what | fgrep -q "virtualbox") && echo "blacklist i2c_piix4" > /etc/modprobe.d/blacklist-i2c-piix4.conf +# Blacklist intel_rapl module for VirtualBox so it does not create kernel errors +(virt-what | fgrep -q "virtualbox") && echo "blacklist intel_rapl" > /etc/modprobe.d/blacklist-intel-rapl.conf + +# Disable sshd until after Fuel Setup if not running on VirtualBox +# TODO(mattymo): Remove VBox exception after LP#1487047 is fixed +(virt-what | fgrep -q "virtualbox") || systemctl disable sshd + +%end + + + + + +%post --log=/root/anaconda-post-configure-autologon.log +#!/bin/bash +set -x + +# Enable once root autologin for initial setup +mkdir -p /etc/systemd/system/getty@tty1.service.d/ +cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << 'EOF' +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I 115200 linux +EOF + +# Exec bootstrap_admin_node.sh if autologin enabled +cat >> /root/.bashrc << 'EOF' +if [[ "$(tty)" == "/dev/tty1" && -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]]; then + rm -Rf "/etc/systemd/system/getty@tty1.service.d" + /bin/systemctl daemon-reload + if [ -x /usr/local/sbin/bootstrap_admin_node.sh ]; then + exec /usr/local/sbin/bootstrap_admin_node.sh + fi +fi +EOF %end + + +%post --nochroot --log=/mnt/sysimage/root/anaconda-post-interface-settings.log +#!/bin/bash +set -x + +source "/mnt/sysimage/root/anaconda.cmdline.vars" + +if [[ ! -z $adminif ]]; then + rm -f /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-${ifname%%:*} + sed "s/${ifname%%:*}/${adminif}/g" \ + /etc/sysconfig/network-scripts/ifcfg-${ifname%%:*} > \ + /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-${adminif} +fi +%end
\ No newline at end of file diff --git a/build/f_isoroot/f_kscfg/ks.cfg.orig b/build/f_isoroot/f_kscfg/ks.cfg.orig index 148ef9908..a752dacac 100644 --- a/build/f_isoroot/f_kscfg/ks.cfg.orig +++ b/build/f_isoroot/f_kscfg/ks.cfg.orig @@ -1,6 +1,7 @@ install text -%include /tmp/source.ks +#%include /tmp/source.ks +cdrom reboot --eject lang en_US.UTF-8 keyboard us @@ -12,9 +13,69 @@ selinux --disabled unsupported_hardware # SKIP CONFIGURING X skipx +repo --name="mos-centos" --baseurl=file:///run/install/repo/mos-centos/ --cost=100 + # NEVER ever place zerombr here, it breaks automated installation %include /tmp/bootloader.ks %include /tmp/partition.ks +%include /tmp/post_partition.ks + + + + + +%packages --nobase +@Core +fuel +fuel-library +fuel-dockerctl +authconfig +bind-utils +bridge-utils +cronie +crontabs +curl +dhcp +docker +fuel-bootstrap-cli +fuel-bootstrap-image +# NOTE(kozhukalov): We don't need target centos images in 8.0 +# fuel-target-centos-images7.1.1503 +fuelmenu +fuel-docker-images +fuel-mirror +fuel-openstack-metadata +gdisk +lrzip +lsof +man +mlocate +nmap-ncat +ntp +ntpdate +openssh-clients +policycoreutils +python-pypcap +rsync +puppet +rubygem-netaddr +rubygem-openstack +selinux-policy-targeted +strace +sysstat +system-config-firewall-base +tcpdump +telnet +vim +virt-what +wget +yum +yum-plugin-priorities +%end + + + + # PREINSTALL SECTION # HERE ARE COMMANDS THAT WILL BE LAUNCHED BEFORE @@ -38,7 +99,13 @@ default_drive=`echo ${drives} ${removable_drives} | awk '{print $1}'` installdrive="undefined" forceformat="no" -for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done +for I in $(cat /proc/cmdline); do + case "$I" in + *=*) + if ! [[ "${I}" =~ "." ]]; then eval "$I"; fi + ;; + esac +done set ${drives} ${removable_drives} numdrives=`echo $#` @@ -177,20 +244,20 @@ fi tgtdrive=$(echo $tgtdrive | sed -e 's/!/\//') # source -if test -e /dev/disk/by-label/"OpenStack_Fuel"; then - echo "harddrive --partition=LABEL="OpenStack_Fuel" --dir=/" > /tmp/source.ks +if test -e /dev/disk/by-label/OpenStack_Fuel; then + echo "harddrive --partition=LABEL=OpenStack_Fuel --dir=/" > /tmp/source.ks elif test -e /dev/disk/by-uuid/will_be_substituted_with_actual_uuid; then echo "harddrive --partition=UUID=will_be_substituted_with_actual_uuid --dir=/" > /tmp/source.ks else echo "cdrom" > /tmp/source.ks fi -vgremove -ff os +vgdisplay -c | cut -d':' -f1 | xargs vgremove -ff dd if=/dev/zero of=/dev/${tgtdrive} bs=10M count=10 sleep 3 hdparm -z /dev/${tgtdrive} parted -s /dev/${tgtdrive} mklabel gpt -parted -a none -s /dev/${tgtdrive} unit MiB mkpart primary 0 24 +parted -a none -s /dev/${tgtdrive} unit MiB mkpart primary 0% 24 parted -s /dev/${tgtdrive} set 1 bios_grub on parted -a none -s /dev/${tgtdrive} unit MiB mkpart primary fat16 24 224 parted -s /dev/${tgtdrive} set 2 boot on @@ -206,20 +273,24 @@ if echo ${tgtdrive} | grep -q -e cciss ; then else bootdev=${tgtdrive} fi -echo > /tmp/partition.ks -echo "partition /boot --onpart=/dev/${bootdev}3" >> /tmp/partition.ks -echo "partition /boot/efi --onpart=/dev/${bootdev}2" >> /tmp/partition.ks -echo "partition pv.001 --ondisk=${tgtdrive} --size=41000 --grow" >> /tmp/partition.ks -echo "volgroup os pv.001" >> /tmp/partition.ks -echo "logvol swap --vgname=os --recommended --name=swap" >> /tmp/partition.ks -echo "logvol / --vgname=os --size=10000 --name=root --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var --vgname=os --size=10000 --percent 30 --grow --name=var --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var/lib/docker --vgname=os --size=17000 --percent 20 --grow --name=varlibdocker --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var/log --vgname=os --size=4096 --percent 50 --grow --name=varlog --fstype=ext4" >> /tmp/partition.ks + +cat << EOF > /tmp/partition.ks +part /boot --onpart=/dev/${bootdev}3 +part /boot/efi --onpart=/dev/${bootdev}2 +part pv.001 --ondisk=${tgtdrive} --size=1 --grow +part pv.002 --ondisk=${tgtdrive} --size=20000 +volgroup os pv.001 +volgroup docker pv.002 +logvol swap --vgname=os --recommended --name=swap +logvol / --vgname=os --size=10000 --name=root --fstype=ext4 +logvol /var --vgname=os --size=10000 --name=var --fstype=ext4 +logvol /var/log --vgname=os --size=4000 --grow --name=varlog --fstype=ext4 +EOF + # bootloader -echo "bootloader --location=partition --driveorder=${tgtdrive} --append=' biosdevname=0 crashkernel=none'" > /tmp/bootloader.ks +echo "bootloader --driveorder=${tgtdrive} --append=' biosdevname=0 crashkernel=none'" > /tmp/bootloader.ks # Anaconda can not install grub 0.97 on disks which are >4T. # The reason is that grub does not support such large geometries @@ -234,80 +305,61 @@ echo "echo \"root (hd0,2)\" >> /tmp/grub.script" >> /tmp/post_partition.ks echo "echo \"install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf\" >> /tmp/grub.script" >> /tmp/post_partition.ks echo "echo quit >> /tmp/grub.script" >> /tmp/post_partition.ks echo "cat /tmp/grub.script | chroot /mnt/sysimage /sbin/grub --no-floppy --batch" >> /tmp/post_partition.ks - +echo "%end" >> /tmp/post_partition.ks %end -%packages --nobase --excludedocs -@Core -fuel -fuel-library >= 7.0 -fuel-dockerctl -authconfig -bind-utils -cronie -crontabs -curl -daemonize -dhcp -docker-io -fuel-bootstrap-image -fuel-bootstrap-image-builder -fuel-createmirror -fuel-target-centos-images6.6 -fuel-package-updates -fuelmenu -fuel-docker-images -gdisk -lrzip -lsof -man -mlocate -nmap-ncat -ntp -ntpdate -openssh-clients -policycoreutils -python-daemon -rsync -ruby21-puppet -ruby21-rubygem-netaddr -ruby21-rubygem-openstack -selinux-policy-targeted -strace -subscription-manager -sysstat -system-config-firewall-base -tcpdump -telnet -vim-enhanced -virt-what -wget -yum -yum-plugin-priorities -%include /tmp/post_partition.ks -# POSTINSTALL SECTION + + +# POSTINSTALL SECTIONS # HERE ARE COMMANDS THAT WILL BE LAUNCHED JUST AFTER # INSTALLATION ITSELF COMPLETED -%post -echo -e "modprobe nf_conntrack_ipv4\nmodprobe nf_conntrack_ipv6\nmodprobe nf_conntrack_tftp\nmodprobe nf_nat_tftp" >> /etc/rc.modules -chmod +x /etc/rc.modules -echo -e "net.nf_conntrack_max=1048576" >> /etc/sysctl.conf -mkdir -p /var/log/coredump -echo -e "kernel.core_pattern=/var/log/coredump/core.%e.%p.%h.%t" >> /etc/sysctl.conf -chmod 777 /var/log/coredump -echo -e "* soft core unlimited\n* hard core unlimited" >> /etc/security/limits.conf + + +# Parse /proc/cmdline and save for next steps +%post --log=/root/anaconda-parse-cmdline.log +#!/bin/bash +set -x + +# Parse cmdline to alter keys which contains dot in their names +# Such keys can't be used as variables in bash, +# so every dot is replaced with double underscore. +# Double underscore needed to avoid possible naming collisions. +for item in $(cat /proc/cmdline); do + if [[ "${item}" =~ '=' ]]; then + key="${item%%=*}" + value="${item#*=}" + else + key="${item}" + value='yes' + fi + key="${key//\./__}" + value="${value:-'yes'}" + echo "${key}=${value}" >> /root/anaconda.cmdline.vars +done + +source /root/anaconda.cmdline.vars + +if [[ ! -z $ifname ]]; then + echo "adminif=$(udevadm info --query=property -p /sys/class/net/${ifname%%:*} | \ + awk -F\= '$1 == "ID_NET_NAME_ONBOARD" {s=$2; exit}; $1 == "ID_NET_NAME_SLOT" {s=$2; exit}; $1 == "ID_NET_NAME_PATH" {s=$2; next}; END {print s}')" >> /root/anaconda.cmdline.vars +fi + +%end + + + + # Mount installation media in chroot %post --nochroot --log=/mnt/sysimage/root/anaconda-post-before-chroot.log -#!/bin/sh - +#!/bin/bash set -x -SOURCE="/mnt/sysimage/tmp/source" +source "/mnt/sysimage/root/anaconda.cmdline.vars" -for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done +SOURCE="/mnt/sysimage/tmp/source" mkdir -p "${SOURCE}" @@ -322,81 +374,32 @@ case "${repo}" in fi ;; esac +%end -%post --log=/root/anaconda-post-after-chroot.log -#!/bin/bash -set -x -function save_cfg { - scrFile="/etc/sysconfig/network-scripts/ifcfg-$admin_interface" - search="domain $domain\nsearch $domain" - sed -i -e 's#^\(HOSTNAME=\).*$#\1'"$hostname"'#' /etc/sysconfig/network - grep -q "^\s*$ip\s+$hostname" /etc/hosts || echo "$ip $hostname" >> /etc/hosts - echo "${search}\nnameserver 127.0.0.1" > /etc/resolv.conf - [ $dns1 ] && echo -e "${search}\nnameserver $dns1" > /etc/resolv.conf - [ $dns1 ] && echo -e "${search}\nnameserver $dns1" > /etc/dnsmasq.upstream - [ $dns2 ] && echo "nameserver $dns2" >> /etc/resolv.conf - [ $dns2 ] && echo "nameserver $dns2" >> /etc/dnsmasq.upstream - - echo DEVICE=$admin_interface > $scrFile - echo ONBOOT=yes >> $scrFile - echo NM_CONTROLLED=no >> $scrFile - echo HWADDR=$hwaddr >> $scrFile - echo USERCTL=no >> $scrFile - echo PEERDNS=no >> $scrFile - if [ $ip ]; then - echo BOOTPROTO=static >> $scrFile - echo IPADDR=$ip >> $scrFile - echo NETMASK=$netmask >> $scrFile - else - echo BOOTPROTO=dhcp >> $scrFile - fi - scrDHCPFile="/etc/sysconfig/network-scripts/ifcfg-$dhcp_interface" - #Ignore gateway and set up DHCP if it is used, otherwise apply it - if [ $dhcp_interface ] && [ "$dhcp_interface" != "$admin_interface" ]; then - echo "DEVICE=$dhcp_interface" > $scrDHCPFile - echo "BOOTPROTO=dhcp" >> $scrDHCPFile - echo "ONBOOT=yes" >> $scrDHCPFile - echo "USERCTL=no" >> $scrDHCPFile - else - echo GATEWAY=$gw >> /etc/sysconfig/network - fi - [ -n "$build_images" -a "$build_images" != "0" ] && echo -e "$build_images" > /root/.build_images -} -# Default FQDN -hostname="nailgun.mirantis.com" - -for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done -hostname=$hostname -domain=${hostname#*.} -ip=$ip -netmask=$netmask -gw=$gw -admin_interface=${admin_interface:-"eth0"} -hwaddr=`ifconfig $admin_interface | grep -i hwaddr | sed -e 's#^.*hwaddr[[:space:]]*##I'` -dhcp_interface=$dhcp_interface -build_images=$build_images -wait_for_external_config=$wait_for_external_config -save_cfg + +%post --log=/root/anaconda-post-configure-repos.log +#!/bin/bash +set -x # Mounting installation source SOURCE=/tmp/source FS=/tmp/fs -echo mkdir -p ${SOURCE} mkdir -p ${FS} -if test -e /dev/disk/by-label/"OpenStack_Fuel"; then - mount /dev/disk/by-label/"OpenStack_Fuel" ${SOURCE} +if test -e /dev/disk/by-label/OpenStack_Fuel; then + mount /dev/disk/by-label/OpenStack_Fuel ${SOURCE} elif test -e /dev/disk/by-uuid/will_be_substituted_with_actual_uuid; then mount /dev/disk/by-uuid/will_be_substituted_with_actual_uuid ${FS} mount -o loop ${FS}/nailgun.iso ${SOURCE} fi -OPENSTACK_VERSION=`cat ${SOURCE}/openstack_version` +# this file is provided by fuel-openstack-metadata package +OPENSTACK_VERSION=`cat /etc/fuel_openstack_version` # ---------------------- # UNPACKING REPOSITORIES @@ -407,10 +410,14 @@ repodir="${wwwdir}/${OPENSTACK_VERSION}" # Copying Centos files mkdir -p ${repodir}/centos/x86_64 +mkdir -p ${repodir}/mos-centos/x86_64 cp -r ${SOURCE}/images ${repodir}/centos/x86_64 cp -r ${SOURCE}/isolinux ${repodir}/centos/x86_64 cp -r ${SOURCE}/repodata ${repodir}/centos/x86_64 cp -r ${SOURCE}/Packages ${repodir}/centos/x86_64 +cp -r ${SOURCE}/mos-centos/repodata ${repodir}/mos-centos/x86_64 +cp -r ${SOURCE}/mos-centos/Packages ${repodir}/mos-centos/x86_64 +cp -r ${SOURCE}/extra-repos ${repodir}/ cp ${SOURCE}/.treeinfo ${repodir}/centos/x86_64 # Copying Ubuntu files @@ -428,29 +435,11 @@ touch ${repodir}/ubuntu/x86_64/images/initrd.gz # make links for backward compatibility ln -s ${repodir}/centos ${wwwdir}/centos ln -s ${repodir}/ubuntu ${wwwdir}/ubuntu +#Make a symlink for mos-centos in /var/www/nailgun in iso/ks.template +ln -s ${repodir}/mos-centos ${wwwdir}/mos-centos +ln -s ${repodir}/extra-repos ${wwwdir}/extra-repos -# -------------------------- -# UNPACKING PUPPET MANIFESTS -# -------------------------- - -# create folders -#mkdir -p /etc/puppet/${OPENSTACK_VERSION}/manifests/ -#mkdir -p /etc/puppet/${OPENSTACK_VERSION}/modules/ -#rm -rf /etc/puppet/modules/ - -# TODO(ikalnitsky): investigate why we need this -#cp ${SOURCE}/puppet-slave.tgz ${wwwdir}/ - -# place modules and manifests -#tar zxf ${SOURCE}/puppet-slave.tgz -C /etc/puppet/${OPENSTACK_VERSION}/modules -#cp /etc/puppet/${OPENSTACK_VERSION}/modules/osnailyfacter/examples/site.pp /etc/puppet/${OPENSTACK_VERSION}/manifests/site.pp -cp ${SOURCE}/centos-versions.yaml ${SOURCE}/ubuntu-versions.yaml /etc/puppet/${OPENSTACK_VERSION}/manifests/ - -# make links for backward compatibility -#pushd /etc/puppet -#ln -s ${OPENSTACK_VERSION}/manifests/ /etc/puppet/manifests -#ln -s ${OPENSTACK_VERSION}/modules/ /etc/puppet/modules -#popd +mkdir -p ${wwwdir}/targetimages cp ${SOURCE}/send2syslog.py /bin/send2syslog.py mkdir -p /var/lib/hiera @@ -458,12 +447,35 @@ touch /var/lib/hiera/common.yaml /etc/puppet/hiera.yaml # Prepare local repository specification rm /etc/yum.repos.d/CentOS*.repo +cp ${SOURCE}/extra-repos/extra.repo /etc/yum.repos.d/ cat > /etc/yum.repos.d/nailgun.repo << EOF [nailgun] name=Nailgun Local Repo baseurl=file:/var/www/nailgun/${OPENSTACK_VERSION}/centos/x86_64 gpgcheck=0 +[mos] +name=MOS Local Repo +baseurl=file:/var/www/nailgun/${OPENSTACK_VERSION}/mos-centos/x86_64 +gpgcheck=0 EOF +%end + + + + + +%post --log=/root/anaconda-post-configure-sysconfig.log +#!/bin/bash +set -x + +source "/root/anaconda.cmdline.vars" +SOURCE=/tmp/source + +# Set correct docker volume group +echo "VG=docker" >> /etc/sysconfig/docker-storage-setup + +# Disable create iptables rules by docker +echo "DOCKER_NETWORK_OPTIONS=--iptables=false" > /etc/sysconfig/docker-network # Disable subscription-manager plugins sed -i 's/^enabled.*/enabled=0/' /etc/yum/pluginconf.d/product-id.conf || : @@ -482,19 +494,16 @@ All environments use online repositories by default. Use the following commands to create local repositories on master node and change default repository settings: -* CentOS: fuel-package-updates (see --help for options) -* Ubuntu: fuel-createmirror (see --help for options) +* CentOS: fuel-mirror (see --help for options) +* Ubuntu: fuel-mirror (see --help for options) Please refer to the following guide for more information: https://docs.mirantis.com/openstack/fuel/fuel-7.0/reference-architecture.html#fuel-rep-mirror EOF -# Copying bootstrap_admin_node.sh, chmod it and -# adding /etc/init/bootstrap_admin_node.conf -cp ${SOURCE}/bootstrap_admin_node.sh /usr/local/sbin/bootstrap_admin_node.sh -chmod 0777 /usr/local/sbin/bootstrap_admin_node.sh -cp ${SOURCE}/bootstrap_admin_node.conf /etc/init/bootstrap_admin_node.conf +# Install bootstrap_admin_node.sh and enabling it +install -m 0777 -D ${SOURCE}/bootstrap_admin_node.sh /usr/local/sbin/bootstrap_admin_node.sh echo "ENABLED=1" > /etc/sysconfig/bootstrap_admin_node # Copying version.yaml file. It contains COMMIT_SHA of last commit. @@ -508,32 +517,31 @@ cp ${SOURCE}/version.yaml /etc/fuel/release_versions/`cat ${SOURCE}/openstack_v # Generete Fuel UUID uuidgen > /etc/fuel/fuel-uuid -# Run fuel menu -[ -z "$showmenu" ] && showmenu="no" - -# Pause during bootstrap_admin_node to wait for external config -[ -z "$wait_for_external_config" ] && wait_for_external_config="no" - - # Prepare bootstrap_admin_node config cat > /etc/fuel/bootstrap_admin_node.conf << EOF #Set to yes to run Fuel Setup #Set to no to accept default settings -ADMIN_INTERFACE=${admin_interface} -showmenu=${showmenu} -wait_for_external_config=${wait_for_external_config} +ADMIN_INTERFACE=${adminif} +showmenu=${showmenu:-no} +wait_for_external_config=${wait_for_external_config:-no} EOF # Prepare custom /etc/issue logon banner and script for changing IP in it -cat > /etc/issue << EOF +# We can have several interface naming schemes applied and several interface +# UI will listen on +ipstr="" +NL=$'\n' +for ip in `ip -o -4 a | grep -e "e[nt][hopsx].*" | awk '{print \$4 }' | cut -d/ -f1`; do + ipstr="${ipstr}https://${ip}:8443${NL}" +done +cat > /etc/issue <<EOF ######################################### # Welcome to the Fuel server # ######################################### Server is running on \m platform Fuel UI is available on: -https://:8443 - +$ipstr Default administrator login: root Default administrator password: r00tme @@ -544,32 +552,6 @@ Please change root password on first login. EOF - -cat >> '/etc/rc.local' << EOF -first=yes -for ip in \$(ip -o -4 addr | grep "eth." | awk '{print \$4 }' | cut -d/ -f1); do -if [ "\$first" = "yes" ]; then - ipstr="Fuel UI is available on: https://\$ip:8443" - first=no -else - ipstr=\$(printf "%s\n%25s%s" "\$ipstr" " " "https://\$ip:8443") -fi -done -tmpissue=\$(mktemp) -while read -r line; do - if [[ "\$line" =~ "Fuel UI is available on" ]]; then - echo -e "\$ipstr" >> \$tmpissue - elif [[ "\$line" =~ :8443$ ]]; then - : - else - echo -e "\$line" >> \$tmpissue - fi -done < /etc/issue -mv "\$tmpissue" /etc/issue - -EOF - - # Unmounting source umount -f ${SOURCE} rm -rf ${SOURCE} @@ -579,24 +561,63 @@ rm -rf ${FS} echo "tos orphan 7" >> /etc/ntp.conf -# Do not show error message on ntpdate failure. Customers should not be confused -# if admin node does not have access to the internet time servers. -sed -i /etc/rc.d/init.d/ntpdate -e 's/\([ $RETVAL -eq 0 ] && success || \)failure/\1success/' - # Disabling splash -sed -i --follow-symlinks -e '/^\skernel/ s/rhgb//' /etc/grub.conf -sed -i --follow-symlinks -e '/^\skernel/ s/quiet//' /etc/grub.conf - -# Disabling console clearing -sed -i 's/getty/getty --noclear/' /etc/init/tty.conf - -# Disabling starting first console from start-ttys service -sed -i --follow-symlinks -e 's/ACTIVE_CONSOLES=.*/ACTIVE_CONSOLES=\/dev\/tty\[2-6\]/' /etc/sysconfig/init +sed -i --follow-symlinks -e '/^\slinux16/ s/rhgb/debug/' /boot/grub2/grub.cfg # Copying default bash settings to the root directory cp -f /etc/skel/.bash* /root/ # Blacklist i2c_piix4 module for VirtualBox so it does not create kernel errors -[[ $(virt-what) = "virtualbox" ]] && echo "blacklist i2c_piix4" > /etc/modprobe.d/blacklist-i2c-piix4.conf +(virt-what | fgrep -q "virtualbox") && echo "blacklist i2c_piix4" > /etc/modprobe.d/blacklist-i2c-piix4.conf + +# Blacklist intel_rapl module for VirtualBox so it does not create kernel errors +(virt-what | fgrep -q "virtualbox") && echo "blacklist intel_rapl" > /etc/modprobe.d/blacklist-intel-rapl.conf +# Disable sshd until after Fuel Setup if not running on VirtualBox +# TODO(mattymo): Remove VBox exception after LP#1487047 is fixed +(virt-what | fgrep -q "virtualbox") || systemctl disable sshd + +%end + + + + + +%post --log=/root/anaconda-post-configure-autologon.log +#!/bin/bash +set -x + +# Enable once root autologin for initial setup +mkdir -p /etc/systemd/system/getty@tty1.service.d/ +cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << 'EOF' +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I 115200 linux +EOF + +# Exec bootstrap_admin_node.sh if autologin enabled +cat >> /root/.bashrc << 'EOF' +if [[ "$(tty)" == "/dev/tty1" && -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]]; then + rm -Rf "/etc/systemd/system/getty@tty1.service.d" + /bin/systemctl daemon-reload + if [ -x /usr/local/sbin/bootstrap_admin_node.sh ]; then + exec /usr/local/sbin/bootstrap_admin_node.sh + fi +fi +EOF +%end + + +%post --nochroot --log=/mnt/sysimage/root/anaconda-post-interface-settings.log +#!/bin/bash +set -x + +source "/mnt/sysimage/root/anaconda.cmdline.vars" + +if [[ ! -z $adminif ]]; then + rm -f /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-${ifname%%:*} + sed "s/${ifname%%:*}/${adminif}/g" \ + /etc/sysconfig/network-scripts/ifcfg-${ifname%%:*} > \ + /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-${adminif} +fi %end
\ No newline at end of file |