summaryrefslogtreecommitdiffstats
path: root/deployment/playbooks/roles/create-vm-crs-prod-ose/tasks/main.yaml
blob: 05aa63bb233668bd8fdf6dad1ce96157cb980aee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
---
- name: Define set of main disks (system and heketi)
  set_fact:
    disks_info: "{{ disks_info | default([
                     {'size_gb': 60, 'type': 'thin', 'datastore': vcenter_datastore},
                     {'size_gb': 40, 'type': 'thin', 'datastore': vcenter_datastore},
                     {'size_gb': 40, 'type': 'thin', 'datastore': vcenter_datastore}])
                 }} + {{
                    [{'size_gb': (item.strip() | int),
                      'type': container_storage_disk_type,
                      'datastore': vcenter_datastore}]
                 }}"
  with_items: "{{ container_storage_disks.split(',') }}"

- name: Define set of additional disks which will be just attached to nodes
  set_fact:
    additional_disks_info: "{{ additional_disks_info | default([]) }} + {{
                               [{'size_gb': (item.strip() | int),
                                 'type': container_storage_disk_type,
                                 'datastore': vcenter_datastore}]
                            }}"
  with_items: "{{ additional_disks_to_storage_nodes.split(',') }}"

- name: Create CRS production VMs on vCenter
  vmware_guest:
    hostname: "{{ vcenter_host }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    validate_certs: False
    name: "{{ item.value.guestname }}"
    cluster: "{{ vcenter_cluster}}"
    datacenter: "{{ vcenter_datacenter }}"
    resource_pool: "{{ vcenter_resource_pool }}"
    template: "{{vcenter_template_name}}"
    state: poweredon
    wait_for_ip_address: true
    folder: "/{{ vcenter_folder }}"
    annotation: "{{ cluster_id }}-crs"
    disk: "{{ disks_info }} + {{ additional_disks_info }}"
    hardware:
      memory_mb: 32768
    networks: "[{'name': '{{ vm_network }}', 'type': 'dhcp' }]"
    customization:
      domain: "{{dns_zone}}"
      dns_suffix: "{{dns_zone}}"
      hostname: "{{ item.value.guestname}}"
  with_dict: "{{host_inventory}}"
  when: "item.value.guesttype in ['crs', ]"
  async: "{{ 6 * 600 }}"
  poll: 0
  register: async_vms_creation

- name: Check async status of VMs creation
  async_status:
    jid: "{{ async_result_item.ansible_job_id }}"
  with_items: "{{ async_vms_creation.results }}"
  loop_control:
    loop_var: "async_result_item"
  register: async_poll_results
  until: async_poll_results.finished
  retries: "{{ 6 * 100 }}"

- name: Read info of newly created VMs
  vmware_guest_tools_wait:
    hostname: "{{ vcenter_host }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    folder: "/{{ vcenter_folder }}"
    validate_certs: False
    uuid: "{{ item.instance.hw_product_uuid }}"
  with_items: "{{ async_poll_results.results }}"
  register: facts

- name: Map node names and their IP addresses
  set_fact:
    ip4addrs: "{{ ip4addrs | default({}) | combine(
                      {item.instance.hw_name: (
                           item.instance.hw_eth0.ipaddresses | ipv4 | first)},
                      recursive=True) }}"
    hostnames_for_reboot: "{{
        (hostnames_for_reboot | default([])) +
        [(item.instance.hw_eth0.ipaddresses | ipv4 | first)] }}"
  with_items: "{{ facts.results }}"

- name: Define glusterfs devices
  set_fact:
    glusterfs_devices: "{{ glusterfs_devices | default([]) }} +
                        {{ ['/dev/sd' + 'defghijklmnopqrstuvwxyz'[item.0]] }}"
  with_indexed_items: "{{ disks_info[3::] }}"

- name: Define glusterfs additional devices
  set_fact:
    glusterfs_additional_devices: "{{
        glusterfs_additional_devices | default([])
    }} + {{
        ['/dev/sd' + 'defghijklmnopqrstuvwxyz'[item.0 + (glusterfs_devices|length)]]
    }}"
  with_indexed_items: "{{ additional_disks_info }}"

- name: Add CRS production VMs to inventory
  add_host:
    hostname: "{{ item.value.guestname }}"
    ansible_fqdn: "{{ item.value.guestname }}.{{ dns_zone }}"
    ansible_ssh_host: "{{ ip4addrs[item.value.guestname] }}"
    openshift_node_group_name: "node-config-storage"
    # old groups are: crs, production_group, {{cluster-id}}-crs
    groups: "{{ cluster_id }}-crs, crs, storage, glusterfs"
    # Following vars are for 'openshift_storage_glusterfs' role from
    # 'openshift/openshift-ansible' repo
    glusterfs_devices: "{{ glusterfs_devices }}"
    glusterfs_hostname: "{{ item.value.guestname }}"
    glusterfs_ip: "{{ ip4addrs[item.value.guestname] }}"
    glusterfs_zone: "{{ ip4addrs[item.value.guestname].split('.')[-2::] | join('') | int }}"
  with_dict: "{{ host_inventory }}"
  when: "item.value.guesttype in ['crs', ]"

# Following updates config file
# which is required for automated tests from 'glusterfs-containers-tests' repo

- name: Combine data about gluster servers for 'glusterfs-containers-tests' config file
  set_fact:
    gluster_servers: "{{
        gluster_servers | default({}) | combine({
            ip4addrs[item.value.guestname]: {
                'manage': item.value.guestname,
                'storage': ip4addrs[item.value.guestname],
                'additional_devices': glusterfs_additional_devices,
            }
        })
    }}"
  with_dict: "{{ host_inventory }}"
  when:
  - item.value.guesttype in ['crs', ]
  - cns_automation_config_file_path | length > 0

- name: Update 'glusterfs-containers-tests' config file
  yedit:
    src: "{{ cns_automation_config_file_path }}"
    state: present
    edits:
    - key: gluster_servers
      value: "{{ gluster_servers }}"
  when: gluster_servers is defined