Files
windows-ansible/ansible/playbooks/openstack-vms.yml
T

318 lines
11 KiB
YAML

---
- hosts: localhost
vars:
vm_status: "{{ lookup('file', '/deployments/{{ os_project }}-{{ win_project }}/VM_STATUS') }}"
vars_files:
- ../vars/common.yml
- ../vars/{{ project_zone }}.yml
tasks:
- name: End early if VM already created
block:
- meta: end_play
when: vm_status == 'created'
- name: Create workbench VMs (ASYNCHRONUS)
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-wb{{ '%02d' | format(item+1) }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- user_vms
network: "{{ os_network }}"
metadata:
name: "wb{{ '%02d' | format(item+1) }}"
win_project: "{{ win_project }}"
type: client
variant: workbench
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-wb{{ '%02d' | format(item+1) }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ range(wb_quantity)|list}}"
async: 900
poll: 0
register: async_wb
when:
- 'wb_quantity|int <= 5'
- 'wb_quantity|int > 1'
- name: Create workbench VMs (SEQUENTIAL)
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-wb{{ '%02d' | format(item+1) }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- user_vms
network: "{{ os_network }}"
metadata:
name: "wb{{ '%02d' | format(item+1) }}"
win_project: "{{ win_project }}"
type: client
variant: workbench
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-wb{{ '%02d' | format(item+1) }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ range(wb_quantity)|list}}"
when: 'async_wb.skipped == true'
- name: Wait for workbench VMs to build
os_server_info:
name: "{{ os_project }}-{{ win_project }}-wb*"
filters:
vm_state: active
register: wb_status
until: 'wb_status.servers|length == wb_quantity|int'
retries: 100
delay: 60
when: 'async_wb.skipped == false'
- name: Create application VMs (ASYNCHRONUS)
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-app{{ '%02d' | format(item+1) }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- user_vms
network: "{{ os_network }}"
metadata:
name: "app{{ '%02d' | format(item+1) }}"
win_project: "{{ win_project }}"
type: client
variant: application
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-app{{ '%02d' | format(item+1) }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ range(app_quantity)|list}}"
async: 900
poll: 0
register: async_app
when:
- 'app_quantity|int <= 5'
- 'app_quantity|int > 1'
- name: Create application VMs (SEQUENTIAL)
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-app{{ '%02d' | format(item+1) }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- user_vms
network: "{{ os_network }}"
metadata:
name: "app{{ '%02d' | format(item+1) }}"
win_project: "{{ win_project }}"
type: client
variant: application
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-app{{ '%02d' | format(item+1) }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ range(app_quantity)|list}}"
when: 'async_app.skipped == true'
- name: Wait for application VMs to build
os_server_info:
name: "{{ os_project }}-{{ win_project }}-app*"
filters:
vm_state: active
register: app_status
until: 'app_status.servers|length == app_quantity|int'
retries: 100
delay: 60
when: 'async_app.skipped == false'
- name: Create GPU VMs (ASYNCHRONUS)
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-gpu{{ '%02d' | format(item+1) }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- user_vms
network: "{{ os_network }}"
metadata:
name: "gpu{{ '%02d' | format(item+1) }}"
win_project: "{{ win_project }}"
type: client
variant: gpu
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-gpu{{ '%02d' | format(item+1) }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ range(gpu_quantity)|list}}"
async: 900
poll: 0
register: async_gpu
when:
- 'gpu_quantity|int <= 5'
- 'gpu_quantity|int > 1'
- name: Create GPU VMs (SEQUENTIAL)
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-gpu{{ '%02d' | format(item+1) }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- user_vms
network: "{{ os_network }}"
metadata:
name: "gpu{{ '%02d' | format(item+1) }}"
win_project: "{{ win_project }}"
type: client
variant: gpu
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-gpu{{ '%02d' | format(item+1) }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ range(gpu_quantity)|list}}"
when: 'async_gpu.skipped == true'
- name: Wait for GPU VMs to build
os_server_info:
name: "{{ os_project }}-{{ win_project }}-gpu*"
filters:
vm_state: active
register: gpu_status
until: 'gpu_status.servers|length == gpu_quantity|int'
retries: 100
delay: 60
when: 'async_gpu.skipped == false'
- name: Common VMs
block:
- name: Create Common VMs
tags: teardown
os_server:
name: "{{ item.name }}"
state: "{{ state }}"
image: "{{ vm_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 3600
boot_from_volume: true
volume_size: 40
terminate_volume: yes
security_groups:
- domain_member
- "{{ item.security_group }}"
network: "{{ os_network }}"
metadata:
name: "{{ item.meta_name }}"
win_project: "{{ win_project }}"
type: server
variant: "{{ item.security_group }}" # just happens to match maybe change???
os: windows
userdata: |
#ps1
Rename-Computer "{{ win_project }}-{{ item.meta_name }}"
$admin = [adsi]("WinNT://./Administrator, user")
$admin.PSBase.Invoke("SetPassword", "{{ vm_initial_password }}")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('{{ winrm_script_url }}'))
loop: "{{ standard_vms }}"
async: 900
poll: 0
- name: Wait for common VMs to build
os_server_info:
name: "{{ os_project }}-{{ win_project }}-*"
filters:
metadata:
type: server
vm_state: active
register: common_status
until: 'common_status.servers|length == 6'
retries: 100
delay: 60
- name: Create proxy
tags: teardown
os_server:
name: "{{ os_project }}-{{ win_project }}-proxy"
state: "{{ state }}"
image: "{{ proxy_image }}"
flavor: 3661211f-673a-4777-8857-fd243d6c407d
timeout: 900
boot_from_volume: true
volume_size: 40
terminate_volume: yes
key_name: proxy
security_groups:
- proxy
network: "{{ os_network }}"
metadata:
name: "proxy"
win_project: "{{ win_project }}"
type: server
variant: web_proxy
os: linux
when: project_zone == 'protected'
- name: Set VM Status
vars:
ansible_connection: local
replace:
path: /deployments/{{ os_project }}-{{ win_project }}/VM_STATUS
regexp: '^pending$'
replace: 'created'
delegate_to: localhost
run_once: True