diff options
| author | Tomas Sedovic <tomas@sedovic.cz> | 2017-11-07 14:17:27 +1100 | 
|---|---|---|
| committer | Tomas Sedovic <tomas@sedovic.cz> | 2017-11-07 14:17:27 +1100 | 
| commit | 6f4d509817f200ec2a273a097f4f048da5997925 (patch) | |
| tree | ebddc919d850ec5c4d308613661063b01ae89784 /roles/openstack-stack | |
| parent | 0cf8cf65a89ad7cac8c1cef1f743426b610adae0 (diff) | |
| parent | 332f131e8e6457a03a4f1ab19abc8e4ceb897307 (diff) | |
| download | openshift-6f4d509817f200ec2a273a097f4f048da5997925.tar.gz openshift-6f4d509817f200ec2a273a097f4f048da5997925.tar.bz2 openshift-6f4d509817f200ec2a273a097f4f048da5997925.tar.xz openshift-6f4d509817f200ec2a273a097f4f048da5997925.zip  | |
Merge ../openshift-ansible-contrib into openstack-provider-githist
This moves all the OpenStack-related code from the -contrib[1] repo
including its git history to openshift-ansible. It will then be moved
around and updated to fit the rest of the project's structure.
[1]: https://github.com/openshift/openshift-ansible-contrib
Diffstat (limited to 'roles/openstack-stack')
| -rw-r--r-- | roles/openstack-stack/README.md | 9 | ||||
| -rw-r--r-- | roles/openstack-stack/defaults/main.yml | 21 | ||||
| -rw-r--r-- | roles/openstack-stack/meta/main.yml | 3 | ||||
| -rw-r--r-- | roles/openstack-stack/tasks/cleanup.yml | 6 | ||||
| -rw-r--r-- | roles/openstack-stack/tasks/generate-templates.yml | 26 | ||||
| -rw-r--r-- | roles/openstack-stack/tasks/main.yml | 27 | ||||
| -rw-r--r-- | roles/openstack-stack/tasks/subnet_update_dns_servers.yaml | 9 | ||||
| -rw-r--r-- | roles/openstack-stack/templates/heat_stack.yaml.j2 | 888 | ||||
| -rw-r--r-- | roles/openstack-stack/templates/heat_stack_server.yaml.j2 | 270 | ||||
| -rw-r--r-- | roles/openstack-stack/templates/user_data.j2 | 13 | ||||
| l--------- | roles/openstack-stack/test/roles | 1 | ||||
| -rw-r--r-- | roles/openstack-stack/test/stack-create-test.yml | 18 | 
12 files changed, 1291 insertions, 0 deletions
diff --git a/roles/openstack-stack/README.md b/roles/openstack-stack/README.md new file mode 100644 index 000000000..32a2b49f1 --- /dev/null +++ b/roles/openstack-stack/README.md @@ -0,0 +1,9 @@ +# Role openstack-stack + +Role for spinning up instances using OpenStack Heat. + +## To Test + +``` +ansible-playbook openshift-ansible-contrib/roles/openstack-stack/test/stack-create-test.yml +``` diff --git a/roles/openstack-stack/defaults/main.yml b/roles/openstack-stack/defaults/main.yml new file mode 100644 index 000000000..a24e684cc --- /dev/null +++ b/roles/openstack-stack/defaults/main.yml @@ -0,0 +1,21 @@ +--- + +stack_state: 'present' + +ssh_ingress_cidr: 0.0.0.0/0 +node_ingress_cidr: 0.0.0.0/0 +master_ingress_cidr: 0.0.0.0/0 +lb_ingress_cidr: 0.0.0.0/0 +bastion_ingress_cidr: 0.0.0.0/0 +num_etcd: 0 +num_masters: 1 +num_nodes: 1 +num_dns: 1 +num_infra: 1 +nodes_to_remove: [] +etcd_volume_size: 2 +dns_volume_size: 1 +lb_volume_size: 5 +use_bastion: False +ui_ssh_tunnel: False +provider_network: False diff --git a/roles/openstack-stack/meta/main.yml b/roles/openstack-stack/meta/main.yml new file mode 100644 index 000000000..fdda41bb3 --- /dev/null +++ b/roles/openstack-stack/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: +  - role: common diff --git a/roles/openstack-stack/tasks/cleanup.yml b/roles/openstack-stack/tasks/cleanup.yml new file mode 100644 index 000000000..258334a6b --- /dev/null +++ b/roles/openstack-stack/tasks/cleanup.yml @@ -0,0 +1,6 @@ +--- + +- name: cleanup temp files +  file: +    path: "{{ stack_template_pre.path }}" +    state: absent diff --git a/roles/openstack-stack/tasks/generate-templates.yml b/roles/openstack-stack/tasks/generate-templates.yml new file mode 100644 index 000000000..0ff50a095 --- /dev/null +++ b/roles/openstack-stack/tasks/generate-templates.yml @@ -0,0 +1,26 @@ +--- +- name: create HOT stack template prefix +  register: stack_template_pre +  tempfile: +    state: directory +    prefix: openshift-ansible + +- name: set template paths +  set_fact: +    stack_template_path: "{{ stack_template_pre.path }}/stack.yaml" +    user_data_template_path: "{{ stack_template_pre.path }}/user-data" + +- name: generate HOT stack template from jinja2 template +  template: +    src: heat_stack.yaml.j2 +    dest: "{{ stack_template_path }}" + +- name: generate HOT server template from jinja2 template +  template: +    src: heat_stack_server.yaml.j2 +    dest: "{{ stack_template_pre.path }}/server.yaml" + +- name: generate user_data from jinja2 template +  template: +    src: user_data.j2 +    dest: "{{ user_data_template_path }}" diff --git a/roles/openstack-stack/tasks/main.yml b/roles/openstack-stack/tasks/main.yml new file mode 100644 index 000000000..983567026 --- /dev/null +++ b/roles/openstack-stack/tasks/main.yml @@ -0,0 +1,27 @@ +--- + +- name: Generate the templates +  include: generate-templates.yml +  when: +  - stack_state == 'present' + +- name: Handle the Stack (create/delete) +  ignore_errors: False +  register: stack_create +  os_stack: +    name: "{{ stack_name }}" +    state: "{{ stack_state }}" +    template: "{{ stack_template_path | default(omit) }}" +    wait: yes + +# NOTE(bogdando) OS::Neutron::Subnet doesn't support live updates for +# dns_nameservers, so we can't do that for the "create stack" task. +- include: subnet_update_dns_servers.yaml +  when: +  - private_dns_server is defined +  - stack_state == 'present' + +- name: CleanUp +  include: cleanup.yml +  when: +  - stack_state == 'present' diff --git a/roles/openstack-stack/tasks/subnet_update_dns_servers.yaml b/roles/openstack-stack/tasks/subnet_update_dns_servers.yaml new file mode 100644 index 000000000..af28fc98f --- /dev/null +++ b/roles/openstack-stack/tasks/subnet_update_dns_servers.yaml @@ -0,0 +1,9 @@ +--- +- name: Live update the subnet's DNS servers +  os_subnet: +    name: openshift-ansible-{{ stack_name }}-subnet +    network_name: openshift-ansible-{{ stack_name }}-net +    state: present +    use_default_subnetpool: yes +    dns_nameservers: "{{ [private_dns_server|default(public_dns_nameservers[0])]|union(public_dns_nameservers)|unique }}" +  when: not provider_network diff --git a/roles/openstack-stack/templates/heat_stack.yaml.j2 b/roles/openstack-stack/templates/heat_stack.yaml.j2 new file mode 100644 index 000000000..2359842a5 --- /dev/null +++ b/roles/openstack-stack/templates/heat_stack.yaml.j2 @@ -0,0 +1,888 @@ +heat_template_version: 2016-10-14 + +description: OpenShift cluster + +parameters: + +outputs: + +  etcd_names: +    description: Name of the etcds +    value: { get_attr: [ etcd, name ] } + +  etcd_ips: +    description: IPs of the etcds +    value: { get_attr: [ etcd, private_ip ] } + +  etcd_floating_ips: +    description: Floating IPs of the etcds +    value: { get_attr: [ etcd, floating_ip ] } + +  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 ] } + +{% if num_dns|int > 0 %} +  dns_name: +    description: Name of the DNS +    value: +      get_attr: +        - dns +        - name + +  dns_floating_ips: +    description: Floating IPs of the DNS +    value: { get_attr: [ dns, floating_ip ] } + +  dns_private_ips: +    description: Private IPs of the DNS +    value: { get_attr: [ dns, private_ip ] } +{% endif %} + +conditions: +  no_floating: {% if provider_network or use_bastion|bool %}true{% else %}false{% endif %} + +resources: + +{% if not provider_network %} +  net: +    type: OS::Neutron::Net +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-net +          params: +            cluster_id: {{ stack_name }} + +  subnet: +    type: OS::Neutron::Subnet +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-subnet +          params: +            cluster_id: {{ stack_name }} +      network: { get_resource: net } +      cidr: +        str_replace: +          template: subnet_24_prefix.0/24 +          params: +            subnet_24_prefix: {{ subnet_prefix }} +      allocation_pools: +        - start: +            str_replace: +              template: subnet_24_prefix.3 +              params: +                subnet_24_prefix: {{ subnet_prefix }} +          end: +            str_replace: +              template: subnet_24_prefix.254 +              params: +                subnet_24_prefix: {{ subnet_prefix }} +      dns_nameservers: +{% for nameserver in dns_nameservers %} +        - {{ nameserver }} +{% endfor %} + +{% if openshift_use_flannel|default(False)|bool %} +  data_net: +    type: OS::Neutron::Net +    properties: +      name: openshift-ansible-{{ stack_name }}-data-net +      port_security_enabled: false + +  data_subnet: +    type: OS::Neutron::Subnet +    properties: +      name: openshift-ansible-{{ stack_name }}-data-subnet +      network: { get_resource: data_net } +      cidr: {{ osm_cluster_network_cidr|default('10.128.0.0/14') }} +      gateway_ip: null +{% endif %} + +  router: +    type: OS::Neutron::Router +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-router +          params: +            cluster_id: {{ stack_name }} +      external_gateway_info: +        network: {{ external_network }} + +  interface: +    type: OS::Neutron::RouterInterface +    properties: +      router_id: { get_resource: router } +      subnet_id: { get_resource: subnet } + +{% endif %} + +#  keypair: +#    type: OS::Nova::KeyPair +#    properties: +#      name: +#        str_replace: +#          template: openshift-ansible-cluster_id-keypair +#          params: +#            cluster_id: {{ stack_name }} +#      public_key: {{ ssh_public_key }} + +  common-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-common-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Basic ssh/icmp security group for cluster_id OpenShift cluster +          params: +            cluster_id: {{ stack_name }} +      rules: +        - direction: ingress +          protocol: tcp +          port_range_min: 22 +          port_range_max: 22 +          remote_ip_prefix: {{ ssh_ingress_cidr }} +{% if use_bastion|bool %} +        - direction: ingress +          protocol: tcp +          port_range_min: 22 +          port_range_max: 22 +          remote_ip_prefix: {{ bastion_ingress_cidr }} +{% endif %} +        - direction: ingress +          protocol: icmp +          remote_ip_prefix: {{ ssh_ingress_cidr }} + +{% if openstack_flat_secgrp|default(False)|bool %} +  flat-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-flat-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Security group for cluster_id OpenShift cluster +          params: +            cluster_id: {{ stack_name }} +      rules: +        - direction: ingress +          protocol: tcp +          port_range_min: 4001 +          port_range_max: 4001 +        - direction: ingress +          protocol: tcp +          port_range_min: {{ openshift_master_api_port|default(8443) }} +          port_range_max: {{ openshift_master_api_port|default(8443) }} +        - direction: ingress +          protocol: tcp +          port_range_min: {{ openshift_master_console_port|default(8443) }} +          port_range_max: {{ openshift_master_console_port|default(8443) }} +        - direction: ingress +          protocol: tcp +          port_range_min: 8053 +          port_range_max: 8053 +        - direction: ingress +          protocol: udp +          port_range_min: 8053 +          port_range_max: 8053 +        - direction: ingress +          protocol: tcp +          port_range_min: 24224 +          port_range_max: 24224 +        - direction: ingress +          protocol: udp +          port_range_min: 24224 +          port_range_max: 24224 +        - direction: ingress +          protocol: tcp +          port_range_min: 2224 +          port_range_max: 2224 +        - direction: ingress +          protocol: udp +          port_range_min: 5404 +          port_range_max: 5405 +        - direction: ingress +          protocol: tcp +          port_range_min: 9090 +          port_range_max: 9090 +        - direction: ingress +          protocol: tcp +          port_range_min: 2379 +          port_range_max: 2380 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: tcp +          port_range_min: 10250 +          port_range_max: 10250 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: udp +          port_range_min: 10250 +          port_range_max: 10250 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: tcp +          port_range_min: 10255 +          port_range_max: 10255 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: udp +          port_range_min: 10255 +          port_range_max: 10255 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: udp +          port_range_min: 4789 +          port_range_max: 4789 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: tcp +          port_range_min: 30000 +          port_range_max: 32767 +          remote_ip_prefix: {{ node_ingress_cidr }} +        - direction: ingress +          protocol: tcp +          port_range_min: 30000 +          port_range_max: 32767 +          remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24" +{% else %} +  master-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-master-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Security group for cluster_id OpenShift cluster master +          params: +            cluster_id: {{ stack_name }} +      rules: +        - direction: ingress +          protocol: tcp +          port_range_min: 4001 +          port_range_max: 4001 +        - direction: ingress +          protocol: tcp +          port_range_min: {{ openshift_master_api_port|default(8443) }} +          port_range_max: {{ openshift_master_api_port|default(8443) }} +        - direction: ingress +          protocol: tcp +          port_range_min: {{ openshift_master_console_port|default(8443) }} +          port_range_max: {{ openshift_master_console_port|default(8443) }} +        - direction: ingress +          protocol: tcp +          port_range_min: 8053 +          port_range_max: 8053 +        - direction: ingress +          protocol: udp +          port_range_min: 8053 +          port_range_max: 8053 +        - direction: ingress +          protocol: tcp +          port_range_min: 24224 +          port_range_max: 24224 +        - direction: ingress +          protocol: udp +          port_range_min: 24224 +          port_range_max: 24224 +        - direction: ingress +          protocol: tcp +          port_range_min: 2224 +          port_range_max: 2224 +        - direction: ingress +          protocol: udp +          port_range_min: 5404 +          port_range_max: 5405 +        - direction: ingress +          protocol: tcp +          port_range_min: 9090 +          port_range_max: 9090 +{% if openshift_use_flannel|default(False)|bool %} +        - direction: ingress +          protocol: tcp +          port_range_min: 2379 +          port_range_max: 2379 +{% endif %} + +  etcd-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-etcd-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Security group for cluster_id etcd cluster +          params: +            cluster_id: {{ stack_name }} +      rules: +        - direction: ingress +          protocol: tcp +          port_range_min: 2379 +          port_range_max: 2379 +          remote_mode: remote_group_id +          remote_group_id: { get_resource: master-secgrp } +        - direction: ingress +          protocol: tcp +          port_range_min: 2380 +          port_range_max: 2380 +          remote_mode: remote_group_id + +  node-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-node-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Security group for cluster_id OpenShift cluster nodes +          params: +            cluster_id: {{ stack_name }} +      rules: +        - direction: ingress +          protocol: tcp +          port_range_min: 10250 +          port_range_max: 10250 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: tcp +          port_range_min: 10255 +          port_range_max: 10255 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: udp +          port_range_min: 10255 +          port_range_max: 10255 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: udp +          port_range_min: 4789 +          port_range_max: 4789 +          remote_mode: remote_group_id +        - direction: ingress +          protocol: tcp +          port_range_min: 30000 +          port_range_max: 32767 +          remote_ip_prefix: {{ node_ingress_cidr }} +        - direction: ingress +          protocol: tcp +          port_range_min: 30000 +          port_range_max: 32767 +          remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24" +{% endif %} + +  infra-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-infra-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Security group for cluster_id OpenShift infrastructure cluster nodes +          params: +            cluster_id: {{ stack_name }} +      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 + +{% if num_dns|int > 0 %} +  dns-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: +        str_replace: +          template: openshift-ansible-cluster_id-dns-secgrp +          params: +            cluster_id: {{ stack_name }} +      description: +        str_replace: +          template: Security group for cluster_id cluster DNS +          params: +            cluster_id: {{ stack_name }} +      rules: +        - direction: ingress +          protocol: udp +          port_range_min: 53 +          port_range_max: 53 +          remote_ip_prefix: {{ node_ingress_cidr }} +        - direction: ingress +          protocol: udp +          port_range_min: 53 +          port_range_max: 53 +          remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24" +        - direction: ingress +          protocol: tcp +          port_range_min: 53 +          port_range_max: 53 +          remote_ip_prefix: {{ node_ingress_cidr }} +        - direction: ingress +          protocol: tcp +          port_range_min: 53 +          port_range_max: 53 +          remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24" +{% endif %} + +{% if num_masters|int > 1 or ui_ssh_tunnel|bool %} +  lb-secgrp: +    type: OS::Neutron::SecurityGroup +    properties: +      name: openshift-ansible-{{ stack_name }}-lb-secgrp +      description: Security group for {{ stack_name }} cluster Load Balancer +      rules: +      - direction: ingress +        protocol: tcp +        port_range_min: {{ openshift_master_api_port | default(8443) }} +        port_range_max: {{ openshift_master_api_port | default(8443) }} +        remote_ip_prefix: {{ lb_ingress_cidr | default(bastion_ingress_cidr) }} +{% if ui_ssh_tunnel|bool %} +      - direction: ingress +        protocol: tcp +        port_range_min: {{ openshift_master_api_port | default(8443) }} +        port_range_max: {{ openshift_master_api_port | default(8443) }} +        remote_ip_prefix: {{ ssh_ingress_cidr }} +{% endif %} +{% if openshift_master_console_port is defined and openshift_master_console_port != openshift_master_api_port %} +      - direction: ingress +        protocol: tcp +        port_range_min: {{ openshift_master_console_port | default(8443) }} +        port_range_max: {{ openshift_master_console_port | default(8443) }} +        remote_ip_prefix: {{ lb_ingress_cidr | default(bastion_ingress_cidr) }} +{% endif %} +{% endif %} + +  etcd: +    type: OS::Heat::ResourceGroup +    properties: +      count: {{ num_etcd }} +      resource_def: +        type: server.yaml +        properties: +          name: +            str_replace: +              template: k8s_type-%index%.cluster_id +              params: +                cluster_id: {{ stack_name }} +                k8s_type: {{ etcd_hostname | default('etcd') }} +          cluster_env: {{ public_dns_domain }} +          cluster_id:  {{ stack_name }} +          group: +            str_replace: +              template: k8s_type.cluster_id +              params: +                k8s_type: etcds +                cluster_id: {{ stack_name }} +          type:        etcd +          image:       {{ openstack_etcd_image | default(openstack_image) }} +          flavor:      {{ etcd_flavor }} +          key_name:    {{ ssh_public_key }} +{% if provider_network %} +          net:         {{ provider_network }} +          net_name:         {{ provider_network }} +{% else %} +          net:         { get_resource: net } +          subnet:      { get_resource: subnet } +          net_name: +            str_replace: +              template: openshift-ansible-cluster_id-net +              params: +                cluster_id: {{ stack_name }} +{% endif %} +          secgrp: +            - { get_resource: {% if openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}etcd-secgrp{% endif %} } +            - { get_resource: common-secgrp } +          floating_network: +            if: +              - no_floating +              - null +              - {{ external_network }} +{% if use_bastion|bool or provider_network %} +          attach_float_net: false +{% endif %} +          volume_size: {{ etcd_volume_size }} +{% if not provider_network %} +    depends_on: +      - interface +{% endif %} + +{% if master_server_group_policies|length > 0 %} +  master_server_group: +    type: OS::Nova::ServerGroup +    properties: +      name: master_server_group +      policies: {{ master_server_group_policies }} +{% endif %} +{% if infra_server_group_policies|length > 0 %} +  infra_server_group: +    type: OS::Nova::ServerGroup +    properties: +      name: infra_server_group +      policies: {{ infra_server_group_policies }} +{% endif %} +{% if num_masters|int > 1 %} +  loadbalancer: +    type: OS::Heat::ResourceGroup +    properties: +      count: 1 +      resource_def: +        type: server.yaml +        properties: +          name: +            str_replace: +              template: k8s_type-%index%.cluster_id +              params: +                cluster_id: {{ stack_name }} +                k8s_type: {{ lb_hostname | default('lb') }} +          cluster_env: {{ public_dns_domain }} +          cluster_id:  {{ stack_name }} +          group: +            str_replace: +              template: k8s_type.cluster_id +              params: +                k8s_type: lb +                cluster_id: {{ stack_name }} +          type:        lb +          image:       {{ openstack_lb_image | default(openstack_image) }} +          flavor:      {{ lb_flavor }} +          key_name:    {{ ssh_public_key }} +{% if provider_network %} +          net:         {{ provider_network }} +          net_name:         {{ provider_network }} +{% else %} +          net:         { get_resource: net } +          subnet:      { get_resource: subnet } +          net_name: +            str_replace: +              template: openshift-ansible-cluster_id-net +              params: +                cluster_id: {{ stack_name }} +{% endif %} +          secgrp: +            - { get_resource: lb-secgrp } +            - { get_resource: common-secgrp } +{% if not provider_network %} +          floating_network: {{ external_network }} +{% endif %} +          volume_size: {{ lb_volume_size }} +{% if not provider_network %} +    depends_on: +      - interface +{% endif %} +{% endif %} + +  masters: +    type: OS::Heat::ResourceGroup +    properties: +      count: {{ num_masters }} +      resource_def: +        type: server.yaml +        properties: +          name: +            str_replace: +              template: k8s_type-%index%.cluster_id +              params: +                cluster_id: {{ stack_name }} +                k8s_type: {{ master_hostname | default('master')}} +          cluster_env: {{ public_dns_domain }} +          cluster_id:  {{ stack_name }} +          group: +            str_replace: +              template: k8s_type.cluster_id +              params: +                k8s_type: masters +                cluster_id: {{ stack_name }} +          type:        master +          image:       {{ openstack_master_image | default(openstack_image) }} +          flavor:      {{ master_flavor }} +          key_name:    {{ ssh_public_key }} +{% if provider_network %} +          net:         {{ provider_network }} +          net_name:         {{ provider_network }} +{% else %} +          net:         { get_resource: net } +          subnet:      { get_resource: subnet } +          net_name: +            str_replace: +              template: openshift-ansible-cluster_id-net +              params: +                cluster_id: {{ stack_name }} +{% if openshift_use_flannel|default(False)|bool %} +          attach_data_net: true +          data_net:    { get_resource: data_net } +          data_subnet: { get_resource: data_subnet } +{% endif %} +{% endif %} +          secgrp: +{% if openstack_flat_secgrp|default(False)|bool %} +            - { get_resource: flat-secgrp } +{% else %} +            - { get_resource: master-secgrp } +            - { get_resource: node-secgrp } +{% if num_etcd|int == 0 %} +            - { get_resource: etcd-secgrp } +{% endif %} +{% endif %} +            - { get_resource: common-secgrp } +          floating_network: +            if: +              - no_floating +              - null +              - {{ external_network }} +{% if use_bastion|bool or provider_network %} +          attach_float_net: false +{% endif %} +          volume_size: {{ master_volume_size }} +{% if master_server_group_policies|length > 0 %} +          scheduler_hints: +            group: { get_resource: master_server_group } +{% endif %} +{% if not provider_network %} +    depends_on: +      - interface +{% endif %} + +  compute_nodes: +    type: OS::Heat::ResourceGroup +    properties: +      count: {{ num_nodes }} +      removal_policies: +      - resource_list: {{ nodes_to_remove }} +      resource_def: +        type: server.yaml +        properties: +          name: +            str_replace: +              template: sub_type_k8s_type-%index%.cluster_id +              params: +                cluster_id: {{ stack_name }} +                sub_type_k8s_type: {{ node_hostname | default('app-node') }} +          cluster_env: {{ public_dns_domain }} +          cluster_id:  {{ stack_name }} +          group: +            str_replace: +              template: k8s_type.cluster_id +              params: +                k8s_type: nodes +                cluster_id: {{ stack_name }} +          type:        node +          subtype:     app +          node_labels: +{% for k, v in openshift_cluster_node_labels.app.iteritems() %} +            {{ k|e }}: {{ v|e }} +{% endfor %} +          image:       {{ openstack_node_image | default(openstack_image) }} +          flavor:      {{ node_flavor }} +          key_name:    {{ ssh_public_key }} +{% if provider_network %} +          net:         {{ provider_network }} +          net_name:         {{ provider_network }} +{% else %} +          net:         { get_resource: net } +          subnet:      { get_resource: subnet } +          net_name: +            str_replace: +              template: openshift-ansible-cluster_id-net +              params: +                cluster_id: {{ stack_name }} +{% if openshift_use_flannel|default(False)|bool %} +          attach_data_net: true +          data_net:    { get_resource: data_net } +          data_subnet: { get_resource: data_subnet } +{% endif %} +{% endif %} +          secgrp: +            - { get_resource: {% if openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}node-secgrp{% endif %} } +            - { get_resource: common-secgrp } +          floating_network: +            if: +              - no_floating +              - null +              - {{ external_network }} +{% if use_bastion|bool or provider_network %} +          attach_float_net: false +{% endif %} +          volume_size: {{ node_volume_size }} +{% if not provider_network %} +    depends_on: +      - interface +{% endif %} + +  infra_nodes: +    type: OS::Heat::ResourceGroup +    properties: +      count: {{ num_infra }} +      resource_def: +        type: server.yaml +        properties: +          name: +            str_replace: +              template: sub_type_k8s_type-%index%.cluster_id +              params: +                cluster_id: {{ stack_name }} +                sub_type_k8s_type: {{ infra_hostname | default('infranode') }} +          cluster_env: {{ public_dns_domain }} +          cluster_id:  {{ stack_name }} +          group: +            str_replace: +              template: k8s_type.cluster_id +              params: +                k8s_type: infra +                cluster_id: {{ stack_name }} +          type:        node +          subtype:     infra +          node_labels: +{% for k, v in openshift_cluster_node_labels.infra.iteritems() %} +            {{ k|e }}: {{ v|e }} +{% endfor %} +          image:       {{ openstack_infra_image | default(openstack_image) }} +          flavor:      {{ infra_flavor }} +          key_name:    {{ ssh_public_key }} +{% if provider_network %} +          net:         {{ provider_network }} +          net_name:         {{ provider_network }} +{% else %} +          net:         { get_resource: net } +          subnet:      { get_resource: subnet } +          net_name: +            str_replace: +              template: openshift-ansible-cluster_id-net +              params: +                cluster_id: {{ stack_name }} +{% if openshift_use_flannel|default(False)|bool %} +          attach_data_net: true +          data_net:    { get_resource: data_net } +          data_subnet: { get_resource: data_subnet } +{% endif %} +{% endif %} +          secgrp: +# TODO(bogdando) filter only required node rules into infra-secgrp +{% if openstack_flat_secgrp|default(False)|bool %} +            - { get_resource: flat-secgrp } +{% else %} +            - { get_resource: node-secgrp } +{% endif %} +{% if ui_ssh_tunnel|bool and num_masters|int < 2 %} +            - { get_resource: lb-secgrp } +{% endif %} +            - { get_resource: infra-secgrp } +            - { get_resource: common-secgrp } +{% if not provider_network %} +          floating_network: {{ external_network }} +{% endif %} +          volume_size: {{ infra_volume_size }} +{% if infra_server_group_policies|length > 0 %} +          scheduler_hints: +            group: { get_resource: infra_server_group } +{% endif %} +{% if not provider_network %} +    depends_on: +      - interface +{% endif %} + +{% if num_dns|int > 0 %} +  dns: +    type: OS::Heat::ResourceGroup +    properties: +      count: {{ num_dns }} +      resource_def: +        type: server.yaml +        properties: +          name: +            str_replace: +              template: k8s_type-%index%.cluster_id +              params: +                cluster_id: {{ stack_name }} +                k8s_type: {{ dns_hostname | default('dns') }} +          cluster_env: {{ public_dns_domain }} +          cluster_id:  {{ stack_name }} +          group: +            str_replace: +              template: k8s_type.cluster_id +              params: +                k8s_type: dns +                cluster_id: {{ stack_name }} +          type:        dns +          image:       {{ openstack_dns_image | default(openstack_image) }} +          flavor:      {{ dns_flavor }} +          key_name:    {{ ssh_public_key }} +{% if provider_network %} +          net:         {{ provider_network }} +          net_name:         {{ provider_network }} +{% else %} +          net:         { get_resource: net } +          subnet:      { get_resource: subnet } +          net_name: +            str_replace: +              template: openshift-ansible-cluster_id-net +              params: +                cluster_id: {{ stack_name }} +{% endif %} +          secgrp: +            - { get_resource: dns-secgrp } +            - { get_resource: common-secgrp } +{% if not provider_network %} +          floating_network: {{ external_network }} +{% endif %} +          volume_size: {{ dns_volume_size }} +{% if not provider_network %} +    depends_on: +      - interface +{% endif %} +{% endif %} diff --git a/roles/openstack-stack/templates/heat_stack_server.yaml.j2 b/roles/openstack-stack/templates/heat_stack_server.yaml.j2 new file mode 100644 index 000000000..9ffe721a5 --- /dev/null +++ b/roles/openstack-stack/templates/heat_stack_server.yaml.j2 @@ -0,0 +1,270 @@ +heat_template_version: 2016-10-14 + +description: OpenShift cluster server + +parameters: + +  name: +    type: string +    label: Name +    description: Name + +  group: +    type: string +    label: Host Group +    description: The Primary Ansible Host Group +    default: host + +  cluster_env: +    type: string +    label: Cluster environment +    description: Environment of the cluster + +  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 + +{% if not provider_network %} +  subnet: +    type: string +    label: Subnet ID +    description: Subnet resource +{% endif %} + +{% if openshift_use_flannel|default(False)|bool %} +  attach_data_net: +    type: boolean +    default: false +    label: Attach-data-net +    description: A switch for data port connection + +  data_net: +    type: string +    default: '' +    label: Net ID +    description: Net resource + +{% if not provider_network %} +  data_subnet: +    type: string +    default: '' +    label: Subnet ID +    description: Subnet resource +{% endif %} +{% endif %} + +  secgrp: +    type: comma_delimited_list +    label: Security groups +    description: Security group resources + +  attach_float_net: +    type: boolean +    default: true + +    label: Attach-float-net +    description: A switch for floating network port connection + +{% if not provider_network %} +  floating_network: +    type: string +    default: '' +    label: Floating network +    description: Network to allocate floating IP from +{% endif %} + +  availability_zone: +    type: string +    description: The Availability Zone to launch the instance. +    default: nova + +  volume_size: +    type: number +    description: Size of the volume to be created. +    default: 1 +    constraints: +      - range: { min: 1, max: 1024 } +        description: must be between 1 and 1024 Gb. + +  node_labels: +    type: json +    description: OpenShift Node Labels +    default: {"region": "default" } + +  scheduler_hints: +    type: json +    description: Server scheduler hints. +    default: {} + +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 } +{% if provider_network %} +        - 0 +{% else %} +        - 1 +{% endif %} +        - addr + +conditions: +  no_floating: {not: { get_param: attach_float_net} } +{% if openshift_use_flannel|default(False)|bool %} +  no_data_subnet: {not: { get_param: attach_data_net} } +{% endif %} + +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: +{% if openshift_use_flannel|default(False)|bool %} +        if: +          - no_data_subnet +{% if use_trunk_ports|default(false)|bool %} +          - - port:  { get_attr: [trunk-port, port_id] } +{% else %} +          - - port:  { get_resource: port } +{% endif %} +{% if use_trunk_ports|default(false)|bool %} +          - - port:  { get_attr: [trunk-port, port_id] } +{% else %} +          - - port:  { get_resource: port } +            - port:  { get_resource: data_port } +{% endif %} + +{% else %} +{% if use_trunk_ports|default(false)|bool %} +        - port:  { get_attr: [trunk-port, port_id] } +{% else %} +        - port:  { get_resource: port } +{% endif %} +{% endif %} +      user_data: +        get_file: user-data +      user_data_format: RAW +      user_data_update_policy: IGNORE +      metadata: +        group: { get_param: group } +        environment: { get_param: cluster_env } +        clusterid: { get_param: cluster_id } +        host-type: { get_param: type } +        sub-host-type:    { get_param: subtype } +        node_labels: { get_param: node_labels } +      scheduler_hints: { get_param: scheduler_hints } + +{% if use_trunk_ports|default(false)|bool %} +  trunk-port: +    type: OS::Neutron::Trunk +    properties: +      name: { get_param: name } +      port: { get_resource: port } +{% endif %} + +  port: +    type: OS::Neutron::Port +    properties: +      network: { get_param: net } +{% if not provider_network %} +      fixed_ips: +        - subnet: { get_param: subnet } +{% endif %} +      security_groups: { get_param: secgrp } + +{% if openshift_use_flannel|default(False)|bool %} +  data_port: +    type: OS::Neutron::Port +    condition: { not: no_data_subnet } +    properties: +      network: { get_param: data_net } +      port_security_enabled: false +{% if not provider_network %} +      fixed_ips: +        - subnet: { get_param: data_subnet } +{% endif %} +{% endif %} + +{% if not provider_network %} +  floating-ip: +    condition: { not: no_floating } +    type: OS::Neutron::FloatingIP +    properties: +      floating_network: { get_param: floating_network } +      port_id: { get_resource: port } +{% endif %} + +{% if not ephemeral_volumes|default(false)|bool %} +  cinder_volume: +    type: OS::Cinder::Volume +    properties: +      size: { get_param: volume_size } +      availability_zone: { get_param: availability_zone } + +  volume_attachment: +    type: OS::Cinder::VolumeAttachment +    properties: +      volume_id: { get_resource: cinder_volume } +      instance_uuid: { get_resource: server } +      mountpoint: /dev/sdb +{% endif %} diff --git a/roles/openstack-stack/templates/user_data.j2 b/roles/openstack-stack/templates/user_data.j2 new file mode 100644 index 000000000..eb65f7cec --- /dev/null +++ b/roles/openstack-stack/templates/user_data.j2 @@ -0,0 +1,13 @@ +#cloud-config +disable_root: true + +system_info: +  default_user: +    name: openshift +    sudo: ["ALL=(ALL) NOPASSWD: ALL"] + +write_files: +  - path: /etc/sudoers.d/00-openshift-no-requiretty +    permissions: 440 +    content: | +      Defaults:openshift !requiretty diff --git a/roles/openstack-stack/test/roles b/roles/openstack-stack/test/roles new file mode 120000 index 000000000..e2b799b9d --- /dev/null +++ b/roles/openstack-stack/test/roles @@ -0,0 +1 @@ +../../../roles/
\ No newline at end of file diff --git a/roles/openstack-stack/test/stack-create-test.yml b/roles/openstack-stack/test/stack-create-test.yml new file mode 100644 index 000000000..d80472193 --- /dev/null +++ b/roles/openstack-stack/test/stack-create-test.yml @@ -0,0 +1,18 @@ +--- +- hosts: localhost +  gather_facts: True +  become: False +  roles: +  - role: openstack-stack +    stack_name: test-stack +    dns_domain: "{{ public_dns_domain }}" +    dns_nameservers: "{{ public_dns_nameservers }}" +    subnet_prefix: "{{ openstack_subnet_prefix }}" +    ssh_public_key: "{{ openstack_ssh_public_key }}" +    openstack_image: "{{ openstack_default_image_name }}" +    etcd_flavor: "{{ openstack_default_flavor }}" +    master_flavor: "{{ openstack_default_flavor }}" +    node_flavor: "{{ openstack_default_flavor }}" +    infra_flavor: "{{ openstack_default_flavor }}" +    dns_flavor: "{{ openstack_default_flavor }}" +    external_network: "{{ openstack_external_network_name }}"  | 
