--- # 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: Stop running VMs command: "virsh destroy {{ hostvars[item]['server_hostname'] }}" failed_when: false when: - hostvars[item]['server_vm'] | default(false) | bool with_items: "{{ groups['pxe_servers'] }}" - name: Delete VM LV lvol: vg: "{{ default_vm_disk_vg }}" lv: "{{ hostvars[item]['server_hostname'] }}" state: absent force: yes failed_when: false when: - hostvars[item]['server_vm'] | default(false) | bool - default_vm_disk_mode | default('lvm') == "lvm" with_items: "{{ groups['pxe_servers'] }}" - name: Delete VM Disk Image command: | rm -f /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img failed_when: false when: - hostvars[item]['server_vm'] | default(false) | bool - default_vm_disk_mode | default('lvm') == "file" with_items: "{{ groups['pxe_servers'] }}" - name: Create VM LV lvol: vg: "{{ default_vm_disk_vg }}" lv: "{{ hostvars[item]['server_hostname'] }}" size: "{{ default_vm_storage }}" when: - hostvars[item]['server_vm'] | default(false) | bool - default_vm_disk_mode | default('lvm') == "lvm" with_items: "{{ groups['pxe_servers'] }}" - name: Create VM Disk Image command: | qemu-img create -f qcow2 /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img {{ default_vm_storage }}m when: - hostvars[item]['server_vm'] | default(false) | bool - default_vm_disk_mode | default('lvm') == "file" 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: "'' 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: Set MaxSessions and MaxStartups to reduce connection failures hosts: vm_servers 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: - lineinfile: path: /etc/ssh/sshd_config line: MaxStartups 100 state: present regexp: '^MaxStartups.*$' notify: - restart sshd - lineinfile: path: /etc/ssh/sshd_config line: MaxSessions 100 state: present regexp: '^MaxSessions.*$' notify: - restart sshd handlers: - name: restart sshd service: name: "{{ ssh_service_name }}" state: restarted 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