
The original mnaio was built using a lot of bash and was tailored specifically for ubuntu 14.04. The new mnaio was built using a mix of bash and ansible and was tailored specifically for ubuntu 16.04. This patch takes the two code bases and combines the best things from each method and wraps it up into a single code path all written using ansible playbooks and basic variables. While underlying system has changed the bash environment variable syntax for overrides remains the same. This allows users to continue with what has become their normal work-flow while leveraging the new structure and capabilities. High level overview: * The general performance of the VMs running within the MNAIO will now be a lot better. Before the VMs were built within QCOW2 containers, while this was flexible and portable it was slower. The new capabilities will use RAW logical volumes and native IO. * New repo management starts with preseeds and allows the user to pin to specific repositories without having to worry about flipping them post build. * CPU overhead will be a lot less. The old VM system used an un-reasonable number of processors per VM which directly translated to sockets. The new system will use cores and a single socket allowing for generally better VM performance with a lot less overhead and resource contention on the host. * Memory consumption has been greatly reduced. Each VM is now following the memory restrictions we'd find in the gate, as a MAX. Most of the VMs are using 1 - 2 GiB of RAM which should be more than enough for our purposes. Overall the deployment process is simpler and more flexible and will work on both trusty and xenial out of the box with the hope to bring centos7 and suse into the fold some time in the future. Change-Id: Idc8924452c481b08fd3b9362efa32d10d1b8f707 Signed-off-by: Kevin Carter <kevin.carter@rackspace.com>
297 lines
8.9 KiB
YAML
297 lines
8.9 KiB
YAML
---
|
|
# Copyright 2017, Rackspace US, Inc.
|
|
#
|
|
# 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 witing, 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: Gather facts
|
|
hosts: pxe_hosts
|
|
gather_facts: "{{ gather_facts | default(true) }}"
|
|
pre_tasks:
|
|
- name: Gather variables for each operating system
|
|
include_vars: "{{ item }}"
|
|
with_first_found:
|
|
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_version | lower }}.yml"
|
|
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
|
|
- "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
|
|
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}.yml"
|
|
- "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}.yml"
|
|
tags:
|
|
- always
|
|
|
|
- name: Install host distro packages
|
|
package:
|
|
pkg: "{{ item }}"
|
|
state: "latest"
|
|
update_cache: yes
|
|
cache_valid_time: 600
|
|
with_items: "{{ mnaio_pxe_distro_packages }}"
|
|
|
|
- name: Create base directories
|
|
file:
|
|
path: "{{ item }}"
|
|
state: directory
|
|
owner: "root"
|
|
group: "root"
|
|
mode: "0755"
|
|
with_items:
|
|
- /var/www/pxe
|
|
- /var/www/pxe/images
|
|
- /var/www/pxe/iso
|
|
- /var/www/pxe/networking
|
|
- /var/www/pxe/scripts
|
|
- /var/www/pxe/templates
|
|
- /var/lib/tftpboot
|
|
- /var/lib/tftpboot/boot-screens
|
|
- /var/lib/tftpboot/preseed
|
|
- /var/lib/tftpboot/pxelinux.cfg
|
|
|
|
- name: Get root public key
|
|
command: cat /root/.ssh/id_rsa.pub
|
|
register: public_key_get
|
|
changed_when: false
|
|
|
|
- name: Set key facts
|
|
set_fact:
|
|
tftp_ssh_key: "{{ public_key_get.stdout }}"
|
|
|
|
tasks:
|
|
- name: Drop NGINX config
|
|
copy:
|
|
src: "pxe/sites-enabled.default"
|
|
dest: /etc/nginx/sites-enabled/default
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
notify:
|
|
- restart nginx
|
|
|
|
- name: Drop tftp-hpa configs
|
|
copy:
|
|
src: "pxe/tftp/tftp-hpa"
|
|
dest: /etc/default/tftpd-hpa
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
notify:
|
|
- restart tftp-hpa
|
|
|
|
- name: Drop inetd configs
|
|
copy:
|
|
src: "pxe/tftp/inetd.conf"
|
|
dest: /etc/default/tftpd-hpa
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
notify:
|
|
- restart tftp-hpa
|
|
|
|
- name: Download image iso(s)
|
|
get_url:
|
|
url: "{{ item.value.image_iso_url }}"
|
|
dest: "/var/www/pxe/iso/{{ item.value.image_name }}"
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Remove image directory if it exists
|
|
file:
|
|
path: "/var/www/pxe/images/{{ item.value.image_short_name }}"
|
|
state: absent
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Create image directory if it exists
|
|
file:
|
|
path: "/var/www/pxe/images/{{ item.value.image_short_name }}"
|
|
state: directory
|
|
owner: "root"
|
|
group: "root"
|
|
mode: "0755"
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Extract ISO(s) contents
|
|
command: "7z x /var/www/pxe/iso/{{ item.value.image_name }}"
|
|
args:
|
|
chdir: "/var/www/pxe/images/{{ item.value.image_short_name }}"
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Download pxelinux
|
|
get_url:
|
|
url: "{{ pxelinux_url }}"
|
|
dest: "/var/www/pxe/{{ pxelinux_name }}"
|
|
tmp_dest: /tmp/
|
|
|
|
- name: Remove image directory if it exists
|
|
file:
|
|
path: "/var/www/pxe/{{ pxelinux_short_name }}"
|
|
state: absent
|
|
|
|
- name: Extract pxelinux contents
|
|
command: "tar -xf /var/www/pxe/{{ pxelinux_name }}"
|
|
args:
|
|
chdir: "/var/www/pxe"
|
|
|
|
- name: Drop pxelinux.cfg default menu
|
|
copy:
|
|
src: "pxe/tftp/pxelinux.cfg.default"
|
|
dest: "{{ item }}"
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_items:
|
|
- /var/lib/tftpboot/pxelinux.cfg/default
|
|
- /var/lib/tftpboot/boot-screens/syslinux.cfg
|
|
|
|
# These links are using the shell command because the file module does not create hard links
|
|
- name: Create hard links
|
|
shell: |
|
|
ln -f /var/www/pxe/{{ pxelinux_short_name }}/bios/com32/elflink/ldlinux/ldlinux.c32 /var/lib/tftpboot/ldlinux.c32
|
|
ln -f /var/www/pxe/{{ pxelinux_short_name }}/bios/core/pxelinux.0 /var/lib/tftpboot/pxelinux.0
|
|
ln -f /var/www/pxe/{{ pxelinux_short_name }}/bios/com32/lib/libcom32.c32 /var/lib/tftpboot/boot-screens/libcom32.c32
|
|
ln -f /var/www/pxe/{{ pxelinux_short_name }}/bios/com32/libutil/libutil.c32 /var/lib/tftpboot/boot-screens/libutil.c32
|
|
ln -f /var/www/pxe/{{ pxelinux_short_name }}/bios/com32/menu/vesamenu.c32 /var/lib/tftpboot/boot-screens/vesamenu.c32
|
|
|
|
- name: Drop boot-screens default menu
|
|
template:
|
|
src: "pxe/tftp/menu.cfg.j2"
|
|
dest: /var/lib/tftpboot/boot-screens/menu.cfg
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
tags:
|
|
- boot-menu
|
|
|
|
- name: Drop tftp-hpa configs
|
|
template:
|
|
src: "pxe/tftp/tftp-hpa"
|
|
dest: /etc/default/tftpd-hpa
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
notify:
|
|
- restart tftp-hpa
|
|
|
|
- name: network scripts for pxe
|
|
template:
|
|
src: "pxe/{{ ansible_os_family | lower }}/{{ item.src }}"
|
|
dest: /var/www/pxe/{{ item.dir }}/{{ item.dest }}
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_items:
|
|
- src: basic-interface.cfg
|
|
dest: basic-interface.cfg
|
|
dir: networking
|
|
- src: mnaio-bridges.cfg.j2
|
|
dest: mnaio-bridges.cfg
|
|
dir: networking
|
|
- src: mnaio-post-install-script.sh.j2
|
|
dest: mnaio-post-install-script.sh
|
|
dir: scripts
|
|
- src: vm-post-install-script.sh.j2
|
|
dest: vm-post-install-script.sh
|
|
dir: scripts
|
|
|
|
- name: network scripts for servers
|
|
template:
|
|
src: "pxe/{{ ansible_os_family | lower }}/vm-bridges.cfg.j2"
|
|
dest: /var/www/pxe/networking/{{ item.server_hostname }}-bridges.cfg
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_items: "{{ servers }}"
|
|
|
|
- name: tftp configs for servers
|
|
template:
|
|
src: "pxe/tftp/pxelinux.cfg.macaddr.j2"
|
|
dest: "/var/lib/tftpboot/pxelinux.cfg/01-{{ item.server_mac_address | replace(':', '-') }}"
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_items: "{{ servers }}"
|
|
|
|
- name: Preseeds for pxe mnaio
|
|
template:
|
|
src: "pxe/{{ ansible_os_family | lower }}/mnaio.preseed.j2"
|
|
dest: /var/lib/tftpboot/preseed/mnaio.preseed
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Preseeds for pxe vm
|
|
template:
|
|
src: "pxe/{{ ansible_os_family | lower }}/vm.preseed.j2"
|
|
dest: /var/lib/tftpboot/preseed/vm.preseed
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Create netboot bind mount path
|
|
file:
|
|
path: "/var/lib/tftpboot/{{ item.value.image_short_name }}"
|
|
state: directory
|
|
owner: "root"
|
|
group: "root"
|
|
mode: "0755"
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Unbind mount netboot images
|
|
mount:
|
|
name: "/var/lib/tftpboot/{{ item.value.image_short_name }}"
|
|
src: "/var/www/pxe/images/{{ item.value.image_netboot }}"
|
|
opts: bind
|
|
fstype: none
|
|
state: unmounted
|
|
register: fstab
|
|
with_dict: "{{ images }}"
|
|
|
|
- name: Ensure permissions are correct
|
|
shell: |
|
|
# Fix perms if needed
|
|
find /var/lib/tftpboot -type d -exec chmod 0755 {} \;
|
|
find /var/lib/tftpboot -type f -exec chmod 0644 {} \;
|
|
find /var/www/pxe -type d -exec chmod 0755 {} \;
|
|
|
|
- name: Bind mount netboot images
|
|
mount:
|
|
name: "/var/lib/tftpboot/{{ item.value.image_short_name }}"
|
|
src: "/var/www/pxe/images/{{ item.value.image_netboot }}"
|
|
opts: bind
|
|
fstype: none
|
|
state: mounted
|
|
register: fstab
|
|
with_dict: "{{ images }}"
|
|
|
|
handlers:
|
|
- name: restart nginx
|
|
service:
|
|
name: "nginx"
|
|
state: restarted
|
|
enabled: yes
|
|
|
|
- name: restart tftp-hpa
|
|
service:
|
|
name: "tftpd-hpa"
|
|
state: restarted
|
|
enabled: yes
|
|
|
|
- name: restart inetd
|
|
service:
|
|
name: "inetutils-inetd"
|
|
state: restarted
|
|
enabled: yes
|
|
|
|
vars_files:
|
|
- vars/main.yml
|
|
tags:
|
|
- deploy-pxe
|