openstack-ansible-ops/multi-node-aio/playbooks/deploy-vms.yml
Antony Messerli 4536c0a9ef Abort run if VMs aren't up before timeout
Occasionally the VM install will exceed the timeout
if it doesn't fire correctly.  Instead of treating
the host as down and continuing on with the others,
fail early.

Change-Id: I543d8e354a5357f7059fe82497edb9b7e3a22097
2017-11-02 11:49:20 -05:00

261 lines
7.0 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: vm_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
tasks:
- name: Create VM LV
lvol:
vg: vg01
lv: "{{ hostvars[item]['server_hostname'] }}"
size: "{{ default_vm_storage }}"
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Create the VM template
template:
src: kvm/kvm-vm.xml
dest: "/etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
mode: 0644
owner: root
group: root
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Wait for guest capabilities to appear
command: "virsh capabilities"
register: virsh_caps
until: "'<guest>' in virsh_caps.stdout"
retries: 6
delay: 10
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Define the VM
command: "virsh define /etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
failed_when: false
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Create the VM
command: "virsh create /etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
failed_when: false
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Start the VM
command: "virsh start {{ hostvars[item]['server_hostname'] }}"
failed_when: false
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Add VM to /etc/hosts file
lineinfile:
path: "/etc/hosts"
line: "{{ hostvars[item]['ansible_host'] }} {{ hostvars[item]['server_hostname'] }}"
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- deploy-vms
- name: Create vm_servers group
hosts: localhost
gather_facts: false
tasks:
- name: VM Servers group
add_host:
name: "{{ item }}"
groups: vm_servers
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- deploy-vms
- name: Wait for deploy host
hosts: vm_servers
gather_facts: false
any_errors_fatal: true
pre_tasks:
- name: Wait for connectivity 1
local_action:
module: wait_for
host: "{{ ansible_host }}"
connect_timeout: 5
port: 22
sleep: 10
timeout: 1200
state: started
search_regex: OpenSSH
tasks:
- name: copy host keys
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
mode: "0600"
with_items:
- src: "{{ lookup('env', 'HOME') }}/.ssh/id_rsa"
dest: /root/.ssh/id_rsa
- src: "{{ lookup('env', 'HOME') }}/.ssh/id_rsa.pub"
dest: /root/.ssh/id_rsa.pub
# In vm-post-install-script.sh.j2 we chattr +i the interfaces file to prevent
# the preseed system from overwriting the file after we've modified it. The
# task below simply removes the immutable attribute.
- name: Remove immutable attr from /etc/network/interfaces
hosts: vm_servers
gather_facts: true
tasks:
- file:
path: /etc/network/interfaces
attr: ""
when:
- ansible_distribution | lower == "ubuntu"
- ansible_distribution_release | lower == "trusty"
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- deploy-vms
- name: Setup cinder host volume
hosts: cinder_hosts:swift_hosts
gather_facts: false
tasks:
- name: un-mount deleteme mount
mount:
name: "/var/lib/lxc"
state: unmounted
- name: remote deleteme mount
mount:
name: "/var/lib/lxc"
state: absent
- name: Remove deleteme lv
lvol:
vg: vmvg00
lv: lxc00
force: true
state: absent
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- deploy-vms
- name: Setup cinder host volume
hosts: cinder_hosts
gather_facts: false
tasks:
- name: Create cinder-volumes lv
lvol:
vg: vmvg00
lv: cinder-volumes00
size: "100%FREE"
shrink: false
- name: Create data cinder-volumes group
lvg:
vg: cinder-volumes
pvs: "/dev/vmvg00/cinder-volumes00"
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- deploy-vms
- name: Setup swift host volume
hosts: swift_hosts
gather_facts: false
tasks:
- name: Remove deleteme lv
lvol:
vg: vmvg00
lv: "{{ item }}"
size: 4G
with_items:
- disk1
- disk2
- disk3
- name: Format swift drives
filesystem:
fstype: xfs
dev: "/dev/vmvg00/{{ item }}"
with_items:
- disk1
- disk2
- disk3
- name: Create drive directories
file:
path: "/srv/{{ item }}"
state: directory
owner: "root"
group: "root"
mode: "0755"
with_items:
- disk1
- disk2
- disk3
- name: Mount swift drives
mount:
name: "/srv/{{ item }}"
src: "/dev/mapper/vmvg00-{{ item }}"
fstype: xfs
state: mounted
with_items:
- disk1
- disk2
- disk3
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- deploy-vms