
This change allows the MNAIO to really be used as a stand alone kick system which has the potential to be developed into a stand alone project. At the very least this change improves playbook performance by scoping variables. The inventory has been converted into a typical Ansible inventory and the "servers" used in the MNAIO are now simply host_vars which will trigger specific VM builds when instructed to do so. This gives the MNAIO the ability to serve as a stand alone kick system which could be used for physical hosts as well as MNAIO testing all through the same basic set of playbooks. Should a deployer want to use this with physical servers they'd need to do nothing more than define their basic inventory and where the the required pieces of infrastructure needed to PXE boot their machines. Change-Id: I6c47e02ecfbe8ee7533e77b11041785db485a1a9 Signed-off-by: Kevin Carter <kevin.carter@rackspace.com>
306 lines
9.3 KiB
YAML
306 lines
9.3 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-{{ 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
|
|
|
|
- name: network scripts for an MNAIO
|
|
template:
|
|
src: "mnaio/{{ 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-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(':', '-') }}"
|
|
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: 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
|
|
|
|
tags:
|
|
- deploy-pxe
|