From f8fef621cbbe130e0919134717e28810082532d3 Mon Sep 17 00:00:00 2001 From: Rick Box Date: Fri, 3 Feb 2017 04:19:39 +0000 Subject: [PATCH] Adds in TFTP Configure role - Ubuntu 16.04 Building on from the previous commit https://review.openstack.org/427869 this adds in TFTP configure role which handles all the pre-seed templates and sets up all the PXEBoot files. Change-Id: Ibdf7bfac9bc2c5b5cabdc79ce8584112b2ae0678 --- .../roles/tftpboot_configure/README.md | 28 ++ .../tftpboot_configure/defaults/main.yml | 48 +++ .../roles/tftpboot_configure/files/memdisk | Bin 0 -> 26140 bytes .../roles/tftpboot_configure/files/menu.c32 | Bin 0 -> 54964 bytes .../roles/tftpboot_configure/files/pxelinux.0 | Bin 0 -> 16794 bytes .../roles/tftpboot_configure/meta/main.yml | 22 ++ .../tftpboot_configure/tasks/configure.yml | 101 ++++++ .../roles/tftpboot_configure/tasks/main.yml | 17 + .../templates/default_pxelinux.j2 | 19 ++ .../tftpboot_configure/templates/pxelinux.j2 | 8 + ...ntu-server-16.04-unattended-cinder.seed.j2 | 273 ++++++++++++++++ ...untu-server-16.04-unattended-infra.seed.j2 | 267 ++++++++++++++++ ...tu-server-16.04-unattended-logging.seed.j2 | 267 ++++++++++++++++ ...tu-server-16.04-unattended-network.seed.j2 | 267 ++++++++++++++++ ...rver-16.04-unattended-nova_compute.seed.j2 | 275 +++++++++++++++++ ...untu-server-16.04-unattended-swift.seed.j2 | 291 ++++++++++++++++++ 16 files changed, 1883 insertions(+) create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/README.md create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/defaults/main.yml create mode 100755 multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/memdisk create mode 100755 multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/menu.c32 create mode 100755 multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/pxelinux.0 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/meta/main.yml create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/configure.yml create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/main.yml create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/default_pxelinux.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/pxelinux.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-cinder.seed.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-infra.seed.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-logging.seed.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-network.seed.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-nova_compute.seed.j2 create mode 100644 multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-swift.seed.j2 diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/README.md b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/README.md new file mode 100644 index 00000000..493e27ac --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/README.md @@ -0,0 +1,28 @@ +tftpboot_configure +========= + +This module configures custom tftp allowing for netboot of an Ubuntu system. It dynamically creates a TFTBoot based on the MAC addresses passed in. It also generates a preseed and late command which are used to install the system + +Requirements +------------ + +This module requires Ansible 2.x + +Role Variables +-------------- + +See defaults for variables and descriptions + +Dependencies +------------ + +This role depends on a DHCPD and ATFTP roles + +Example Playbook +---------------- + +Example to call: + + - hosts: all + roles: + - { role: tftpboot_configure } diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/defaults/main.yml b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/defaults/main.yml new file mode 100644 index 00000000..c24f4d1f --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/defaults/main.yml @@ -0,0 +1,48 @@ +--- +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# name: tftpboot_configure/defaults +# description: ALL our default variables for tftpboot_configure go in here +#------------------------------------------------------------------------------ +# Packages - All our required packages we need installing +#------------------------------------------------------------------------------ + +# - variables - +tftp_mirror: archive.ubuntu.com # Where will we pull our linux boot environment from +tftp_proxy: blank # What proxy will we use, if any. +tftp_distro: [ xenial ] # What distribution will we pull +tftp_files: [ initrd.gz, linux ] + +ntp_server: pool.ntp.org +atftpd_path: /srv/tftp # What is the path for our tftpd +tftp_source: /srv/tftp_source/ # What is the path where the source pxe config files are placed per server + +atftp_user: nobody # What user does this environment get set up as +atftp_group: nogroup # What group does this environment get set up as + +preseed_password: hackme # Default password placed into pre-seed file +vm_disk_device: vda # Default disk device used in pre-seed +vm_net_iface: ens3 # Default interface used in pre-seed +ssh_key: blank + +# These below variables rely on apache being set up and is where the preseed is set up + +preseed_apache_url: pxe # What is the url http://server/THISVARHERE +preseed_path: /var/www/pxe # What path +webserver_ip_address: "{{ ansible_default_ipv4.address }}" + +server_list: # What is our list of servers + - name: blank + hwaddr: "aa:aa:aa:aa:aa:aa" + distro: xenial + preseed_file: my-preseed-file # Allow a custom preseed on a per server basis diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/memdisk b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/memdisk new file mode 100755 index 0000000000000000000000000000000000000000..a532e9077d99153ba9d8fbc1b6cf4ccca11bc5b3 GIT binary patch literal 26140 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 literal 0 HcmV?d00001 diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/pxelinux.0 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/files/pxelinux.0 new file mode 100755 index 0000000000000000000000000000000000000000..e59955122bd72d013ef9a1085d00cc542d769250 GIT binary patch literal 16794 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/meta/main.yml b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/meta/main.yml new file mode 100644 index 00000000..fe3e481e --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/meta/main.yml @@ -0,0 +1,22 @@ +--- +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +galaxy_info: + author: "Rick Box - BBC R&D" + license: Apache2 + min_ansible_version: 2.0 + platforms: + - name: Ubuntu + versions: + - xenial +dependencies: [] diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/configure.yml b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/configure.yml new file mode 100644 index 00000000..75e82e29 --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/configure.yml @@ -0,0 +1,101 @@ +--- +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# module: tftpboot_configure/tasks/configure +# description: Configure tftpboot_configure + +- name: Create pxeboot directories + file: + path: "{{ atftpd_path }}/{{ item }}" + state: directory + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" + with_items: + - images + - pxelinux.cfg + +- name: Create pxeboot directories for distributions + file: + path: "{{ atftpd_path }}/images/{{ item }}/" + state: directory + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" + with_items: "{{ tftp_distro }}" + +- name: Create apache directories for preseed + file: + path: "{{ preseed_path }}" + state: directory + +- name: Create the preseed files + template: + src: "{{ item.preseed_file }}.j2" + dest: "{{ preseed_path }}/{{ item.preseed_file }}" + with_items: "{{ server_list }}" + +- name: Pull down boot kernel and initrd - create download directory -{{ tftp_distro }}- + file: + path: "/var/lib/netboot/{{ item }}" + mode: 0644 + state: directory + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" + with_items: "{{ tftp_distro }}" + +- name: Pull down boot kernel and initrd - download -"{{ tftp_distro }}"- releases -"{{ tftp_files }}"- files and place in /var/lib/netboot/ + get_url: + url: "http://{{ tftp_mirror }}/ubuntu/dists/{{ item[0] }}-updates/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/{{ item[1] }}" + dest: /var/lib/netboot/{{ item[0] }} + mode: 0644 + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" + with_nested: + - "{{ tftp_distro }}" + - "{{ tftp_files }}" + +- name: Create hard link to our boot images in the distribution folder + file: + src: "/var/lib/netboot/{{ item[0] }}/{{ item[1] }}" + dest: "{{ atftpd_path }}/images/{{ item[0] }}/{{ item[1] }}" + state: hard + with_nested: + - "{{ tftp_distro }}" + - "{{ tftp_files }}" + +- name: Copy pxe boot files + copy: + src: "{{ item }}" + dest: "{{ atftpd_path }}" + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" + with_items: + - memdisk + - menu.c32 + - pxelinux.0 + +- name: Create a template for each of our defined servers + template: + src: pxelinux.j2 + dest: "{{ tftp_source }}/01-{{ item.hwaddr | regex_replace(':', '-') }}" + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" + follow: yes + with_items: "{{ server_list }}" + when: item.distro is defined + +- name: Create our default template for menu + template: + src: default_pxelinux.j2 + dest: "{{ atftpd_path }}/pxelinux.cfg/default" + owner: "{{ atftp_user }}" + group: "{{ atftp_group }}" diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/main.yml b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/main.yml new file mode 100644 index 00000000..1ac97f9f --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/tasks/main.yml @@ -0,0 +1,17 @@ +--- +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# module: tftpboot_configure/tasks +# description: Install tftpboot_configure onto an Ubuntu 16.xx server + +- include: configure.yml diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/default_pxelinux.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/default_pxelinux.j2 new file mode 100644 index 00000000..48a31426 --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/default_pxelinux.j2 @@ -0,0 +1,19 @@ +DEFAULT menu +PROMPT 0 +MENU TITLE PXEBoot +TIMEOUT 3 +TOTALTIMEOUT 6000 +ONTIMEOUT local + +LABEL local + MENU LABEL (local) + MENU DEFAULT + LOCALBOOT -1 + +LABEL xenial + kernel /images/xenial/linux + MENU LABEL xenial + append initrd=/images/xenial/initrd.gz ksdevice=bootif netcfg/choose_interface=auto text auto-install/enable=true priority=critical url=http://{{ webserver_ip_address }}/{{ preseed_apache_url }}/xenial hostname=xenial domain=local.lan suite=xenial + ipappend 2 + +MENU end diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/pxelinux.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/pxelinux.j2 new file mode 100644 index 00000000..d842cc9a --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/pxelinux.j2 @@ -0,0 +1,8 @@ +default linux +prompt 0 +timeout 1 +label linux + kernel /images/{{ item.distro }}/linux + ipappend 2 + append initrd=/images/{{ item.distro }}/initrd.gz ksdevice=bootif netcfg/choose_interface=auto text auto-install/enable=true priority=critical url=http://{{ webserver_ip_address }}/{{ preseed_apache_url }}/{{ item.preseed_file }} hostname={{ item.name }} domain=local.lan suite={{ item.distro }} + diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-cinder.seed.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-cinder.seed.j2 new file mode 100644 index 00000000..f7ed3dad --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-cinder.seed.j2 @@ -0,0 +1,273 @@ +# +# Ubuntu Server 16.04 Preseed +# +# Usage: +# +# This Ubuntu Preseed file is a completely unattended install. +# +# References: +# +# https://help.ubuntu.com/16.04/installation-guide/example-preseed.txt +# http://www.claudiokuenzler.com/blog/513/debian-ubuntu-preseed-create-two-volume-groups-same-disk + +############# +# +# Kernel Options +# +############# + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +# d-i debian-installer/add-kernel-opts string $kernel_options_post + +############# +# +# Networking +# +############# + +d-i netcfg/choose_interface select {{ vm_net_iface }} +d-i netcfg/dhcp_timeout string 60 +#d-i netcfg/disable_autoconfig boolean true +#d-i netcfg/dhcp_failed note +#d-i netcfg/dhcp_options select Configure network manually + +# Static network configuration. +#d-i netcfg/get_ipaddress string 192.168.0.1 +#d-i netcfg/get_netmask string 255.255.255.0 +#d-i netcfg/get_gateway string 192.168.0.2 +#d-i netcfg/get_nameservers string 8.8.8.8 +#d-i netcfg/confirm_static boolean true + +d-i netcfg/get_hostname string cinder_node +d-i netcfg/get_domain string openstackci.local + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +############# +# +# Pre Install +# +############# + +# Command Line 1: This is necessary otherwise you will be prompted to umount /dev/{{ vm_disk_device }}. See Ubuntu bug #1347726. +d-i preseed/early_command string \ + umount /media || true + +############# +# +# Localization +# +############# + +d-i debian-installer/locale string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +d-i debian-installer/language string en + +############# +# +# Keyboard +# +############# + +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/variantcode string +d-i keyboard-configuration/layoutcode string us + +############# +# +# Mirror +# +############# + +d-i mirror/country string manual +{% if tftp_proxy != 'blank' %} +d-i mirror/http/proxy string {{ tftp_proxy }} +{% endif %} +d-i mirror/http/hostname string {{ tftp_mirror }} +d-i mirror/http/directory string /ubuntu + +############# +# +# Clock and Time Zone +# +############# + +# Controls whether to use NTP to set the clock during the install +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string {{ ntp_server }} + +# You may set this to any valid setting for $TZ; see the contents of +# /usr/share/zoneinfo/ for valid values. +d-i time/zone string US/Central + +# Controls whether or not the hardware clock is set to UTC. +d-i clock-setup/utc boolean true + +############# +# +# Partitioning +# +############# + +# If one of the disks that are going to be automatically partitioned +# contains an old LVM configuration, the user will normally receive a +# warning. This can be preseeded away... +d-i partman-lvm/device_remove_lvm boolean true + +# The same applies to pre-existing software RAID array: +d-i partman-md/device_remove_md boolean true + +# And the same goes for the confirmation to write the lvm partitions. +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true + +d-i partman-auto/method string lvm +d-i partman-auto/disk string /dev/{{ vm_disk_device }} + +# For LVM partitioning, you can select how much of the volume group to use +# for logical volumes. +d-i partman-auto-lvm/guided_size string max + +# This is used to auto-confirm its OK to use a partition without an FS +d-i partman-basicmethods/method_only boolean false + +d-i partman-auto/choose_recipe select custompartitioning +d-i partman-auto/expert_recipe string \ + custompartitioning :: \ + 512 1 512 ext2 \ + $primary{ } \ + $bootable{ } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext2 } \ + label{ boot } \ + mountpoint{ /boot } \ + . \ + 1024 1 100% ext4 \ + $primary{ } \ + method{ lvm } \ + device{ /dev/{{ vm_disk_device }}2 } \ + vg_name{ lxc } \ + . \ + 8192 1 8192 linux-swap \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swap00 } \ + method{ swap } format{ } \ + . \ + 51200 1 51200 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ root00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ root } \ + mountpoint{ / } \ + . \ + 76800 1 76800 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ openstack00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ openstack00 } \ + mountpoint{ /openstack } \ + . \ + 1024 1 1000000000 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ cinder00 } \ + method{ keep } \ + . \ + +# This makes partman automatically partition without confirmation, provided +# that you told it what to do using one of the methods above. +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +############# +# +# Packages +# +############# + +# Package selection +tasksel tasksel/first multiselect openssh-server + +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i pkgsel/include string bridge-utils ethtool ifenslave lvm2 openssh-server python2.7 vim vlan python-simplejson +# Policy for applying updates. May be "none" (no automatic updates), +# "unattended-upgrades" (install security updates automatically), or +# "landscape" (manage system with Landscape). +d-i pkgsel/update-policy select none + +# Some versions of the installer can report back on what software you have +# installed, and what software you use. The default is not to report back, +# but sending reports helps the project determine what software is most +# popular and include it on CDs. +popularity-contest popularity-contest/participate boolean false + +############# +# +# Users and Password +# +############# + +# Skip creation of a root account (normal user account will be able to +# use sudo). The default is false; preseed this to true if you want to set +# a root password. +d-i passwd/root-login boolean true + +# Alternatively, to skip creation of a normal user account. +d-i passwd/make-user boolean false + +# The installer will warn about weak passwords. If you are sure you know +# what you're doing and want to override it, uncomment this. +d-i user-setup/allow-password-weak boolean true + +# Root password, either in clear text +d-i passwd/root-password password {{ preseed_password }} +d-i passwd/root-password-again password {{ preseed_password }} + +############# +# +# Bootloader +# +############# + +# This is fairly safe to set, it makes grub install automatically to the MBR +# if no other operating system is detected on the machine. +d-i grub-installer/only_debian boolean true + +############# +# +# Post Install +# +############# + +d-i preseed/late_command string \ + wget --no-proxy http://{{ webserver_ip_address }}/files/xenial-sources.list -O /target/etc/apt/sources.list; \ + wget --no-proxy http://{{ webserver_ip_address }}/files/osa-$hostname-bridges.cfg -O /target/etc/network/interfaces.d/osa-$hostname-bridges.cfg; \ + sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \ + mkdir /target/root/.ssh; \ + chmod 0700 /target/root/.ssh; \ + echo "{{ ssh_key }}" >> /target/root/.ssh/authorized_keys; \ + vgcreate cinder-volumes /dev/mapper/lxc-cinder00; \ + killall.sh || true; \ + netcfg; \ + echo -e '#!/bin/sh\n\nif ! grep -q "^source.*cfg$" /etc/network/interfaces; then echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces; fi' > /target/etc/network/if-pre-up.d/multi-nic; \ + chmod +x /target/etc/network/if-pre-up.d/multi-nic + +############# +# +# Finish +# +############# + +# Reboot after the install is finished. +finish-install finish-install/reboot_in_progress note diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-infra.seed.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-infra.seed.j2 new file mode 100644 index 00000000..270cb79a --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-infra.seed.j2 @@ -0,0 +1,267 @@ +# +# Ubuntu Server 16.04 Preseed +# +# Usage: +# +# This Ubuntu Preseed file is a completely unattended install. +# +# References: +# +# https://help.ubuntu.com/16.04/installation-guide/example-preseed.txt +# http://www.claudiokuenzler.com/blog/513/debian-ubuntu-preseed-create-two-volume-groups-same-disk + +############# +# +# Kernel Options +# +############# + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +# d-i debian-installer/add-kernel-opts string $kernel_options_post + +############# +# +# Networking +# +############# + +d-i netcfg/choose_interface select {{ vm_net_iface }} +d-i netcfg/dhcp_timeout string 60 +#d-i netcfg/disable_autoconfig boolean true +#d-i netcfg/dhcp_failed note +#d-i netcfg/dhcp_options select Configure network manually + +# Static network configuration. +#d-i netcfg/get_ipaddress string 192.168.0.1 +#d-i netcfg/get_netmask string 255.255.255.0 +#d-i netcfg/get_gateway string 192.168.0.2 +#d-i netcfg/get_nameservers string 8.8.8.8 +#d-i netcfg/confirm_static boolean true + +d-i netcfg/get_hostname string infra_node +d-i netcfg/get_domain string openstackci.local + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +############# +# +# Pre Install +# +############# + +# Command Line 1: This is necessary otherwise you will be prompted to umount /dev/{{ vm_disk_device }}. See Ubuntu bug #1347726. +d-i preseed/early_command string \ + umount /media || true + +############# +# +# Localization +# +############# + +d-i debian-installer/locale string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +d-i debian-installer/language string en + +############# +# +# Keyboard +# +############# + +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/variantcode string +d-i keyboard-configuration/layoutcode string us + +############# +# +# Mirror +# +############# + +d-i mirror/country string manual +{% if tftp_proxy != 'blank' %} +d-i mirror/http/proxy string {{ tftp_proxy }} +{% endif %} +d-i mirror/http/hostname string {{ tftp_mirror }} +d-i mirror/http/directory string /ubuntu + +############# +# +# Clock and Time Zone +# +############# + +# Controls whether to use NTP to set the clock during the install +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string {{ ntp_server }} + +# You may set this to any valid setting for $TZ; see the contents of +# /usr/share/zoneinfo/ for valid values. +d-i time/zone string US/Central + +# Controls whether or not the hardware clock is set to UTC. +d-i clock-setup/utc boolean true + +############# +# +# Partitioning +# +############# + +# If one of the disks that are going to be automatically partitioned +# contains an old LVM configuration, the user will normally receive a +# warning. This can be preseeded away... +d-i partman-lvm/device_remove_lvm boolean true + +# The same applies to pre-existing software RAID array: +d-i partman-md/device_remove_md boolean true + +# And the same goes for the confirmation to write the lvm partitions. +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true + +d-i partman-auto/method string lvm +d-i partman-auto/disk string /dev/{{ vm_disk_device }} + +# For LVM partitioning, you can select how much of the volume group to use +# for logical volumes. +d-i partman-auto-lvm/guided_size string max + +# This is used to auto-confirm its OK to use a partition without an FS +d-i partman-basicmethods/method_only boolean false + +d-i partman-auto/choose_recipe select custompartitioning +d-i partman-auto/expert_recipe string \ + custompartitioning :: \ + 512 1 512 ext2 \ + $primary{ } \ + $bootable{ } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext2 } \ + label{ boot } \ + mountpoint{ /boot } \ + . \ + 1024 1 100% ext4 \ + $primary{ } \ + method{ lvm } \ + device{ /dev/{{ vm_disk_device }}2 } \ + vg_name{ lxc } \ + . \ + 8192 1 8192 linux-swap \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swap00 } \ + method{ swap } format{ } \ + . \ + 153600 1 153600 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ openstack00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ openstack00 } \ + mountpoint{ /openstack } \ + . \ + 1024 1 1000000000 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ root00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ root } \ + mountpoint{ / } \ + . \ + +# This makes partman automatically partition without confirmation, provided +# that you told it what to do using one of the methods above. +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +############# +# +# Packages +# +############# + +# Package selection +tasksel tasksel/first multiselect openssh-server + +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i pkgsel/include string bridge-utils ethtool ifenslave lvm2 openssh-server python2.7 vim vlan python-simplejson +# Policy for applying updates. May be "none" (no automatic updates), +# "unattended-upgrades" (install security updates automatically), or +# "landscape" (manage system with Landscape). +d-i pkgsel/update-policy select none + +# Some versions of the installer can report back on what software you have +# installed, and what software you use. The default is not to report back, +# but sending reports helps the project determine what software is most +# popular and include it on CDs. +popularity-contest popularity-contest/participate boolean false + +############# +# +# Users and Password +# +############# + +# Skip creation of a root account (normal user account will be able to +# use sudo). The default is false; preseed this to true if you want to set +# a root password. +d-i passwd/root-login boolean true + +# Alternatively, to skip creation of a normal user account. +d-i passwd/make-user boolean false + +# The installer will warn about weak passwords. If you are sure you know +# what you're doing and want to override it, uncomment this. +d-i user-setup/allow-password-weak boolean true + +# Root password, either in clear text +d-i passwd/root-password password {{ preseed_password }} +d-i passwd/root-password-again password {{ preseed_password }} + +############# +# +# Bootloader +# +############# + +# This is fairly safe to set, it makes grub install automatically to the MBR +# if no other operating system is detected on the machine. +d-i grub-installer/only_debian boolean true + +############# +# +# Post Install +# +############# + +d-i preseed/late_command string \ + wget --no-proxy http://{{ webserver_ip_address }}/files/xenial-sources.list -O /target/etc/apt/sources.list; \ + wget --no-proxy http://{{ webserver_ip_address }}/files/osa-$hostname-bridges.cfg -O /target/etc/network/interfaces.d/osa-$hostname-bridges.cfg; \ + sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \ + mkdir /target/root/.ssh; \ + chmod 0700 /target/root/.ssh; \ + echo "{{ ssh_key }}" >> /target/root/.ssh/authorized_keys; \ + killall.sh || true; \ + netcfg; \ + echo -e '#!/bin/sh\n\nif ! grep -q "^source.*cfg$" /etc/network/interfaces; then echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces; fi' > /target/etc/network/if-pre-up.d/multi-nic; \ + chmod +x /target/etc/network/if-pre-up.d/multi-nic + +############# +# +# Finish +# +############# + +# Reboot after the install is finished. +finish-install finish-install/reboot_in_progress note diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-logging.seed.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-logging.seed.j2 new file mode 100644 index 00000000..c9215147 --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-logging.seed.j2 @@ -0,0 +1,267 @@ +# +# Ubuntu Server 16.04 Preseed +# +# Usage: +# +# This Ubuntu Preseed file is a completely unattended install. +# +# References: +# +# https://help.ubuntu.com/16.04/installation-guide/example-preseed.txt +# http://www.claudiokuenzler.com/blog/513/debian-ubuntu-preseed-create-two-volume-groups-same-disk + +############# +# +# Kernel Options +# +############# + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +# d-i debian-installer/add-kernel-opts string $kernel_options_post + +############# +# +# Networking +# +############# + +d-i netcfg/choose_interface select {{ vm_net_iface }} +d-i netcfg/dhcp_timeout string 60 +#d-i netcfg/disable_autoconfig boolean true +#d-i netcfg/dhcp_failed note +#d-i netcfg/dhcp_options select Configure network manually + +# Static network configuration. +#d-i netcfg/get_ipaddress string 192.168.0.1 +#d-i netcfg/get_netmask string 255.255.255.0 +#d-i netcfg/get_gateway string 192.168.0.2 +#d-i netcfg/get_nameservers string 8.8.8.8 +#d-i netcfg/confirm_static boolean true + +d-i netcfg/get_hostname string logging_node +d-i netcfg/get_domain string openstackci.local + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +############# +# +# Pre Install +# +############# + +# Command Line 1: This is necessary otherwise you will be prompted to umount /dev/{{ vm_disk_device }}. See Ubuntu bug #1347726. +d-i preseed/early_command string \ + umount /media || true + +############# +# +# Localization +# +############# + +d-i debian-installer/locale string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +d-i debian-installer/language string en + +############# +# +# Keyboard +# +############# + +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/variantcode string +d-i keyboard-configuration/layoutcode string us + +############# +# +# Mirror +# +############# + +d-i mirror/country string manual +{% if tftp_proxy != 'blank' %} +d-i mirror/http/proxy string {{ tftp_proxy }} +{% endif %} +d-i mirror/http/hostname string {{ tftp_mirror }} +d-i mirror/http/directory string /ubuntu + +############# +# +# Clock and Time Zone +# +############# + +# Controls whether to use NTP to set the clock during the install +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string {{ ntp_server }} + +# You may set this to any valid setting for $TZ; see the contents of +# /usr/share/zoneinfo/ for valid values. +d-i time/zone string US/Central + +# Controls whether or not the hardware clock is set to UTC. +d-i clock-setup/utc boolean true + +############# +# +# Partitioning +# +############# + +# If one of the disks that are going to be automatically partitioned +# contains an old LVM configuration, the user will normally receive a +# warning. This can be preseeded away... +d-i partman-lvm/device_remove_lvm boolean true + +# The same applies to pre-existing software RAID array: +d-i partman-md/device_remove_md boolean true + +# And the same goes for the confirmation to write the lvm partitions. +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true + +d-i partman-auto/method string lvm +d-i partman-auto/disk string /dev/{{ vm_disk_device }} + +# For LVM partitioning, you can select how much of the volume group to use +# for logical volumes. +d-i partman-auto-lvm/guided_size string max + +# This is used to auto-confirm its OK to use a partition without an FS +d-i partman-basicmethods/method_only boolean false + +d-i partman-auto/choose_recipe select custompartitioning +d-i partman-auto/expert_recipe string \ + custompartitioning :: \ + 512 1 512 ext2 \ + $primary{ } \ + $bootable{ } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext2 } \ + label{ boot } \ + mountpoint{ /boot } \ + . \ + 1024 1 100% ext4 \ + $primary{ } \ + method{ lvm } \ + device{ /dev/{{ vm_disk_device }}2 } \ + vg_name{ lxc } \ + . \ + 8192 1 8192 linux-swap \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swap00 } \ + method{ swap } format{ } \ + . \ + 51200 1 51200 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ root00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ root } \ + mountpoint{ / } \ + . \ + 1024 1 1000000000 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ openstack00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ openstack00 } \ + mountpoint{ /openstack } \ + . \ + +# This makes partman automatically partition without confirmation, provided +# that you told it what to do using one of the methods above. +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +############# +# +# Packages +# +############# + +# Package selection +tasksel tasksel/first multiselect openssh-server + +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i pkgsel/include string bridge-utils ethtool ifenslave lvm2 openssh-server python2.7 vim vlan python-simplejson +# Policy for applying updates. May be "none" (no automatic updates), +# "unattended-upgrades" (install security updates automatically), or +# "landscape" (manage system with Landscape). +d-i pkgsel/update-policy select none + +# Some versions of the installer can report back on what software you have +# installed, and what software you use. The default is not to report back, +# but sending reports helps the project determine what software is most +# popular and include it on CDs. +popularity-contest popularity-contest/participate boolean false + +############# +# +# Users and Password +# +############# + +# Skip creation of a root account (normal user account will be able to +# use sudo). The default is false; preseed this to true if you want to set +# a root password. +d-i passwd/root-login boolean true + +# Alternatively, to skip creation of a normal user account. +d-i passwd/make-user boolean false + +# The installer will warn about weak passwords. If you are sure you know +# what you're doing and want to override it, uncomment this. +d-i user-setup/allow-password-weak boolean true + +# Root password, either in clear text +d-i passwd/root-password password {{ preseed_password }} +d-i passwd/root-password-again password {{ preseed_password }} + +############# +# +# Bootloader +# +############# + +# This is fairly safe to set, it makes grub install automatically to the MBR +# if no other operating system is detected on the machine. +d-i grub-installer/only_debian boolean true + +############# +# +# Post Install +# +############# + +d-i preseed/late_command string \ + wget --no-proxy http://{{ webserver_ip_address }}/files/xenial-sources.list -O /target/etc/apt/sources.list; \ + wget --no-proxy http://{{ webserver_ip_address }}/files/osa-$hostname-bridges.cfg -O /target/etc/network/interfaces.d/osa-$hostname-bridges.cfg; \ + sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \ + mkdir /target/root/.ssh; \ + chmod 0700 /target/root/.ssh; \ + echo "{{ ssh_key }}" >> /target/root/.ssh/authorized_keys; \ + killall.sh || true; \ + netcfg; \ + echo -e '#!/bin/sh\n\nif ! grep -q "^source.*cfg$" /etc/network/interfaces; then echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces; fi' > /target/etc/network/if-pre-up.d/multi-nic; \ + chmod +x /target/etc/network/if-pre-up.d/multi-nic + +############# +# +# Finish +# +############# + +# Reboot after the install is finished. +finish-install finish-install/reboot_in_progress note diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-network.seed.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-network.seed.j2 new file mode 100644 index 00000000..9c0596d1 --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-network.seed.j2 @@ -0,0 +1,267 @@ +# +# Ubuntu Server 16.04 Preseed +# +# Usage: +# +# This Ubuntu Preseed file is a completely unattended install. +# +# References: +# +# https://help.ubuntu.com/16.04/installation-guide/example-preseed.txt +# http://www.claudiokuenzler.com/blog/513/debian-ubuntu-preseed-create-two-volume-groups-same-disk + +############# +# +# Kernel Options +# +############# + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +# d-i debian-installer/add-kernel-opts string $kernel_options_post + +############# +# +# Networking +# +############# + +d-i netcfg/choose_interface select {{ vm_net_iface }} +d-i netcfg/dhcp_timeout string 60 +#d-i netcfg/disable_autoconfig boolean true +#d-i netcfg/dhcp_failed note +#d-i netcfg/dhcp_options select Configure network manually + +# Static network configuration. +#d-i netcfg/get_ipaddress string 192.168.0.1 +#d-i netcfg/get_netmask string 255.255.255.0 +#d-i netcfg/get_gateway string 192.168.0.2 +#d-i netcfg/get_nameservers string 8.8.8.8 +#d-i netcfg/confirm_static boolean true + +d-i netcfg/get_hostname string network_node +d-i netcfg/get_domain string openstackci.local + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +############# +# +# Pre Install +# +############# + +# Command Line 1: This is necessary otherwise you will be prompted to umount /dev/{{ vm_disk_device }}. See Ubuntu bug #1347726. +d-i preseed/early_command string \ + umount /media || true + +############# +# +# Localization +# +############# + +d-i debian-installer/locale string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +d-i debian-installer/language string en + +############# +# +# Keyboard +# +############# + +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/variantcode string +d-i keyboard-configuration/layoutcode string us + +############# +# +# Mirror +# +############# + +d-i mirror/country string manual +{% if tftp_proxy != 'blank' %} +d-i mirror/http/proxy string {{ tftp_proxy }} +{% endif %} +d-i mirror/http/hostname string {{ tftp_mirror }} +d-i mirror/http/directory string /ubuntu + +############# +# +# Clock and Time Zone +# +############# + +# Controls whether to use NTP to set the clock during the install +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string {{ ntp_server }} + +# You may set this to any valid setting for $TZ; see the contents of +# /usr/share/zoneinfo/ for valid values. +d-i time/zone string US/Central + +# Controls whether or not the hardware clock is set to UTC. +d-i clock-setup/utc boolean true + +############# +# +# Partitioning +# +############# + +# If one of the disks that are going to be automatically partitioned +# contains an old LVM configuration, the user will normally receive a +# warning. This can be preseeded away... +d-i partman-lvm/device_remove_lvm boolean true + +# The same applies to pre-existing software RAID array: +d-i partman-md/device_remove_md boolean true + +# And the same goes for the confirmation to write the lvm partitions. +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true + +d-i partman-auto/method string lvm +d-i partman-auto/disk string /dev/{{ vm_disk_device }} + +# For LVM partitioning, you can select how much of the volume group to use +# for logical volumes. +d-i partman-auto-lvm/guided_size string max + +# This is used to auto-confirm its OK to use a partition without an FS +d-i partman-basicmethods/method_only boolean false + +d-i partman-auto/choose_recipe select custompartitioning +d-i partman-auto/expert_recipe string \ + custompartitioning :: \ + 512 1 512 ext2 \ + $primary{ } \ + $bootable{ } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext2 } \ + label{ boot } \ + mountpoint{ /boot } \ + . \ + 1024 1 100% ext4 \ + $primary{ } \ + method{ lvm } \ + device{ /dev/{{ vm_disk_device }}2 } \ + vg_name{ lxc } \ + . \ + 8192 1 8192 linux-swap \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swap00 } \ + method{ swap } format{ } \ + . \ + 153600 1 153600 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ openstack00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ openstack00 } \ + mountpoint{ /openstack } \ + . \ + 1024 1 1000000000 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ root00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ root } \ + mountpoint{ / } \ + . \ + +# This makes partman automatically partition without confirmation, provided +# that you told it what to do using one of the methods above. +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +############# +# +# Packages +# +############# + +# Package selection +tasksel tasksel/first multiselect openssh-server + +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i pkgsel/include string bridge-utils ethtool ifenslave lvm2 openssh-server python2.7 vim vlan python-simplejson +# Policy for applying updates. May be "none" (no automatic updates), +# "unattended-upgrades" (install security updates automatically), or +# "landscape" (manage system with Landscape). +d-i pkgsel/update-policy select none + +# Some versions of the installer can report back on what software you have +# installed, and what software you use. The default is not to report back, +# but sending reports helps the project determine what software is most +# popular and include it on CDs. +popularity-contest popularity-contest/participate boolean false + +############# +# +# Users and Password +# +############# + +# Skip creation of a root account (normal user account will be able to +# use sudo). The default is false; preseed this to true if you want to set +# a root password. +d-i passwd/root-login boolean true + +# Alternatively, to skip creation of a normal user account. +d-i passwd/make-user boolean false + +# The installer will warn about weak passwords. If you are sure you know +# what you're doing and want to override it, uncomment this. +d-i user-setup/allow-password-weak boolean true + +# Root password, either in clear text +d-i passwd/root-password password {{ preseed_password }} +d-i passwd/root-password-again password {{ preseed_password }} + +############# +# +# Bootloader +# +############# + +# This is fairly safe to set, it makes grub install automatically to the MBR +# if no other operating system is detected on the machine. +d-i grub-installer/only_debian boolean true + +############# +# +# Post Install +# +############# + +d-i preseed/late_command string \ + wget --no-proxy http://{{ webserver_ip_address }}/files/xenial-sources.list -O /target/etc/apt/sources.list; \ + wget --no-proxy http://{{ webserver_ip_address }}/files/osa-$hostname-bridges.cfg -O /target/etc/network/interfaces.d/osa-$hostname-bridges.cfg; \ + sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \ + mkdir /target/root/.ssh; \ + chmod 0700 /target/root/.ssh; \ + echo "{{ ssh_key }}" >> /target/root/.ssh/authorized_keys; \ + killall.sh || true; \ + netcfg; \ + echo -e '#!/bin/sh\n\nif ! grep -q "^source.*cfg$" /etc/network/interfaces; then echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces; fi' > /target/etc/network/if-pre-up.d/multi-nic; \ + chmod +x /target/etc/network/if-pre-up.d/multi-nic + +############# +# +# Finish +# +############# + +# Reboot after the install is finished. +finish-install finish-install/reboot_in_progress note diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-nova_compute.seed.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-nova_compute.seed.j2 new file mode 100644 index 00000000..7f58cee9 --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-nova_compute.seed.j2 @@ -0,0 +1,275 @@ +# +# Ubuntu Server 16.04 Preseed +# +# Usage: +# +# This Ubuntu Preseed file is a completely unattended install. +# +# References: +# +# https://help.ubuntu.com/16.04/installation-guide/example-preseed.txt +# http://www.claudiokuenzler.com/blog/513/debian-ubuntu-preseed-create-two-volume-groups-same-disk + +############# +# +# Kernel Options +# +############# + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +# d-i debian-installer/add-kernel-opts string $kernel_options_post + +############# +# +# Networking +# +############# + +d-i netcfg/choose_interface select {{ vm_net_iface }} +d-i netcfg/dhcp_timeout string 60 +#d-i netcfg/disable_autoconfig boolean true +#d-i netcfg/dhcp_failed note +#d-i netcfg/dhcp_options select Configure network manually + +# Static network configuration. +#d-i netcfg/get_ipaddress string 192.168.0.1 +#d-i netcfg/get_netmask string 255.255.255.0 +#d-i netcfg/get_gateway string 192.168.0.2 +#d-i netcfg/get_nameservers string 8.8.8.8 +#d-i netcfg/confirm_static boolean true + +d-i netcfg/get_hostname string nova_node +d-i netcfg/get_domain string openstackci.local + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +############# +# +# Pre Install +# +############# + +# Command Line 1: This is necessary otherwise you will be prompted to umount /dev/{{ vm_disk_device }}. See Ubuntu bug #1347726. +d-i preseed/early_command string \ + umount /media || true + +############# +# +# Localization +# +############# + +d-i debian-installer/locale string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +d-i debian-installer/language string en + +############# +# +# Keyboard +# +############# + +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/variantcode string +d-i keyboard-configuration/layoutcode string us + +############# +# +# Mirror +# +############# + +d-i mirror/country string manual +{% if tftp_proxy != 'blank' %} +d-i mirror/http/proxy string {{ tftp_proxy }} +{% endif %} +d-i mirror/http/hostname string {{ tftp_mirror }} +d-i mirror/http/directory string /ubuntu + +############# +# +# Clock and Time Zone +# +############# + +# Controls whether to use NTP to set the clock during the install +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string {{ ntp_server }} + +# You may set this to any valid setting for $TZ; see the contents of +# /usr/share/zoneinfo/ for valid values. +d-i time/zone string US/Central + +# Controls whether or not the hardware clock is set to UTC. +d-i clock-setup/utc boolean true + +############# +# +# Partitioning +# +############# + +# If one of the disks that are going to be automatically partitioned +# contains an old LVM configuration, the user will normally receive a +# warning. This can be preseeded away... +d-i partman-lvm/device_remove_lvm boolean true + +# The same applies to pre-existing software RAID array: +d-i partman-md/device_remove_md boolean true + +# And the same goes for the confirmation to write the lvm partitions. +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true + +d-i partman-auto/method string lvm +d-i partman-auto/disk string /dev/{{ vm_disk_device }} + +# For LVM partitioning, you can select how much of the volume group to use +# for logical volumes. +d-i partman-auto-lvm/guided_size string max + +# This is used to auto-confirm its OK to use a partition without an FS +d-i partman-basicmethods/method_only boolean false + +d-i partman-auto/choose_recipe select custompartitioning +d-i partman-auto/expert_recipe string \ + custompartitioning :: \ + 512 1 512 ext2 \ + $primary{ } \ + $bootable{ } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext2 } \ + label{ boot } \ + mountpoint{ /boot } \ + . \ + 1024 1 100% ext4 \ + $primary{ } \ + method{ lvm } \ + device{ /dev/{{ vm_disk_device }}2 } \ + vg_name{ lxc } \ + . \ + 8192 1 8192 linux-swap \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swap00 } \ + method{ swap } format{ } \ + . \ + 51200 1 51200 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ root00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ root } \ + mountpoint{ / } \ + . \ + 76800 1 76800 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ openstack00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ openstack00 } \ + mountpoint{ /openstack } \ + . \ + 1024 1 1000000000 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ nova00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ nova } \ + mountpoint{ /var/lib/nova } \ + . \ + +# This makes partman automatically partition without confirmation, provided +# that you told it what to do using one of the methods above. +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +############# +# +# Packages +# +############# + +# Package selection +tasksel tasksel/first multiselect openssh-server + +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i pkgsel/include string bridge-utils ethtool ifenslave lvm2 openssh-server python2.7 vim vlan python-simplejson +# Policy for applying updates. May be "none" (no automatic updates), +# "unattended-upgrades" (install security updates automatically), or +# "landscape" (manage system with Landscape). +d-i pkgsel/update-policy select none + +# Some versions of the installer can report back on what software you have +# installed, and what software you use. The default is not to report back, +# but sending reports helps the project determine what software is most +# popular and include it on CDs. +popularity-contest popularity-contest/participate boolean false + +############# +# +# Users and Password +# +############# + +# Skip creation of a root account (normal user account will be able to +# use sudo). The default is false; preseed this to true if you want to set +# a root password. +d-i passwd/root-login boolean true + +# Alternatively, to skip creation of a normal user account. +d-i passwd/make-user boolean false + +# The installer will warn about weak passwords. If you are sure you know +# what you're doing and want to override it, uncomment this. +d-i user-setup/allow-password-weak boolean true + +# Root password, either in clear text +d-i passwd/root-password password {{ preseed_password }} +d-i passwd/root-password-again password {{ preseed_password }} + +############# +# +# Bootloader +# +############# + +# This is fairly safe to set, it makes grub install automatically to the MBR +# if no other operating system is detected on the machine. +d-i grub-installer/only_debian boolean true + +############# +# +# Post Install +# +############# + +d-i preseed/late_command string \ + wget --no-proxy http://{{ webserver_ip_address }}/files/xenial-sources.list -O /target/etc/apt/sources.list; \ + wget --no-proxy http://{{ webserver_ip_address }}/files/osa-$hostname-bridges.cfg -O /target/etc/network/interfaces.d/osa-$hostname-bridges.cfg; \ + sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \ + mkdir /target/root/.ssh; \ + chmod 0700 /target/root/.ssh; \ + echo "{{ ssh_key }}" >> /target/root/.ssh/authorized_keys; \ + killall.sh || true; \ + netcfg; \ + echo -e '#!/bin/sh\n\nif ! grep -q "^source.*cfg$" /etc/network/interfaces; then echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces; fi' > /target/etc/network/if-pre-up.d/multi-nic; \ + chmod +x /target/etc/network/if-pre-up.d/multi-nic + +############# +# +# Finish +# +############# + +# Reboot after the install is finished. +finish-install finish-install/reboot_in_progress note diff --git a/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-swift.seed.j2 b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-swift.seed.j2 new file mode 100644 index 00000000..8288b74a --- /dev/null +++ b/multi-node-aio-xenial-ansible/roles/tftpboot_configure/templates/ubuntu-server-16.04-unattended-swift.seed.j2 @@ -0,0 +1,291 @@ +# +# Ubuntu Server 16.04 Preseed +# +# Usage: +# +# This Ubuntu Preseed file is a completely unattended install. +# +# References: +# +# https://help.ubuntu.com/16.04/installation-guide/example-preseed.txt +# http://www.claudiokuenzler.com/blog/513/debian-ubuntu-preseed-create-two-volume-groups-same-disk + +############# +# +# Kernel Options +# +############# + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +# d-i debian-installer/add-kernel-opts string $kernel_options_post + +############# +# +# Networking +# +############# + +d-i netcfg/choose_interface select {{ vm_net_iface }} +d-i netcfg/dhcp_timeout string 60 +#d-i netcfg/disable_autoconfig boolean true +#d-i netcfg/dhcp_failed note +#d-i netcfg/dhcp_options select Configure network manually + +# Static network configuration. +#d-i netcfg/get_ipaddress string 192.168.0.1 +#d-i netcfg/get_netmask string 255.255.255.0 +#d-i netcfg/get_gateway string 192.168.0.2 +#d-i netcfg/get_nameservers string 8.8.8.8 +#d-i netcfg/confirm_static boolean true + +d-i netcfg/get_hostname string swift_node +d-i netcfg/get_domain string openstackci.local + +# Disable that annoying WEP key dialog. +d-i netcfg/wireless_wep string + +############# +# +# Pre Install +# +############# + +# Command Line 1: This is necessary otherwise you will be prompted to umount /dev/{{ vm_disk_device }}. See Ubuntu bug #1347726. +d-i preseed/early_command string \ + umount /media || true + +############# +# +# Localization +# +############# + +d-i debian-installer/locale string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +d-i debian-installer/language string en + +############# +# +# Keyboard +# +############# + +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/variantcode string +d-i keyboard-configuration/layoutcode string us + +############# +# +# Mirror +# +############# + +d-i mirror/country string manual +{% if tftp_proxy != 'blank' %} +d-i mirror/http/proxy string {{ tftp_proxy }} +{% endif %} +d-i mirror/http/hostname string {{ tftp_mirror }} +d-i mirror/http/directory string /ubuntu + +############# +# +# Clock and Time Zone +# +############# + +# Controls whether to use NTP to set the clock during the install +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string {{ ntp_server }} + +# You may set this to any valid setting for $TZ; see the contents of +# /usr/share/zoneinfo/ for valid values. +d-i time/zone string US/Central + +# Controls whether or not the hardware clock is set to UTC. +d-i clock-setup/utc boolean true + +############# +# +# Partitioning +# +############# + +# If one of the disks that are going to be automatically partitioned +# contains an old LVM configuration, the user will normally receive a +# warning. This can be preseeded away... +d-i partman-lvm/device_remove_lvm boolean true + +# The same applies to pre-existing software RAID array: +d-i partman-md/device_remove_md boolean true + +# And the same goes for the confirmation to write the lvm partitions. +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true + +d-i partman-auto/method string lvm +d-i partman-auto/disk string /dev/{{ vm_disk_device }} + +# For LVM partitioning, you can select how much of the volume group to use +# for logical volumes. +d-i partman-auto-lvm/guided_size string max + +# This is used to auto-confirm its OK to use a partition without an FS +d-i partman-basicmethods/method_only boolean false + +d-i partman-auto/choose_recipe select custompartitioning +d-i partman-auto/expert_recipe string \ + custompartitioning :: \ + 512 1 512 ext2 \ + $primary{ } \ + $bootable{ } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext2 } \ + label{ boot } \ + mountpoint{ /boot } \ + . \ + 1024 1 100% ext4 \ + $primary{ } \ + method{ lvm } \ + device{ /dev/{{ vm_disk_device }}2 } \ + vg_name{ lxc } \ + . \ + 8192 1 8192 linux-swap \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swap00 } \ + method{ swap } format{ } \ + . \ + 51200 1 51200 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ root00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ root } \ + mountpoint{ / } \ + . \ + 20480 1 20480 xfs \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swift01 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ xfs } \ + label{ openstack00 } \ + mountpoint{ /srv/disk1 } \ + . \ + 20480 1 20480 xfs \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swift02 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ xfs } \ + label{ openstack00 } \ + mountpoint{ /srv/disk2 } \ + . \ + 20480 1 20480 xfs \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ swift03 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ xfs } \ + label{ openstack00 } \ + mountpoint{ /srv/disk3 } \ + . \ + 76800 1 76800 ext4 \ + $lvmok{ } in_vg{ lxc } \ + lv_name{ openstack00 } \ + method{ format } format{ } \ + use_filesystem{ } filesystem{ ext4 } \ + label{ openstack00 } \ + mountpoint{ /openstack } \ + . \ + +# This makes partman automatically partition without confirmation, provided +# that you told it what to do using one of the methods above. +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +############# +# +# Packages +# +############# + +# Package selection +tasksel tasksel/first multiselect openssh-server + +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i pkgsel/include string bridge-utils ethtool ifenslave lvm2 openssh-server python2.7 vim vlan python-simplejson xfsprogs +# Policy for applying updates. May be "none" (no automatic updates), +# "unattended-upgrades" (install security updates automatically), or +# "landscape" (manage system with Landscape). +d-i pkgsel/update-policy select none + +# Some versions of the installer can report back on what software you have +# installed, and what software you use. The default is not to report back, +# but sending reports helps the project determine what software is most +# popular and include it on CDs. +popularity-contest popularity-contest/participate boolean false + +############# +# +# Users and Password +# +############# + +# Skip creation of a root account (normal user account will be able to +# use sudo). The default is false; preseed this to true if you want to set +# a root password. +d-i passwd/root-login boolean true + +# Alternatively, to skip creation of a normal user account. +d-i passwd/make-user boolean false + +# The installer will warn about weak passwords. If you are sure you know +# what you're doing and want to override it, uncomment this. +d-i user-setup/allow-password-weak boolean true + +# Root password, either in clear text +d-i passwd/root-password password {{ preseed_password }} +d-i passwd/root-password-again password {{ preseed_password }} + +############# +# +# Bootloader +# +############# + +# This is fairly safe to set, it makes grub install automatically to the MBR +# if no other operating system is detected on the machine. +d-i grub-installer/only_debian boolean true + +############# +# +# Post Install +# +############# + +d-i preseed/late_command string \ + wget --no-proxy http://{{ webserver_ip_address }}/files/xenial-sources.list -O /target/etc/apt/sources.list; \ + wget --no-proxy http://{{ webserver_ip_address }}/files/osa-$hostname-bridges.cfg -O /target/etc/network/interfaces.d/osa-$hostname-bridges.cfg; \ + sed -i '/PermitRootLogin / s/ .*/ yes/' /target/etc/ssh/sshd_config; \ + mkdir /target/root/.ssh; \ + chmod 0700 /target/root/.ssh; \ + echo "{{ ssh_key }}" >> /target/root/.ssh/authorized_keys; \ + killall.sh || true; \ + netcfg; \ + echo -e '#!/bin/sh\n\nif ! grep -q "^source.*cfg$" /etc/network/interfaces; then echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces; fi' > /target/etc/network/if-pre-up.d/multi-nic; \ + chmod +x /target/etc/network/if-pre-up.d/multi-nic + +############# +# +# Finish +# +############# + +# Reboot after the install is finished. +finish-install finish-install/reboot_in_progress note