summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLénaïc Huard <lhuard@amadeus.com>2015-06-25 10:08:52 +0200
committerLénaïc Huard <lhuard@amadeus.com>2015-07-15 17:48:38 +0200
commit4b439253e7b4486947d201714d4f52a4a7e0fc01 (patch)
tree3f73f7b7f904a35ceb22b93998c076a3c9adf00d
parenta1fe1b25b588ba995192b99e44a7950ee0c6e032 (diff)
downloadopenshift-4b439253e7b4486947d201714d4f52a4a7e0fc01.tar.gz
openshift-4b439253e7b4486947d201714d4f52a4a7e0fc01.tar.bz2
openshift-4b439253e7b4486947d201714d4f52a4a7e0fc01.tar.xz
openshift-4b439253e7b4486947d201714d4f52a4a7e0fc01.zip
Make all the OpenStack resources be managed by a Heat Stack
-rw-r--r--README_openstack.md14
-rw-r--r--filter_plugins/oo_filters.py72
-rw-r--r--playbooks/openstack/openshift-cluster/files/heat_stack.yaml279
-rw-r--r--playbooks/openstack/openshift-cluster/files/heat_stack.yml149
-rw-r--r--playbooks/openstack/openshift-cluster/files/heat_stack_server.yaml123
-rw-r--r--playbooks/openstack/openshift-cluster/launch.yml116
-rw-r--r--playbooks/openstack/openshift-cluster/tasks/launch_instances.yml48
-rw-r--r--playbooks/openstack/openshift-cluster/terminate.yml45
-rw-r--r--playbooks/openstack/openshift-cluster/vars.yml22
9 files changed, 594 insertions, 274 deletions
diff --git a/README_openstack.md b/README_openstack.md
index 57977d1f5..3076e7b08 100644
--- a/README_openstack.md
+++ b/README_openstack.md
@@ -28,19 +28,15 @@ The following options can be passed via the `-o` flag of the `create` command:
* `image_name`: Name of the image to use to spawn VMs
* `keypair` (default to `${LOGNAME}_key`): Name of the ssh key
* `public_key` (default to `~/.ssh/id_rsa.pub`): filename of the ssh public key
-* `master_flavor_ram` (default to `2048`): VM flavor for the master (by amount of RAM)
-* `master_flavor_id`: VM flavor for the master (by ID)
-* `master_flavor_include`: VM flavor for the master (by name)
-* `node_flavor_ram` (default to `4096`): VM flavor for the nodes (by amount of RAM)
-* `node_flavor_id`: VM flavor for the nodes (by ID)
-* `node_flavor_include`: VM flavor for the nodes (by name)
-* `infra_heat_stack` (default to `playbooks/openstack/openshift-cluster/files/heat_stack.yml`): filename of the HEAT template to use to create the cluster infrastructure
+* `master_flavor` (default to `m1.small`): The ID or name of the flavor for the master
+* `node_flavor` (default to `m1.medium`): The ID or name of the flavor for the nodes
+* `infra_heat_stack` (default to `playbooks/openstack/openshift-cluster/files/heat_stack.yaml`): filename of the HEAT template to use to create the cluster infrastructure
-The following options are used only by `heat_stack.yml`. They are so used only if the `infra_heat_stack` option is left with its default value.
+The following options are used only by `heat_stack.yaml`. They are so used only if the `infra_heat_stack` option is left with its default value.
* `network_prefix` (default to `openshift-ansible-<cluster_id>`): prefix prepended to all network objects (net, subnet, router, security groups)
* `dns` (default to `8.8.8.8,8.8.4.4`): comma separated list of DNS to use
-* `net_cidr` (default to `192.168.<rand()>.0/24`): CIDR of the network created by `heat_stack.yml`
+* `net_cidr` (default to `192.168.<rand()>.0/24`): CIDR of the network created by `heat_stack.yaml`
* `external_net` (default to `external`): Name of the external network to connect to
* `floating_ip_pools` (default to `external`): comma separated list of floating IP pools
* `ssh_from` (default to `0.0.0.0/0`): IPs authorized to connect to the VMs via ssh
diff --git a/filter_plugins/oo_filters.py b/filter_plugins/oo_filters.py
index 4e4a7309d..cd197c0fe 100644
--- a/filter_plugins/oo_filters.py
+++ b/filter_plugins/oo_filters.py
@@ -8,6 +8,8 @@ Custom filters for use in openshift-ansible
from ansible import errors
from operator import itemgetter
import pdb
+import re
+import json
class FilterModule(object):
@@ -232,6 +234,73 @@ class FilterModule(object):
rval.append({string: value})
return rval
+ @staticmethod
+ def oo_parse_heat_stack_outputs(data):
+ ''' Formats the HEAT stack output into a usable form
+
+ The goal is to transform something like this:
+
+ +---------------+-------------------------------------------------+
+ | Property | Value |
+ +---------------+-------------------------------------------------+
+ | capabilities | [] | |
+ | creation_time | 2015-06-26T12:26:26Z | |
+ | description | OpenShift cluster | |
+ | … | … |
+ | outputs | [ |
+ | | { |
+ | | "output_value": "value_A" |
+ | | "description": "This is the value of Key_A" |
+ | | "output_key": "Key_A" |
+ | | }, |
+ | | { |
+ | | "output_value": [ |
+ | | "value_B1", |
+ | | "value_B2" |
+ | | ], |
+ | | "description": "This is the value of Key_B" |
+ | | "output_key": "Key_B" |
+ | | }, |
+ | | ] |
+ | parameters | { |
+ | … | … |
+ +---------------+-------------------------------------------------+
+
+ into something like this:
+
+ {
+ "Key_A": "value_A",
+ "Key_B": [
+ "value_B1",
+ "value_B2"
+ ]
+ }
+ '''
+
+ # Extract the “outputs” JSON snippet from the pretty-printed array
+ in_outputs = False
+ outputs = ''
+
+ line_regex = re.compile(r'\|\s*(.*?)\s*\|\s*(.*?)\s*\|')
+ for line in data['stdout_lines']:
+ match = line_regex.match(line)
+ if match:
+ if match.group(1) == 'outputs':
+ in_outputs = True
+ elif match.group(1) != '':
+ in_outputs = False
+ if in_outputs:
+ outputs += match.group(2)
+
+ outputs = json.loads(outputs)
+
+ # Revamp the “outputs” to put it in the form of a “Key: value” map
+ revamped_outputs = {}
+ for output in outputs:
+ revamped_outputs[output['output_key']] = output['output_value']
+
+ return revamped_outputs
+
def filters(self):
''' returns a mapping of filters to methods '''
return {
@@ -245,5 +314,6 @@ class FilterModule(object):
"oo_combine_key_value": self.oo_combine_key_value,
"oo_split": self.oo_split,
"oo_filter_list": self.oo_filter_list,
- "oo_build_zabbix_list_dict": self.oo_build_zabbix_list_dict
+ "oo_build_zabbix_list_dict": self.oo_build_zabbix_list_dict,
+ "oo_parse_heat_stack_outputs": self.oo_parse_heat_stack_outputs
}
diff --git a/playbooks/openstack/openshift-cluster/files/heat_stack.yaml b/playbooks/openstack/openshift-cluster/files/heat_stack.yaml
new file mode 100644
index 000000000..a15ec749c
--- /dev/null
+++ b/playbooks/openstack/openshift-cluster/files/heat_stack.yaml
@@ -0,0 +1,279 @@
+heat_template_version: 2014-10-16
+
+description: OpenShift cluster
+
+parameters:
+
+ cluster_id:
+ type: string
+ label: Cluster ID
+ description: Identifier of the cluster
+
+ num_masters:
+ type: number
+ label: Number of masters
+ description: Number of masters
+
+ num_nodes:
+ type: number
+ label: Number of nodes
+ description: Number of nodes
+
+ cidr:
+ type: string
+ label: CIDR
+ description: CIDR of the network of the cluster
+
+ dns_nameservers:
+ type: comma_delimited_list
+ label: DNS nameservers list
+ description: List of DNS nameservers
+
+ external_net:
+ type: string
+ label: External network
+ description: Name of the external network
+ default: external
+
+ ssh_public_key:
+ type: string
+ label: SSH public key
+ description: SSH public key
+ hidden: true
+
+ ssh_incoming:
+ type: string
+ label: Source of ssh connections
+ description: Source of legitimate ssh connections
+ default: 0.0.0.0/0
+
+ master_image:
+ type: string
+ label: Master image
+ description: Name of the image for the master servers
+
+ node_image:
+ type: string
+ label: Node image
+ description: Name of the image for the node servers
+
+ master_flavor:
+ type: string
+ label: Master flavor
+ description: Flavor of the master servers
+
+ node_flavor:
+ type: string
+ label: Node flavor
+ description: Flavor of the node servers
+
+outputs:
+
+ master_names:
+ description: Name of the masters
+ value: { get_attr: [ masters, name ] }
+
+ master_ips:
+ description: IPs of the masters
+ value: { get_attr: [ masters, private_ip ] }
+
+ master_floating_ips:
+ description: Floating IPs of the masters
+ value: { get_attr: [ masters, floating_ip ] }
+
+ node_names:
+ description: Name of the nodes
+ value: { get_attr: [ nodes, name ] }
+
+ node_ips:
+ description: IPs of the nodes
+ value: { get_attr: [ nodes, private_ip ] }
+
+ node_floating_ips:
+ description: Floating IPs of the nodes
+ value: { get_attr: [ nodes, floating_ip ] }
+
+resources:
+
+ net:
+ type: OS::Neutron::Net
+ properties:
+ name:
+ str_replace:
+ template: openshift-ansible-cluster_id-net
+ params:
+ cluster_id: { get_param: cluster_id }
+
+ subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ name:
+ str_replace:
+ template: openshift-ansible-cluster_id-subnet
+ params:
+ cluster_id: { get_param: cluster_id }
+ network: { get_resource: net }
+ cidr: { get_param: cidr }
+ dns_nameservers: { get_param: dns_nameservers }
+
+ router:
+ type: OS::Neutron::Router
+ properties:
+ name:
+ str_replace:
+ template: openshift-ansible-cluster_id-router
+ params:
+ cluster_id: { get_param: cluster_id }
+ external_gateway_info:
+ network: { get_param: external_net }
+
+ interface:
+ type: OS::Neutron::RouterInterface
+ properties:
+ router_id: { get_resource: router }
+ subnet_id: { get_resource: subnet }
+
+ keypair:
+ type: OS::Nova::KeyPair
+ properties:
+ name:
+ str_replace:
+ template: openshift-ansible-cluster_id-keypair
+ params:
+ cluster_id: { get_param: cluster_id }
+ public_key: { get_param: ssh_public_key }
+
+ master-secgrp:
+ type: OS::Neutron::SecurityGroup
+ properties:
+ name:
+ str_replace:
+ template: openshift-ansible-cluster_id-master-secgrp
+ params:
+ cluster_id: { get_param: cluster_id }
+ description:
+ str_replace:
+ template: Security group for cluster_id OpenShift cluster master
+ params:
+ cluster_id: { get_param: cluster_id }
+ rules:
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 22
+ port_range_max: 22
+ remote_ip_prefix: { get_param: ssh_incoming }
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 4001
+ port_range_max: 4001
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 8443
+ port_range_max: 8443
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 53
+ port_range_max: 53
+ - direction: ingress
+ protocol: udp
+ port_range_min: 53
+ port_range_max: 53
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 24224
+ port_range_max: 24224
+ - direction: ingress
+ protocol: udp
+ port_range_min: 24224
+ port_range_max: 24224
+
+ node-secgrp:
+ type: OS::Neutron::SecurityGroup
+ properties:
+ name:
+ str_replace:
+ template: openshift-ansible-cluster_id-node-secgrp
+ params:
+ cluster_id: { get_param: cluster_id }
+ description:
+ str_replace:
+ template: Security group for cluster_id OpenShift cluster nodes
+ params:
+ cluster_id: { get_param: cluster_id }
+ rules:
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 22
+ port_range_max: 22
+ remote_ip_prefix: { get_param: ssh_incoming }
+ - direction: ingress
+ protocol: udp
+ port_range_min: 4789
+ port_range_max: 4789
+ remote_mode: remote_group_id
+ - direction: ingress
+ protocol: tcp
+ port_range_min: 10250
+ port_range_max: 10250
+ remote_mode: remote_group_id
+ remote_group_id: { get_resource: master-secgrp }
+
+ masters:
+ type: OS::Heat::ResourceGroup
+ properties:
+ count: { get_param: num_masters }
+ resource_def:
+ type: heat_stack_server.yaml
+ properties:
+ name:
+ str_replace:
+ template: cluster_id-k8s_type-%index%
+ params:
+ cluster_id: { get_param: cluster_id }
+ k8s_type: master
+ cluster_id: { get_param: cluster_id }
+ type: master
+ image: { get_param: master_image }
+ flavor: { get_param: master_flavor }
+ key_name: { get_resource: keypair }
+ net: { get_resource: net }
+ subnet: { get_resource: subnet }
+ secgrp:
+ - { get_resource: master-secgrp }
+ floating_network: { get_param: external_net }
+ net_name:
+ str_replace:
+ template: openshift-ansible-cluster_id-net
+ params:
+ cluster_id: { get_param: cluster_id }
+ depends_on: interface
+
+ nodes:
+ type: OS::Heat::ResourceGroup
+ properties:
+ count: { get_param: num_nodes }
+ resource_def:
+ type: heat_stack_server.yaml
+ properties:
+ name:
+ str_replace:
+ template: cluster_id-k8s_type-%index%
+ params:
+ cluster_id: { get_param: cluster_id }
+ k8s_type: node
+ cluster_id: { get_param: cluster_id }
+ type: node
+ image: { get_param: node_image }
+ flavor: { get_param: node_flavor }
+ key_name: { get_resource: keypair }
+ net: { get_resource: net }
+ subnet: { get_resource: subnet }
+ secgrp:
+ - { get_resource: node-secgrp }
+ floating_network: { get_param: external_net }
+ net_name:
+ str_replace:
+ template: openshift-ansible-cluster_id-net
+ params:
+ cluster_id: { get_param: cluster_id }
+ depends_on: interface
diff --git a/playbooks/openstack/openshift-cluster/files/heat_stack.yml b/playbooks/openstack/openshift-cluster/files/heat_stack.yml
deleted file mode 100644
index c5f95d87d..000000000
--- a/playbooks/openstack/openshift-cluster/files/heat_stack.yml
+++ /dev/null
@@ -1,149 +0,0 @@
-heat_template_version: 2014-10-16
-
-description: OpenShift cluster
-
-parameters:
- cluster-id:
- type: string
- label: Cluster ID
- description: Identifier of the cluster
-
- network-prefix:
- type: string
- label: Network prefix
- description: Prefix of the network objects
-
- cidr:
- type: string
- label: CIDR
- description: CIDR of the network of the cluster
-
- dns-nameservers:
- type: comma_delimited_list
- label: DNS nameservers list
- description: List of DNS nameservers
-
- external-net:
- type: string
- label: External network
- description: Name of the external network
- default: external
-
- ssh-incoming:
- type: string
- label: Source of ssh connections
- description: Source of legitimate ssh connections
-
-resources:
- net:
- type: OS::Neutron::Net
- properties:
- name:
- str_replace:
- template: network-prefix-net
- params:
- network-prefix: { get_param: network-prefix }
-
- subnet:
- type: OS::Neutron::Subnet
- properties:
- name:
- str_replace:
- template: network-prefix-subnet
- params:
- network-prefix: { get_param: network-prefix }
- network: { get_resource: net }
- cidr: { get_param: cidr }
- dns_nameservers: { get_param: dns-nameservers }
-
- router:
- type: OS::Neutron::Router
- properties:
- name:
- str_replace:
- template: network-prefix-router
- params:
- network-prefix: { get_param: network-prefix }
- external_gateway_info:
- network: { get_param: external-net }
-
- interface:
- type: OS::Neutron::RouterInterface
- properties:
- router_id: { get_resource: router }
- subnet_id: { get_resource: subnet }
-
- node-secgrp:
- type: OS::Neutron::SecurityGroup
- properties:
- name:
- str_replace:
- template: network-prefix-node-secgrp
- params:
- network-prefix: { get_param: network-prefix }
- description:
- str_replace:
- template: Security group for cluster-id OpenShift cluster nodes
- params:
- cluster-id: { get_param: cluster-id }
- rules:
- - direction: ingress
- protocol: tcp
- port_range_min: 22
- port_range_max: 22
- remote_ip_prefix: { get_param: ssh-incoming }
- - direction: ingress
- protocol: udp
- port_range_min: 4789
- port_range_max: 4789
- remote_mode: remote_group_id
- - direction: ingress
- protocol: tcp
- port_range_min: 10250
- port_range_max: 10250
- remote_mode: remote_group_id
- remote_group_id: { get_resource: master-secgrp }
-
- master-secgrp:
- type: OS::Neutron::SecurityGroup
- properties:
- name:
- str_replace:
- template: network-prefix-master-secgrp
- params:
- network-prefix: { get_param: network-prefix }
- description:
- str_replace:
- template: Security group for cluster-id OpenShift cluster master
- params:
- cluster-id: { get_param: cluster-id }
- rules:
- - direction: ingress
- protocol: tcp
- port_range_min: 22
- port_range_max: 22
- remote_ip_prefix: { get_param: ssh-incoming }
- - direction: ingress
- protocol: tcp
- port_range_min: 4001
- port_range_max: 4001
- - direction: ingress
- protocol: tcp
- port_range_min: 8443
- port_range_max: 8443
- - direction: ingress
- protocol: tcp
- port_range_min: 53
- port_range_max: 53
- - direction: ingress
- protocol: udp
- port_range_min: 53
- port_range_max: 53
- - direction: ingress
- protocol: tcp
- port_range_min: 24224
- port_range_max: 24224
- - direction: ingress
- protocol: udp
- port_range_min: 24224
- port_range_max: 24224
diff --git a/playbooks/openstack/openshift-cluster/files/heat_stack_server.yaml b/playbooks/openstack/openshift-cluster/files/heat_stack_server.yaml
new file mode 100644
index 000000000..55f64211a
--- /dev/null
+++ b/playbooks/openstack/openshift-cluster/files/heat_stack_server.yaml
@@ -0,0 +1,123 @@
+heat_template_version: 2014-10-16
+
+description: OpenShift cluster server
+
+parameters:
+
+ name:
+ type: string
+ label: Name
+ description: Name
+
+ cluster_id:
+ type: string
+ label: Cluster ID
+ description: Identifier of the cluster
+
+ type:
+ type: string
+ label: Type
+ description: Type master or node
+
+ key_name:
+ type: string
+ label: Key name
+ description: Key name of keypair
+
+ image:
+ type: string
+ label: Image
+ description: Name of the image
+
+ flavor:
+ type: string
+ label: Flavor
+ description: Name of the flavor
+
+ net:
+ type: string
+ label: Net ID
+ description: Net resource
+
+ net_name:
+ type: string
+ label: Net name
+ description: Net name
+
+ subnet:
+ type: string
+ label: Subnet ID
+ description: Subnet resource
+
+ secgrp:
+ type: comma_delimited_list
+ label: Security groups
+ description: Security group resources
+
+ floating_network:
+ type: string
+ label: Floating network
+ description: Network to allocate floating IP from
+
+outputs:
+
+ name:
+ description: Name of the server
+ value: { get_attr: [ server, name ] }
+
+ private_ip:
+ description: Private IP of the server
+ value:
+ get_attr:
+ - server
+ - addresses
+ - { get_param: net_name }
+ - 0
+ - addr
+
+ floating_ip:
+ description: Floating IP of the server
+ value:
+ get_attr:
+ - server
+ - addresses
+ - { get_param: net_name }
+ - 1
+ - addr
+
+resources:
+
+ server:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: name }
+ key_name: { get_param: key_name }
+ image: { get_param: image }
+ flavor: { get_param: flavor }
+ networks:
+ - port: { get_resource: port }
+ user_data: { get_file: user-data }
+ user_data_format: RAW
+ metadata:
+ env: { get_param: cluster_id }
+ host-type: { get_param: type }
+ env-host-type:
+ str_template:
+ template: cluster_id-openshift-type
+ params:
+ cluster_id: { get_param: cluster_id }
+ type: { get_param: type }
+
+ port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: net }
+ fixed_ips:
+ - subnet: { get_param: subnet }
+ security_groups: { get_param: secgrp }
+
+ floating-ip:
+ type: OS::Neutron::FloatingIP
+ properties:
+ floating_network: { get_param: floating_network }
+ port_id: { get_resource: port }
diff --git a/playbooks/openstack/openshift-cluster/launch.yml b/playbooks/openstack/openshift-cluster/launch.yml
index 5c86ade3f..3cdd2ae4d 100644
--- a/playbooks/openstack/openshift-cluster/launch.yml
+++ b/playbooks/openstack/openshift-cluster/launch.yml
@@ -8,23 +8,105 @@
tasks:
- fail:
msg: "Deployment type not supported for OpenStack provider yet"
- when: deployment_type in ['online', 'enterprise']
-
- - include: tasks/configure_openstack.yml
-
- - include: ../../common/openshift-cluster/set_master_launch_facts_tasks.yml
- - include: tasks/launch_instances.yml
- vars:
- instances: "{{ master_names }}"
- cluster: "{{ cluster_id }}"
- type: "{{ k8s_type }}"
-
- - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml
- - include: tasks/launch_instances.yml
- vars:
- instances: "{{ node_names }}"
- cluster: "{{ cluster_id }}"
- type: "{{ k8s_type }}"
+ when: deployment_type == 'online'
+
+ # TODO: Write an Ansible module for dealing with HEAT stacks
+ # Dealing with the outputs is currently terrible
+
+ - name: Check OpenStack stack
+ command: 'heat stack-show openshift-ansible-{{ cluster_id }}-stack'
+ register: stack_show_result
+ changed_when: false
+ failed_when: stack_show_result.rc != 0 and 'Stack not found' not in stack_show_result.stderr
+
+ - name: Create OpenStack Stack
+ command: 'heat stack-create -f {{ openstack_infra_heat_stack }}
+ -P cluster_id={{ cluster_id }}
+ -P dns_nameservers={{ openstack_network_dns | join(",") }}
+ -P cidr={{ openstack_network_cidr }}
+ -P ssh_incoming={{ openstack_ssh_access_from }}
+ -P num_masters={{ num_masters }}
+ -P num_nodes={{ num_nodes }}
+ -P master_image={{ deployment_vars[deployment_type].image }}
+ -P node_image={{ deployment_vars[deployment_type].image }}
+ -P master_flavor={{ openstack_flavor["master"] }}
+ -P node_flavor={{ openstack_flavor["node"] }}
+ -P ssh_public_key="{{ openstack_ssh_public_key }}"
+ openshift-ansible-{{ cluster_id }}-stack'
+ when: stack_show_result.rc == 1
+
+ - name: Update OpenStack Stack
+ command: 'heat stack-update -f {{ openstack_infra_heat_stack }}
+ -P cluster_id={{ cluster_id }}
+ -P dns_nameservers={{ openstack_network_dns | join(",") }}
+ -P cidr={{ openstack_network_cidr }}
+ -P ssh_incoming={{ openstack_ssh_access_from }}
+ -P num_masters={{ num_masters }}
+ -P num_nodes={{ num_nodes }}
+ -P master_image={{ deployment_vars[deployment_type].image }}
+ -P node_image={{ deployment_vars[deployment_type].image }}
+ -P master_flavor={{ openstack_flavor["master"] }}
+ -P node_flavor={{ openstack_flavor["node"] }}
+ -P ssh_public_key="{{ openstack_ssh_public_key }}"
+ openshift-ansible-{{ cluster_id }}-stack'
+ when: stack_show_result.rc == 0
+
+ - name: Wait for OpenStack Stack readiness
+ shell: 'heat stack-show openshift-ansible-{{ cluster_id }}-stack | awk ''$2 == "stack_status" {print $4}'''
+ register: stack_show_status_result
+ until: stack_show_status_result.stdout not in ['CREATE_IN_PROGRESS', 'UPDATE_IN_PROGRESS']
+ retries: 30
+ delay: 1
+ failed_when: stack_show_status_result.stdout not in ['CREATE_COMPLETE', 'UPDATE_COMPLETE']
+
+ - name: Read OpenStack Stack outputs
+ command: 'heat stack-show openshift-ansible-{{ cluster_id }}-stack'
+ register: stack_show_result
+
+ - set_fact:
+ parsed_outputs: "{{ stack_show_result | oo_parse_heat_stack_outputs }}"
+
+ - name: Add new master instances groups and variables
+ add_host:
+ hostname: '{{ item[0] }}'
+ ansible_ssh_host: '{{ item[2] }}'
+ ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}"
+ ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}"
+ groups: 'tag_env_{{ cluster_id }}, tag_host-type_master, tag_env-host-type_{{ cluster_id }}-openshift-master'
+ with_together:
+ - parsed_outputs.master_names
+ - parsed_outputs.master_ips
+ - parsed_outputs.master_floating_ips
+
+ - name: Add new node instances groups and variables
+ add_host:
+ hostname: '{{ item[0] }}'
+ ansible_ssh_host: '{{ item[2] }}'
+ ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}"
+ ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}"
+ groups: 'tag_env_{{ cluster_id }}, tag_host-type_node, tag_env-host-type_{{ cluster_id }}-openshift-node'
+ with_together:
+ - parsed_outputs.node_names
+ - parsed_outputs.node_ips
+ - parsed_outputs.node_floating_ips
+
+ - name: Wait for ssh
+ wait_for:
+ host: '{{ item }}'
+ port: 22
+ with_flattened:
+ - parsed_outputs.master_floating_ips
+ - parsed_outputs.node_floating_ips
+
+ - name: Wait for user setup
+ command: 'ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o ConnectTimeout=10 -o UserKnownHostsFile=/dev/null {{ deployment_vars[deployment_type].ssh_user }}@{{ item }} echo {{ deployment_vars[deployment_type].ssh_user }} user is setup'
+ register: result
+ until: result.rc == 0
+ retries: 30
+ delay: 1
+ with_flattened:
+ - parsed_outputs.master_floating_ips
+ - parsed_outputs.node_floating_ips
- include: update.yml
diff --git a/playbooks/openstack/openshift-cluster/tasks/launch_instances.yml b/playbooks/openstack/openshift-cluster/tasks/launch_instances.yml
deleted file mode 100644
index 1b9696aac..000000000
--- a/playbooks/openstack/openshift-cluster/tasks/launch_instances.yml
+++ /dev/null
@@ -1,48 +0,0 @@
----
-- name: Get net id
- shell: 'neutron net-show {{ openstack_network_prefix }}-net | awk "/\\<id\\>/ {print \$4}"'
- register: net_id_result
-
-- name: Launch instance(s)
- nova_compute:
- name: '{{ item }}'
- image_name: '{{ deployment_vars[deployment_type].image.name | default(omit, true) }}'
- image_id: '{{ deployment_vars[deployment_type].image.id | default(omit, true) }}'
- flavor_ram: '{{ openstack_flavor[k8s_type].ram | default(omit, true) }}'
- flavor_id: '{{ openstack_flavor[k8s_type].id | default(omit, true) }}'
- flavor_include: '{{ openstack_flavor[k8s_type].include | default(omit, true) }}'
- key_name: '{{ openstack_ssh_keypair }}'
- security_groups: '{{ openstack_network_prefix }}-{{ k8s_type }}-secgrp'
- nics:
- - net-id: '{{ net_id_result.stdout }}'
- user_data: "{{ lookup('file','files/user-data') }}"
- meta:
- env: '{{ cluster }}'
- host-type: '{{ type }}'
- env-host-type: '{{ cluster }}-openshift-{{ type }}'
- floating_ip_pools: '{{ openstack_floating_ip_pools }}'
- with_items: instances
- register: nova_compute_result
-
-- name: Add new instances groups and variables
- add_host:
- hostname: '{{ item.item }}'
- ansible_ssh_host: '{{ item.public_ip }}'
- ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}"
- ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}"
- groups: 'tag_env_{{ cluster }}, tag_host-type_{{ type }}, tag_env-host-type_{{ cluster }}-openshift-{{ type }}'
- with_items: nova_compute_result.results
-
-- name: Wait for ssh
- wait_for:
- host: '{{ item.public_ip }}'
- port: 22
- with_items: nova_compute_result.results
-
-- name: Wait for user setup
- command: 'ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o ConnectTimeout=10 -o UserKnownHostsFile=/dev/null {{ hostvars[item.item].ansible_ssh_user }}@{{ item.public_ip }} echo {{ hostvars[item.item].ansible_ssh_user }} user is setup'
- register: result
- until: result.rc == 0
- retries: 30
- delay: 1
- with_items: nova_compute_result.results
diff --git a/playbooks/openstack/openshift-cluster/terminate.yml b/playbooks/openstack/openshift-cluster/terminate.yml
index 2f05f0992..fc4ec3c88 100644
--- a/playbooks/openstack/openshift-cluster/terminate.yml
+++ b/playbooks/openstack/openshift-cluster/terminate.yml
@@ -5,39 +5,18 @@
vars_files:
- vars.yml
tasks:
- - set_fact: cluster_group=tag_env_{{ cluster_id }}
- - add_host:
- name: "{{ item }}"
- groups: oo_hosts_to_terminate
- ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}"
- ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}"
- with_items: groups[cluster_group] | default([])
-
-- hosts: oo_hosts_to_terminate
-
-- hosts: localhost
- connection: local
- gather_facts: no
- vars_files:
- - vars.yml
- tasks:
- - name: Retrieve the floating IPs
- shell: "neutron floatingip-list | awk '/{{ hostvars[item].ansible_default_ipv4.address }}/ {print $2}'"
- with_items: groups['oo_hosts_to_terminate'] | default([])
- register: floating_ips_to_delete
-
- - name: Terminate instance(s)
- nova_compute:
- name: "{{ hostvars[item].os_name }}"
- state: absent
- with_items: groups['oo_hosts_to_terminate'] | default([])
-
- - name: Delete floating IPs
- command: "neutron floatingip-delete {{ item.stdout }}"
- with_items: floating_ips_to_delete.results | default([])
-
- - name: Destroy the network
- command: "heat stack-delete {{ openstack_network_prefix }}-stack"
+ - name: Delete the OpenStack Stack
+ command: 'heat stack-delete openshift-ansible-{{ cluster_id }}-stack'
register: stack_delete_result
changed_when: stack_delete_result.rc == 0
failed_when: stack_delete_result.rc != 0 and 'could not be found' not in stack_delete_result.stdout
+
+ - name: Wait for the completion of the OpenStack Stack deletion
+ shell: 'heat stack-show openshift-ansible-{{ cluster_id }}-stack | awk ''$2 == "stack_status" {print $4}'''
+ when: stack_delete_result.changed
+ register: stack_show_result
+ until: stack_show_result.stdout != 'DELETE_IN_PROGRESS'
+ retries: 60
+ delay: 1
+ failed_when: '"Stack not found" not in stack_show_result.stderr and
+ stack_show_result.stdout != "DELETE_COMPLETE"'
diff --git a/playbooks/openstack/openshift-cluster/vars.yml b/playbooks/openstack/openshift-cluster/vars.yml
index 1ae7c17d2..d077a6ced 100644
--- a/playbooks/openstack/openshift-cluster/vars.yml
+++ b/playbooks/openstack/openshift-cluster/vars.yml
@@ -1,6 +1,6 @@
---
openstack_infra_heat_stack: "{{ lookup('oo_option', 'infra_heat_stack' ) |
- default('files/heat_stack.yml', True) }}"
+ default('files/heat_stack.yaml', True) }}"
openstack_network_prefix: "{{ lookup('oo_option', 'network_prefix' ) |
default('openshift-ansible-'+cluster_id, True) }}"
openstack_network_cidr: "{{ lookup('oo_option', 'net_cidr' ) |
@@ -18,31 +18,19 @@ openstack_ssh_public_key: "{{ lookup('file', lookup('oo_option', 'public_k
openstack_ssh_access_from: "{{ lookup('oo_option', 'ssh_from') |
default('0.0.0.0/0', True) }}"
openstack_flavor:
- master:
- ram: "{{ lookup('oo_option', 'master_flavor_ram' ) | default(2048, True) }}"
- id: "{{ lookup('oo_option', 'master_flavor_id' ) | default(True) }}"
- include: "{{ lookup('oo_option', 'master_flavor_include') | default(True) }}"
- node:
- ram: "{{ lookup('oo_option', 'node_flavor_ram' ) | default(4096, True) }}"
- id: "{{ lookup('oo_option', 'node_flavor_id' ) | default(True) }}"
- include: "{{ lookup('oo_option', 'node_flavor_include' ) | default(True) }}"
+ master: "{{ lookup('oo_option', 'master_flavor' ) | default('m1.small', True) }}"
+ node: "{{ lookup('oo_option', 'node_flavor' ) | default('m1.medium', True) }}"
deployment_vars:
origin:
- image:
- name: "{{ lookup('oo_option', 'image_name') | default('centos-70-raw', True) }}"
- id:
+ image: "{{ lookup('oo_option', 'image_name') | default('centos-70-raw', True) }}"
ssh_user: openshift
sudo: yes
online:
image:
- name:
- id:
ssh_user: root
sudo: no
enterprise:
- image:
- name: "{{ lookup('oo_option', 'image_name') | default('rhel-guest-image-7.1-20150224.0.x86_64', True) }}"
- id:
+ image: "{{ lookup('oo_option', 'image_name') | default('rhel-guest-image-7.1-20150224.0.x86_64', True) }}"
ssh_user: openshift
sudo: yes