openstack-ansible-ops/multi-node-aio/playbooks/deploy-pxe.yml
Kevin Carter 2f503c228e
Tune-up the MNAIO for physical and virtual hosts
This change makes it possible to deploy ACNG within a physical
host NOT automatically tied to an MNAIO installation. This also
adds an infra preseed file which can be used to provision physical
hosts.

By default the domain name is now passed into the server boot params
which is useful when setting up an environment in support of
RFC-1034/5.

Ubuntu 16.04 has an issue with the options "quiet splash" being passed
in which cause it to have no usable console. See [Related-Issue] for
more.

Related-Issue: #1656605
Change-Id: I731dfb70e4b5d676d8c22082da77c0d22d5afb58
Signed-off-by: Kevin Carter <kevin.carter@rackspace.com>
2017-10-16 00:42:32 -05:00

342 lines
10 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
when:
- tftp_ssh_key is undefined
- name: Set key facts
set_fact:
tftp_ssh_key: "{{ public_key_get.stdout }}"
when:
- tftp_ssh_key is undefined
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-{{ ansible_os_family | lower }}-interface.cfg"
dir: networking
- src: vm-post-install-script.sh.j2
dest: "vm-post-install-{{ ansible_os_family | lower }}-script.sh"
dir: scripts
- src: general-post-install-script.sh.j2
dest: "general-post-install-{{ ansible_os_family | lower }}-script.sh"
dir: scripts
- name: network scripts for an MNAIO
template:
src: "pxe/{{ ansible_os_family | lower }}/{{ item.src }}"
dest: /var/www/pxe/{{ item.dir }}/{{ item.dest }}
mode: "0644"
owner: root
group: root
when:
- groups['mnaio_hosts'] | default([]) | length > 0
with_items:
- src: mnaio-bridges.cfg.j2
dest: mnaio-bridges.cfg
dir: networking
- src: mnaio-post-install-script.sh.j2
dest: mnaio-post-install-{{ ansible_os_family | lower }}-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/{{ hostvars[item]['server_hostname'] }}-bridges.cfg
mode: "0644"
owner: root
group: root
with_items: "{{ groups['pxe_servers'] }}"
- name: tftp configs for servers
template:
src: "pxe/tftp/pxelinux.cfg.macaddr.j2"
dest: "/var/lib/tftpboot/pxelinux.cfg/01-{{ hostvars[item]['server_mac_address'] | replace(':', '-') | lower }}"
mode: "0644"
owner: root
group: root
with_items: "{{ groups['pxe_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: Preseeds for pxe vm-compute
template:
src: "pxe/{{ ansible_os_family | lower }}/vm-compute.preseed.j2"
dest: /var/lib/tftpboot/preseed/vm-compute.preseed
mode: "0644"
owner: root
group: root
with_dict: "{{ images }}"
- name: Preseeds for pxe compute
template:
src: "pxe/{{ ansible_os_family | lower }}/compute.preseed.j2"
dest: /var/lib/tftpboot/preseed/compute.preseed
mode: "0644"
owner: root
group: root
with_dict: "{{ images }}"
- name: Preseeds for pxe infra
template:
src: "pxe/{{ ansible_os_family | lower }}/infra.preseed.j2"
dest: /var/lib/tftpboot/preseed/infra.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 }}"
environment: "{{ deployment_environment_variables | default({}) }}"
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
tags:
- deploy-pxe