diff options
Diffstat (limited to 'playbooks/openstack')
10 files changed, 671 insertions, 282 deletions
diff --git a/playbooks/openstack/openshift-cluster/config.yml b/playbooks/openstack/openshift-cluster/config.yml index abadaf5ca..3c9a231e3 100644 --- a/playbooks/openstack/openshift-cluster/config.yml +++ b/playbooks/openstack/openshift-cluster/config.yml @@ -1,35 +1,20 @@ -- name: Populate oo_masters_to_config host group -  hosts: localhost +- hosts: localhost    gather_facts: no    vars_files:    - vars.yml    tasks: -  - name: Evaluate oo_masters_to_config -    add_host: -      name: "{{ item }}" -      ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}" -      ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}" -      groups: oo_masters_to_config -    with_items: groups["tag_env-host-type_{{ cluster_id }}-openshift-master"] | default([]) -  - name: Evaluate oo_nodes_to_config -    add_host: -      name: "{{ item }}" -      ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}" -      ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}" -      groups: oo_nodes_to_config -    with_items: groups["tag_env-host-type_{{ cluster_id }}-openshift-node"] | default([]) -  - name: Evaluate oo_first_master -    add_host: -      name: "{{ groups['tag_env-host-type_' ~ cluster_id ~ '-openshift-master'][0] }}" -      ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}" -      ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}" -      groups: oo_first_master -    when: "'tag_env-host-type_{{ cluster_id }}-openshift-master' in groups" +  - set_fact: +      g_ssh_user_tmp: "{{ deployment_vars[deployment_type].ssh_user }}" +      g_sudo_tmp: "{{ deployment_vars[deployment_type].sudo }}"  - include: ../../common/openshift-cluster/config.yml    vars: +    g_etcd_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-etcd' }}" +    g_masters_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-master' }}" +    g_nodes_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-node' }}" +    g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}" +    g_sudo: "{{ hostvars.localhost.g_sudo_tmp }}"      openshift_cluster_id: "{{ cluster_id }}"      openshift_debug_level: 4      openshift_deployment_type: "{{ deployment_type }}" -    openshift_first_master: "{{ groups.oo_first_master.0 }}"      openshift_hostname: "{{ ansible_default_ipv4.address }}" 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..d53884e0d --- /dev/null +++ b/playbooks/openstack/openshift-cluster/files/heat_stack.yaml @@ -0,0 +1,364 @@ +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 compute nodes +    description: Number of compute nodes + +  num_infra: +    type: number +    label: Number of infrastructure nodes +    description: Number of infrastructure 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 compute node servers + +  infra_image: +    type: string +    label: Infra image +    description: Name of the image for the infra 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 compute node servers + +  infra_flavor: +    type: string +    label: Infra flavor +    description: Flavor of the infra 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: [ compute_nodes, name ] } + +  node_ips: +    description: IPs of the nodes +    value: { get_attr: [ compute_nodes, private_ip ] } + +  node_floating_ips: +    description: Floating IPs of the nodes +    value: { get_attr: [ compute_nodes, floating_ip ] } + +  infra_names: +    description: Name of the nodes +    value: { get_attr: [ infra_nodes, name ] } + +  infra_ips: +    description: IPs of the nodes +    value: { get_attr: [ infra_nodes, private_ip ] } + +  infra_floating_ips: +    description: Floating IPs of the nodes +    value: { get_attr: [ infra_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 } + +  infra-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-infra-secgrp +          params: +            cluster_id: { get_param: cluster_id } +      description: +        str_replace: +          template: Security group for cluster_id OpenShift infrastructure cluster nodes +          params: +            cluster_id: { get_param: cluster_id } +      rules: +        - direction: ingress +          protocol: tcp +          port_range_min: 80 +          port_range_max: 80 +        - direction: ingress +          protocol: tcp +          port_range_min: 443 +          port_range_max: 443 + +  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 + +  compute_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-sub_host_type-%index% +              params: +                cluster_id: { get_param: cluster_id } +                k8s_type: node +                sub_host_type: compute +          cluster_id: { get_param: cluster_id } +          type:       node +          subtype:    compute +          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 + +  infra_nodes: +    type: OS::Heat::ResourceGroup +    properties: +      count: { get_param: num_infra } +      resource_def: +        type: heat_stack_server.yaml +        properties: +          name: +            str_replace: +              template: cluster_id-k8s_type-sub_host_type-%index% +              params: +                cluster_id: { get_param: cluster_id } +                k8s_type: node +                sub_host_type: infra +          cluster_id: { get_param: cluster_id } +          type:       node +          subtype:    infra +          image:      { get_param: infra_image } +          flavor:     { get_param: infra_flavor } +          key_name:   { get_resource: keypair } +          net:        { get_resource: net } +          subnet:     { get_resource: subnet } +          secgrp: +            - { get_resource: node-secgrp } +            - { get_resource: infra-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..9dcab3e60 --- /dev/null +++ b/playbooks/openstack/openshift-cluster/files/heat_stack_server.yaml @@ -0,0 +1,130 @@ +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 + +  subtype: +    type: string +    label: Sub-type +    description: Sub-type compute or infra for nodes, default otherwise +    default: default + +  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_replace: +            template: cluster_id-openshift-type +            params: +              cluster_id: { get_param: cluster_id } +              type:       { get_param: type } +        sub-host-type:    { get_param: subtype } + +  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..d36bdbf26 100644 --- a/playbooks/openstack/openshift-cluster/launch.yml +++ b/playbooks/openstack/openshift-cluster/launch.yml @@ -8,23 +8,125 @@    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 num_infra={{ num_infra }} +             -P master_image={{ deployment_vars[deployment_type].image }} +             -P node_image={{ deployment_vars[deployment_type].image }} +             -P infra_image={{ deployment_vars[deployment_type].image }} +             -P master_flavor={{ openstack_flavor["master"] }} +             -P node_flavor={{ openstack_flavor["node"] }} +             -P infra_flavor={{ openstack_flavor["infra"] }} +             -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 num_infra={{ num_infra }} +             -P master_image={{ deployment_vars[deployment_type].image }} +             -P node_image={{ deployment_vars[deployment_type].image }} +             -P infra_image={{ deployment_vars[deployment_type].image }} +             -P master_flavor={{ openstack_flavor["master"] }} +             -P node_flavor={{ openstack_flavor["node"] }} +             -P infra_flavor={{ openstack_flavor["infra"] }} +             -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, tag_sub-host-type_default' +    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, tag_sub-host-type_compute' +    with_together: +      - parsed_outputs.node_names +      - parsed_outputs.node_ips +      - parsed_outputs.node_floating_ips + +  - name: Add new infra 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, tag_sub-host-type_infra' +    with_together: +      - parsed_outputs.infra_names +      - parsed_outputs.infra_ips +      - parsed_outputs.infra_floating_ips + +  - name: Wait for ssh +    wait_for: +      host: '{{ item }}' +      port: 22 +    with_flattened: +      - parsed_outputs.master_floating_ips +      - parsed_outputs.node_floating_ips +      - parsed_outputs.infra_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 +      - parsed_outputs.infra_floating_ips  - include: update.yml diff --git a/playbooks/openstack/openshift-cluster/lookup_plugins b/playbooks/openstack/openshift-cluster/lookup_plugins new file mode 120000 index 000000000..ac79701db --- /dev/null +++ b/playbooks/openstack/openshift-cluster/lookup_plugins @@ -0,0 +1 @@ +../../../lookup_plugins
\ No newline at end of file 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..62df2be73 100644 --- a/playbooks/openstack/openshift-cluster/terminate.yml +++ b/playbooks/openstack/openshift-cluster/terminate.yml @@ -13,7 +13,16 @@        ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}"      with_items: groups[cluster_group] | default([]) -- hosts: oo_hosts_to_terminate +- name: Unsubscribe VMs +  hosts: oo_hosts_to_terminate +  vars_files: +  - vars.yml +  roles: +  - role: rhel_unsubscribe +    when: deployment_type == "enterprise" and +          ansible_distribution == "RedHat" and +          lookup('oo_option', 'rhel_skip_subscription') | default(rhsub_skip, True) | +            default('no', True) | lower in ['no', 'false']  - hosts: localhost    connection: local @@ -21,23 +30,18 @@    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/update.yml b/playbooks/openstack/openshift-cluster/update.yml index 5e7ab4e58..e006aa74a 100644 --- a/playbooks/openstack/openshift-cluster/update.yml +++ b/playbooks/openstack/openshift-cluster/update.yml @@ -11,7 +11,9 @@        groups: oo_hosts_to_update        ansible_ssh_user: "{{ deployment_vars[deployment_type].ssh_user }}"        ansible_sudo: "{{ deployment_vars[deployment_type].sudo }}" -    with_items: groups["tag_env-host-type_{{ cluster_id }}-openshift-master"] | union(groups["tag_env-host-type_{{ cluster_id }}-openshift-node"]) | default([]) +    with_items: (groups["tag_env-host-type_{{ cluster_id }}-openshift-master"] | default([])) +                | union(groups["tag_env-host-type_{{ cluster_id }}-openshift-node"] | default([])) +                | union(groups["tag_env-host-type_{{ cluster_id }}-openshift-etcd"] | default([]))  - include: ../../common/openshift-cluster/update_repos_and_packages.yml diff --git a/playbooks/openstack/openshift-cluster/vars.yml b/playbooks/openstack/openshift-cluster/vars.yml index c754f19fc..43e25f2e6 100644 --- a/playbooks/openstack/openshift-cluster/vars.yml +++ b/playbooks/openstack/openshift-cluster/vars.yml @@ -1,39 +1,37 @@  --- -openstack_infra_heat_stack:     "{{ opt_infra_heat_stack  | default('files/heat_stack.yml') }}" -openstack_network_prefix:       "{{ opt_network_prefix    | default('openshift-ansible-'+cluster_id) }}" -openstack_network_cidr:         "{{ opt_net_cidr          | default('192.168.' + ( ( 1048576 | random % 256 ) | string() ) + '.0/24') }}" -openstack_network_external_net: "{{ opt_external_net      | default('external') }}" -openstack_floating_ip_pools:    "{{ opt_floating_ip_pools | default('external')        | oo_split() }}" -openstack_network_dns:          "{{ opt_dns               | default('8.8.8.8,8.8.4.4') | oo_split() }}" -openstack_ssh_keypair:          "{{ opt_keypair           | default(lookup('env', 'LOGNAME')+'_key') }}" -openstack_ssh_public_key:       "{{ lookup('file', opt_public_key | default('~/.ssh/id_rsa.pub')) }}" -openstack_ssh_access_from:      "{{ opt_ssh_from          | default('0.0.0.0/0') }}" +openstack_infra_heat_stack:     "{{ lookup('oo_option', 'infra_heat_stack' ) | +                                    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'         ) | +                                    default('192.168.' + ( ( 1048576 | random % 256 ) | string() ) + '.0/24', True) }}" +openstack_network_external_net: "{{ lookup('oo_option', 'external_net'     ) | +                                    default('external',                      True) }}" +openstack_floating_ip_pools:    "{{ lookup('oo_option', 'floating_ip_pools') | +                                    default('external',                      True) | oo_split() }}" +openstack_network_dns:          "{{ lookup('oo_option', 'dns'              ) | +                                    default('8.8.8.8,8.8.4.4',               True) | oo_split() }}" +openstack_ssh_keypair:          "{{ lookup('oo_option', 'keypair'          ) | +                                    default(lookup('env', 'LOGNAME')+'_key', True) }}" +openstack_ssh_public_key:       "{{ lookup('file', lookup('oo_option', 'public_key') | +                                    default('~/.ssh/id_rsa.pub',             True)) }}" +openstack_ssh_access_from:      "{{ lookup('oo_option', 'ssh_from')          | +                                    default('0.0.0.0/0',                     True) }}"  openstack_flavor: -  master: -    ram:     "{{ opt_master_flavor_ram     | default(2048) }}" -    id:      "{{ opt_master_flavor_id      | default() }}" -    include: "{{ opt_master_flavor_include | default() }}" -  node: -    ram:     "{{ opt_node_flavor_ram     | default(4096) }}" -    id:      "{{ opt_node_flavor_id      | default() }}" -    include: "{{ opt_node_flavor_include | default() }}" +  master: "{{ lookup('oo_option', 'master_flavor'    ) | default('m1.small',  True) }}" +  infra:  "{{ lookup('oo_option', 'infra_flavor'     ) | default('m1.small',  True) }}" +  node:   "{{ lookup('oo_option', 'node_flavor'      ) | default('m1.medium', True) }}"  deployment_vars:    origin: -    image: -      name: "{{ opt_image_name | default('centos-70-raw') }}" -      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: "{{ opt_image_name | default('centos-70-raw') }}" -      id: +    image: "{{ lookup('oo_option', 'image_name') | default('rhel-guest-image-7.1-20150224.0.x86_64', True) }}"      ssh_user: openshift      sudo: yes  | 
