Skip to content

Commit

Permalink
Add an Openstack provider (openshift#397)
Browse files Browse the repository at this point in the history
* First cut at the rhc-ose-ansible structure

* New OSE3 docker host builder and OpenStack ansible provisioning support

* Support for supplying flavor name and moved around variables

* Refactored OpenStack provisioning to be a generic role. Created OpenShift specific playbook

* Registry Role for ansible playbooks

* Added immediate=yes to have firwalld port take affect; restructured registry role; changed true to yes in module parameters

* added post_install role

* adding playbook

* Migration of CICD server provisioning to Ansible

* Adding nginx auth layer

* Removing key name from registry

* Refactoring and renaming

* adding openshift-ansible's post install roles

* removing deprecated files

* Shell for role variable info

* removing extra files

* Add OpenStack SSH key parameter check

* Replacing yum commands and normalizing comments

* fixed README

* Renaming template files with .j2 for clarity

* Add OpenStack security group detection and creation resolves openshift#106

* Change to using split to iterate and SSH rule create only once

* Reorder instances names to sort by env_id

* Change default_env_id of "testenv" to local env OS_USERNAME resolves openshift#142

* Prepend 'casl' to default_env_id

* Add connection test to OpenStack before proceeding

* First cut at DNS ansible roles

* Updated defaults and tasks for dns-server

* Add subscription-manager support for Hosted or Satellite

* Refactor role to dynamically determine rhsm_method

* Removes rhsm_method
* Renames rhsm_server to rhsm_satellite
* Add additional pre_task checks (hosted + key)
* Change conditionals from rhsm_method check to rhsm_satellite defined
* Change repos disable/enable from key to if repos are defined
* Update README and examples in inventory file

* Fix bad syntax with extra 'and' in when using rhsm_pool

* Refactor use of rhsm_password to prevent display to CLI

* Cosmetic changes to task names and move yum clean all to prereqs

* Remove vars_prompt, add info to README to re-enable and for ansible-vault

* Add openstack pre_tasks and ansible_sudo when calling role

* Add deprovision playbook using nova list with sanity checks

- Add minimum length check for env_id
- Add max_instances check
- Remove dynamic openstack.py inventory
- Add override to bypass checks

* Refactor debug flag to be dry_run and other small changes

- Removed debug statements and instead display on pause prompt
- Moved to playbooks directory

* Add ansible_sudo: true to subscription-manager task

* This matches PR#133 enabling ansible_sudo: true when calling that role
* Also changes max_instances check from >= to just > to allow 2 full default environments to be removed (6 max_instances)

* Updated to fix broken/missing 'defaults'...

* Add unique image logic and rename playbook to terminate.yml

* Add OSE provision prerequisites

- Install required packages
- Update pacakges (moved from main.yml)
- Install and disable firewalld
- Install iptables-services and disable iptables
- Verify and set hostname if needed

* Add SELinux check and fail if not enforcing

* Remove getenforce and firewall tasks and use facts

- Uses Ansible collected facts to determine SELinux status
- Adds ansible_sudo: true when calling role
- Adds tag to role when calling it

* Add docker role

- Largely taken from cicd docker.yml
- Changed to using a template for docker-storage-setup
- Using variables for both DEV and VG defined in defaults
- Using pvs command to check for use of DEV and VG before proceeding

* Add org parameter to Satellite with user/pass

* Fix typo in task name

* Updated dns-server role based on feedback

* Changes by JayKayy for a full provision of OpenShift on OpenStack

* Role for disconnected git server

* Added additional yum dependency and corrected spelling

* Added example of disconnected git inventory file

* Changes to allow runs from inside a container. Also allows for running upstream openshift-ansible installer

* Reverting previous commit and making template adjustments

* Subscription manager role should accomodate orgs with spaces

* Fixing unescaped newline

* Channging hard coded host groups to match openshift-ansible expected host groups. Importing byo playbook now instead of nested ansible run. Need to refactor how we generate hostnames to make it fit this.

* Updated to run as root rather than cloud-user, for now...

* Updated inventory template to include openshift_hostname and openshift_public_hostname

* Wrapping in a script to tie the two playbooks together

* Updating ose-provision with DNS workarounds / fixes

* Removed spaces causing issues...

* DNS fix to support OSEv3.2

* Add floating IP support when using Neutron

* Updated to remove repos from playbook + fix typo

* Cleande up hostname role to make it more generic

* Image name for DNS server becomes configurable.

* Updated inventory and template file to make cluster config optional

* Removing temporary file

* Loosen up the DNS server a bit to allow for ETL OSP installs

* Re-implements original subscription-manager role invokation that was
removed in PR# 168.

* Enhanced provisioning script with better error checking, diretory awareness, and improved help output

* Should be looking for generated inventory file in SCRIPTS_BASE_DIR

* Add Neutron floating IP support for Issue openshift#195

* Add check for and set_fact if Neutron is in use which is used by several tasks
* This PR was originally longer and contained the now split off PR openshift#197

* first attempt at securing the registry

* Minor updates for ansible 2.1 compatibility

* Updated CICD implementation to support ETL OSP env

* Updated OSE inventory file with some clean-up

* Add enhancements for for terminate playbook

* Fixes Issue openshift#206
* Add check for valid item when attempting to delete objects
* Add debug on all variables when using dry_run
* Changed default ansible_ssh_user to cloud-user in line with standard cloud guest image
* Add count for ips and volumes to display since these may not always be the same as instance count
* Enhance displayed warning/note message to include new counts
* It is possible for an instance to not have a floating IP for whatever reason (such as manually deallocating or releasing the IP), in this case SSH will not work to the instance so it will not be included in the host group to attempt subscription manager unregister, but will still be deleted
* It is possible that an instance will have a volume created but not attached. In this case as a precautionary measure I am excluding these unattached volumes from the deletion in case this was intentionally detached to preserve data. We can further discuss if this should be a parameter to override instead or if we need to change this behavior.
* Excluded instances in ERROR state as they will most likely not delete. We can discuss if this should be parameterized instead.
* Added prompt variable defaulted to true but can be set to false
* Added unregister variable defaulted to true but can be set to false

* Adding NFS support and fixing template labels so we get a router and registry out of the box.

* testing changes

* tested changes

* fixing defaults and removing host from test playbook

* adding clenaup test book and fixed typo

* Allow passing of ansible extra-vars in provisioning script

* Change --environment to --extra-vars and add usage.

* added check for already secured registry and uses actualy openshift_common dependency

* fixed readiness probe by adding logic for 3.1 vs 3.2

* Fix malformed file to address Issue openshift#210

* Pulling out file paths into variables to account for containerized installs

* fixed error message logic for already secured registry

* added tasks to disable and re-enable deployment triggers, remove debug task

* Fixes Issue openshift#163 if rhsm_password is not defined

* Adding a post-install playbook with secure-registry and ssh key sync.

* Node storage now uses node specific storage var; search for generated inventory file sorts by timestamp not name

* Initial commit exposing registry service

* move registry_hostname to inventory

* Updated env_id to be a sub-domain + make the logic a bit more flexible

* Enabled default subdomain/'apps'

* Updated inventory template file to include 'openshift_deployment_type'

* Adding LDAP and HTPasswd examples for an auth provider to base inventory file

* Fixing port number in LDAP example

* Refactor OpenStack security group creation

* Adds new openstack-security-groups role
* Addresses Issue openshift#211 and adds all instances to default group
* Defines default security group variable with all groups/rules
* Sets security group variables per type (master,node,nfs,dns)
* Supports specifying no security group for a type (e.g. nfs)
* Uses new Ansible 2.x modules

* Refactor to playbook and split data structure out

* Split single security group variable into one per type
* Moves 'default' security group from role into variable
* Moves default security group variables back to openshift-common role
* Converts openstack-security-group role into playbook
* Playbook called on every openstack-create invocation as before
* Simplifies security group tasks and removes type bhecking
* Iterate through seucrity groups and build a comma-separated list of groups

* Add detection of non-Neutron env

* Add UDP 8053 to default master security group

* Adjusting docker role, adding support for logging/metrics, and updating client container

* OpenShift Management Role

* Fixing ansible impl to work with OSP9 and ansible 2.2

* Correcting formatting

* Added process / contribution info

* Updated default security group rules (openshift#7)

* Openstack heat (openshift#2)

* Adding a role to invoke openstack heat

* Adding readme

* Pulling parameters out to inventory file

* start of end-to-end playbook

* More enhancements and refactoring to make dynamic inventory the driver for an openshift install

* Switching to variable substituted path to config.yaml playbook

* Changes to allow defining of number of nodes/infranodes.

* Added labels to inventory

* Start of end-to-end functionality

* Enhancements to support openstack heat provisioning

* Updating inventory sample to remove some deprecation warnings

* Working towards making the secure-registry role 'become' aware

* Fixing node labels and removing secure-registry as it's no longer needed

* No longer need insecure registry line, as installer will secure our registry

* Adjusted dynamic inventory to filter by clusterid

* Minor updates to dynamic inventory bug

* Adding a refactored sample inventory directory

* Refactoring playbooks for better directory structure, and to narrow down host groups

* Adding volume mounts to heat template

* Moving dns playbooks back to original location

* Fixing incorrect file path

* Cleaning up inventory samples

* One more hostname to clean up

* Changing var name

* changed openshift-provision to openshift-prep

* Adjusting current provision script to avoid breakage by new openstack-heat code

* Updating PR Template with Team mention (openshift#10)

* Install playbook defaults to the assumption that casl-ansible and openshift-ansible are checked out to the same directory

* Removing unnecessary task

* Fixing two significant bugs in the HEAT deployment (openshift#13)

* Updated values in sample inventory (openshift#17)

* Adding documentation and docker containers so others can begin testin… (openshift#16)

* Adding documentation and docker containers so others can begin testing cluster provisioning

* Making updates per comments by @oybed

* Fixing formatting changes for links

* Renaming openstack images to align with CoP naming (openshift#18)

* Defaulting the DNS instance to a small flavor (openshift#20)

* Nagios (openshift#11)

* First cut at the nagios work

* Added NRPE service enabled

* Updated implementation to be a bit more flexible

* Updated logic to include checks for services

* Added support for DNS and NFS checks

* Updated templates and config files

* Updated check_service script to simplify and avoid false negatives

* Added support for OpenShift checks

* Added README for the playbook

* Updated README

* DNS server should NOT run docker (openshift#25)

* Readme (openshift#26)

* Updated documentation and example inventory

* Update README.md

Added "hint"

* Update README.md

Fix numbering in the markdown

* Update README.md

* Added docker_volume_size to the sample inventory

* Added rhsm_pool to the sample inventory

* Updated README per comments

* Ensure DNS configuration has wildcards set for infra nodes (openshift#24)

* Ensure DNS configuration has wildcards set for infra nodes

* Updated to include all cluster hosts for DNS entries

* Updated DNS server role + example playbook (openshift#27)

* Updated DNS server role + example playbook

* Updated DNS server role + example playbook

* Dns selinux (openshift#28)

* Updated DNS server role + example playbook

* Updated DNS server role + example playbook

* Updated for SELinux boolean

* Openshift mgmt (openshift#30)

Added prune_projects to the openshift-management role along with Ansible tower support

* Created initial CHANGELOG.md

* Updating to development release of ansible 2.3.0 to pull down bug fixes in HEAT module (openshift#21)

* Workaround for Ansible 2.3 breakage (openshift#31)

* Added quotes where needed and fixed some other minor bugs (openshift#33)

* Fixing awk check (openshift#34)

* Updating client image to lock it to ansible 2.3 and install some addi… (openshift#32)

* Updating client image to lock it to ansible 2.3 and install some additional dependencies

* First attempt at a docker-compose based solution

* Renaming image

* Stack refactor (openshift#38)

* Refactored openstack-stack role to:

- Convert static heat template files to ansible templates
- Include native ansible groups via openstack metadata. This removes the need for a playbook to map host groups
- Some code cleanup

* Deleting commentd out code and irrelevant plays

* Refactored openstack-stack role to:

- Convert static heat template files to ansible templates
- Include native ansible groups via openstack metadata. This removes the need for a playbook to map host groups
- Some code cleanup

* Deleting commentd out code and irrelevant plays

* Replacing stack parameters with jinja expressions

* Updating sample inventory to work with latest dynamic inventory changes

* updating inventory with host group mapping. making sync keys optional

* Missing cluster_hosts group

* Updating to add infra_hosts

* Updating inventory per comments from oybed and sabre1041

* First attempt at a simple multi-master support (openshift#39)

* First attempt at a simple multi-master support

* Removing unneeded inventory

* adding default number of masters and lower number of nodes

* Some fixes (openshift#41)

* Fix the sample inventory

The `openstack_nameservers` variable needs to be a list of strings, we
need to set the Openshift labels in OSv3.yml and we show an example of
using the username/password/poll for RHEL subscriptions.

* Update the READMEs

This fixes some of the paths, explains that we need to pass
`openstack_ssh_public_key` to the end-to-end playbook and includes the
full Docker command since there is no `run.sh` script.  Oh and Heat is
not an acronym :).

* Fixes to the readme and inventory

* Use docker-compose

* Correcting the sample inventory for an HA cluster (openshift#40)

* Correcting the sample inventory for an HA cluster

* Adding node label mapping

* Updating to mre generic IPs

* Updating to OSP ocata repo, as there are some bugs with newton's channel (openshift#44)

* Use the correct variable name in create_users (openshift#43)

The user creation was failing, because it was looking for the
`demo_users` variable while the samples put the data under
`create_users`.

* Upgrading jinja2 to work correctly with latest templates (openshift#45)

* Fix rpm deps (openshift#46)

* Upgrading jinja2 to work correctly with latest templates

* Updated to solve rpm deps + other version issues

* Clean-up

* Updating control-host settings and env

* Updating control-host settings and env

* Updating README and names to align across all components

* Setting the TERM var for better shell experience

* Conditionally set the openshift_master_default_subdomain to avoid overriding it unecessary (openshift#47)

* Update README.md

* Update CASL to use nsupdate for DNS records (openshift#48)

* Updated to use nsupdate for DNS records

* Updated formatting of dict

* Updating descriptive text

* Support for external DNS config

* Upgrading jinja2 to work correctly with latest templates

* Latest update for nsupdate

* Updated to use nsupdate for DNS records

* Updated formatting of dict

* Updating descriptive text

* Support for external DNS config

* Latest update for nsupdate

* Updated to support external public/private DNS server(s)

* Updated DNS server handling

* Updated DNS server handling

* Updated DNS server handling

* Eliminated the  from the sample inventories

* Updated sample inventory to point to 2 separate DNS servers for private/public

* Playbook clean-up

* Adding 'python-dns'

* splitting subscription manager calls to allow for a clean pre-install playbook

* Move the openstack provisioning playbooks

They'll live in playbooks/provisioning/openstack from now on.

* Add a single provisioning playbook

* Symlink roles to provisioning/openstack/roles

* Add a sample inventory for openstack provisioning

* Add license for openstack.py in inventory

It's under the GPLv3+ while the rest of the repo is Apache 2.

* Add readme

* Move pre_tasks from to the openstack provisioner

We should probably not pollute the role namespace with a name as common
as "common". Moving the pre_task.yml to provisioners/openstack instead.

* Add default values to provision-openstack.yml

* Fix privileges in the pre-install playbook

* Always let the openshift nodes access the DNS

When `node_ingress_cidr` to limit the IP range for the DNS server, this
can prevent the actual openshift nodes from accessing it as well.

This commit makes the access from the `openstack_subnet_prefix` always
pass through and uses `node_ingress_cidr` for additional
access control.

* Add a flat sec group for openstack provider

Add a openstack_flat_secgroup, defaults to False.
When set, merges sec rules for master, node, etcd, infra nodes into a
single group. Less secure, but might help to mitigate quota limitations.
Update docs. Use timeout 30s to mitigate the error:
Timeout (12s) waiting for privilege escalation prompt.

Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>

* Add ansible.cfg for openstack provider

Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>

* Drop atomic-openshift-utils, update docs for origin

TODO use with
when: ansible_distribution == 'CentOS'
Also update docs for origin

Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>

* Gather facts for provision playbook

Provision tasks use facts like ansible_hostname and few others.
W/o gathering facts, those expire, and the provision playbook cannot
be reapplied in order to update the existing heat stack.
Refresh the facts cache by specifying gather_facts: true.

Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>

* Update sample inventory with the latest changes

* Fix yamllint errors

* Remove the extraneous DNS directory

It's a CASL-specific helper, not necessary for the provisioning
playbooks.

* Fix flake8 errors with the openstack inventory
  • Loading branch information
tomassedovic authored and cooktheryan committed Jun 16, 2017
1 parent 9884085 commit 18f621f
Show file tree
Hide file tree
Showing 60 changed files with 3,551 additions and 0 deletions.
674 changes: 674 additions & 0 deletions playbooks/provisioning/openstack/INVENTORY-LICENSE.txt

Large diffs are not rendered by default.

132 changes: 132 additions & 0 deletions playbooks/provisioning/openstack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
# OpenStack Provisioning

This repository contains playbooks and Heat templates to provision
OpenStack resources (servers, networking, volumes, security groups,
etc.). The result is an environment ready for openshift-ansible.


## Dependencies

* [Ansible 2.3](https://pypi.python.org/pypi/ansible)
* [shade](https://pypi.python.org/pypi/shade)
* python-dns


## What does it do

* Create Nova servers with floating IP addresses attached
* Assigns Cinder volumes to the servers
* Set up an `openshift` user with sudo privileges
* Optionally attach Red Hat subscriptions
* Set up a bind-based DNS server
* When deploying more than one master, set up a HAproxy server


## Set up

### Copy the sample inventory

cp -r openshift-ansible-contrib/playbooks/provisioning/openstack/sample-inventory inventory

### Copy clouds.yaml

cp openshift-ansible-contrib/playbooks/provisioning/openstack/sample-inventory/clouds.yaml clouds.yaml

### Copy ansible config

cp openshift-ansible-contrib/playbooks/provisioning/openstack/sample-inventory/ansible.cfg ansible.cfg

### Update `inventory/group_vars/all.yml`

Pay special attention to the values in the first paragraph -- these
will depend on your OpenStack environment.

The `env_id` and `openstack_dns_domain` will form the DNS domain all
your servers will be under. With the default values, this will be
`openshift.example.com`.

`openstack_nameservers` is a list of DNS servers accessible from all
the created Nova servers. These will be serve as your DNS forwarders.

`openstack_ssh_key` is a Nova keypair -- you can see your keypairs with
`openstack keypair list`.

`openstack_default_image_name` is the name of the Glance image the
servers will use. You can
see your images with `openstack image list`.

`openstack_default_flavor` is the Nova flavor the servers will use.
You can see your flavors with `openstack flavor list`.

`openstack_external_network_name` is the name of the Neutron network
providing external connectivity. It is often called `public`,
`external` or `ext-net`. You can see your networks with `openstack
network list`.

The `openstack_num_masters`, `openstack_num_infra` and
`openstack_num_nodes` values specify the number of Master, Infra and
App nodes to create.

The `openstack_flat_secgrp`, controls Neutron security groups creation for Heat
stacks. Set it to true, if you experience issues with sec group rules
quotas. It trades security for number of rules, by sharing the same set
of firewall rules for master, node, etcd and infra nodes.

### Update the DNS names in `inventory/hosts`

The different server groups are currently grouped by the domain name,
so if you end up using a different domain than
`openshift.example.com`, you will need to update the `inventory/hosts`
file.

For example, if your final domain is `my.cloud.com`, you can run this
command to fix update the `hosts` file:

sed -i 's/openshift.example.com/my.cloud.com/' inventory/hosts

### Configure the OpenShift parameters

Finally, you need to update the DNS entry in
`inventory/group_vars/OSEv3.yml` (look at
`openshift_master_default_subdomain`).

In addition, this is the place where you can customise your OpenShift
installation for example by specifying the authentication.

The full list of options is available in this sample inventory:

https://github.com/openshift/openshift-ansible/blob/master/inventory/byo/hosts.ose.example

Note, that in order to deploy OpenShift origin, you should update the following
variables for the `inventory/group_vars/OSEv3.yml`, `all.yml`:

deployment_type: origin
origin_release: 1.5.1
openshift_deployment_type: "{{ deployment_type }}"

## Deployment

### Run the playbook

Assuming your OpenStack (Keystone) credentials are in the `keystonerc`
file, this is how you stat the provisioning process:

. keystonerc
ansible-playbook -i inventory --timeout 30 --private-key ~/.ssh/openshift openshift-ansible-contrib/playbooks/provisioning/openstack/provision.yaml

### Install OpenShift

Once it succeeds, you can install openshift by running:

ansible-playbook --become --user openshift --private-key ~/.ssh/openshift -i inventory/ openshift-ansible/playbooks/byo/openshift-node/network_manager.yml
ansible-playbook --become --user openshift --private-key ~/.ssh/openshift -i inventory/ openshift-ansible/playbooks/byo/config.yml

Note, the `network_manager.yml` is only required if you're deploying OpenShift
origin.

## License

As the rest of the openshift-ansible-contrib repository, the code here is
licensed under Apache 2. However, the openstack.py file under
`sample-inventory` is GPLv3+. See the INVENTORY-LICENSE.txt file for the full
text of the license.
75 changes: 75 additions & 0 deletions playbooks/provisioning/openstack/openstack_dns_records.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
- name: "Generate list of private A records"
set_fact:
private_records: "{{ private_records | default([]) + [ { 'type': 'A', 'hostname': hostvars[item]['ansible_hostname'], 'ip': hostvars[item]['openstack']['private_v4'] } ] }}"
with_items: "{{ groups['cluster_hosts'] }}"

- name: "Set the private DNS server to use the external value (if provided)"
set_fact:
nsupdate_server_private: "{{ external_nsupdate_keys['private']['server'] }}"
nsupdate_key_secret_private: "{{ external_nsupdate_keys['private']['key_secret'] }}"
nsupdate_key_algorithm_private: "{{ external_nsupdate_keys['private']['key_algorithm'] }}"
when:
- external_nsupdate_keys is defined
- external_nsupdate_keys['private'] is defined

- name: "Set the private DNS server to use the provisioned value"
set_fact:
nsupdate_server_private: "{{ hostvars[groups['dns'][0]].openstack.public_v4 }}"
nsupdate_key_secret_private: "{{ hostvars[groups['dns'][0]].nsupdate_keys['private-' + full_dns_domain].key_secret }}"
nsupdate_key_algorithm_private: "{{ hostvars[groups['dns'][0]].nsupdate_keys['private-' + full_dns_domain].key_algorithm }}"
when:
- nsupdate_server_private is undefined

- name: "Generate the private Add section for DNS"
set_fact:
private_named_records:
- view: "private"
zone: "{{ full_dns_domain }}"
server: "{{ nsupdate_server_private }}"
key_name: "{{ ( 'private-' + full_dns_domain ) }}"
key_secret: "{{ nsupdate_key_secret_private }}"
key_algorithm: "{{ nsupdate_key_algorithm_private | lower }}"
entries: "{{ private_records }}"

- name: "Generate list of public A records"
set_fact:
public_records: "{{ public_records | default([]) + [ { 'type': 'A', 'hostname': hostvars[item]['ansible_hostname'], 'ip': hostvars[item]['openstack']['public_v4'] } ] }}"
with_items: "{{ groups['cluster_hosts'] }}"

- name: "Add wildcard records to the public A records"
set_fact:
public_records: "{{ public_records | default([]) + [ { 'type': 'A', 'hostname': '*.' + openshift_app_domain, 'ip': hostvars[item]['openstack']['public_v4'] } ] }}"
with_items: "{{ groups['infra_hosts'] }}"

- name: "Set the public DNS server details to use the external value (if provided)"
set_fact:
nsupdate_server_public: "{{ external_nsupdate_keys['public']['server'] }}"
nsupdate_key_secret_public: "{{ external_nsupdate_keys['public']['key_secret'] }}"
nsupdate_key_algorithm_public: "{{ external_nsupdate_keys['public']['key_algorithm'] }}"
when:
- external_nsupdate_keys is defined
- external_nsupdate_keys['public'] is defined

- name: "Set the public DNS server details to use the provisioned value"
set_fact:
nsupdate_server_public: "{{ hostvars[groups['dns'][0]].openstack.public_v4 }}"
nsupdate_key_secret_public: "{{ hostvars[groups['dns'][0]].nsupdate_keys['public-' + full_dns_domain].key_secret }}"
nsupdate_key_algorithm_public: "{{ hostvars[groups['dns'][0]].nsupdate_keys['public-' + full_dns_domain].key_algorithm }}"
when:
- nsupdate_server_public is undefined

- name: "Generate the public Add section for DNS"
set_fact:
public_named_records:
- view: "public"
zone: "{{ full_dns_domain }}"
server: "{{ nsupdate_server_public }}"
key_name: "{{ ( 'public-' + full_dns_domain ) }}"
key_secret: "{{ nsupdate_key_secret_public }}"
key_algorithm: "{{ nsupdate_key_algorithm_public | lower }}"
entries: "{{ public_records }}"

- name: "Generate the final dns_records_add"
set_fact:
dns_records_add: "{{ private_named_records + public_named_records }}"
25 changes: 25 additions & 0 deletions playbooks/provisioning/openstack/openstack_dns_views.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
- name: "Generate ACL list for DNS server"
set_fact:
acl_list: "{{ acl_list | default([]) + [ (hostvars[item]['openstack']['private_v4'] + '/32') ] }}"
with_items: "{{ groups['cluster_hosts'] }}"

- name: "Generate the private view"
set_fact:
private_named_view:
- name: "private"
acl_entry: "{{ acl_list }}"
zone:
- dns_domain: "{{ full_dns_domain }}"

- name: "Generate the public view"
set_fact:
public_named_view:
- name: "public"
zone:
- dns_domain: "{{ full_dns_domain }}"
forwarder: "{{ public_dns_nameservers }}"

- name: "Generate the final named_config_views"
set_fact:
named_config_views: "{{ private_named_view + public_named_view }}"
58 changes: 58 additions & 0 deletions playbooks/provisioning/openstack/post-provision-openstack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
# Assign hostnames
- hosts: cluster_hosts
become: true
pre_tasks:
- include: pre_tasks.yml
roles:
- role: hostnames

# Subscribe DNS Host to allow for configuration below
- hosts: dns
become: true
roles:
- role: subscription-manager
when: hostvars.localhost.rhsm_register
tags: 'subscription-manager'

# Determine which DNS server(s) to use for our generated records
- hosts: localhost
roles:
- dns-server-detect

# Build the DNS Server Views and Configure DNS Server(s)
- hosts: dns
become: true
pre_tasks:
- include: pre_tasks.yml
- name: "Generate dns-server views"
include: openstack_dns_views.yml
roles:
- role: dns-server

# Build and process DNS Records
- hosts: localhost
pre_tasks:
- include: pre_tasks.yml
- name: "Generate dns records"
include: openstack_dns_records.yml
roles:
- role: dns

# OpenShift Pre-Requisites
- hosts: OSEv3
become: true
tasks:
- name: "Edit /etc/resolv.conf on masters/nodes"
lineinfile:
state: present
dest: /etc/resolv.conf
regexp: "nameserver {{ hostvars['localhost'].private_dns_server }}"
line: "nameserver {{ hostvars['localhost'].private_dns_server }}"
insertafter: search*
- name: "Include DNS configuration to ensure proper name resolution"
lineinfile:
state: present
dest: /etc/sysconfig/network
regexp: "IP4_NAMESERVERS={{ hostvars['localhost'].private_dns_server }}"
line: "IP4_NAMESERVERS={{ hostvars['localhost'].private_dns_server }}"
14 changes: 14 additions & 0 deletions playbooks/provisioning/openstack/pre-install.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
###############################
# OpenShift Pre-Requisites

# - subscribe hosts
# - prepare docker
# - other prep (install additional packages, etc.)
#
- hosts: OSEv3
become: true
roles:
- { role: subscription-manager, when: hostvars.localhost.rhsm_register, tags: 'subscription-manager', ansible_sudo: true }
- { role: docker, tags: 'docker' }
- { role: openshift-prep, tags: 'openshift-prep' }
39 changes: 39 additions & 0 deletions playbooks/provisioning/openstack/pre_tasks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
- name: Generate Environment ID
set_fact:
env_random_id: "{{ ansible_date_time.epoch }}"
run_once: true
delegate_to: localhost

- name: Set default Environment ID
set_fact:
default_env_id: "casl-{{ lookup('env','OS_USERNAME') }}-{{ env_random_id }}"
delegate_to: localhost

- name: Setting Common Facts
set_fact:
env_id: "{{ env_id | default(default_env_id) }}"
delegate_to: localhost

- name: Set Dynamic Inventory Filters
become: false
shell: >
export OS_INV_FILTER_KEY=clusterid && export OS_INV_FILTER_VALUE={{ env_id }}
delegate_to: localhost

- name: Updating DNS domain to include env_id (if not empty)
set_fact:
full_dns_domain: "{{ (env_id|trim == '') | ternary(public_dns_domain, env_id + '.' + public_dns_domain) }}"
delegate_to: localhost

- name: Set the APP domain for OpenShift use
set_fact:
openshift_app_domain: "{{ openshift_app_domain | default('apps') }}"
delegate_to: localhost

- name: Set the default app domain for routing purposes
set_fact:
openshift_master_default_subdomain: "{{ openshift_app_domain }}.{{ full_dns_domain }}"
delegate_to: localhost
when:
- openshift_master_default_subdomain is undefined
49 changes: 49 additions & 0 deletions playbooks/provisioning/openstack/provision-openstack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
- hosts: localhost
gather_facts: True
pre_tasks:
- include: pre_tasks.yml
roles:
- role: openstack-stack
stack_name: "{{ env_id }}.{{ public_dns_domain }}"
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 }}"
lb_flavor: "{{ openstack_default_flavor | default('m1.small') }}"
etcd_flavor: "{{ openstack_default_flavor | default('m1.small') }}"
master_flavor: "{{ openstack_default_flavor | default('m1.medium') }}"
node_flavor: "{{ openstack_default_flavor | default('m1.medium') }}"
infra_flavor: "{{ openstack_default_flavor | default('m1.medium') }}"
dns_flavor: "{{ openstack_default_flavor | default('m1.small') }}"
external_network: "{{ openstack_external_network_name }}"
num_etcd: "{{ openstack_num_etcd | default(0) }}"
num_masters: "{{ openstack_num_masters }}"
num_nodes: "{{ openstack_num_nodes }}"
num_infra: "{{ openstack_num_infra }}"
num_dns: "{{ openstack_num_dns | default(1) }}"
master_volume_size: "{{ docker_volume_size }}"
app_volume_size: "{{ docker_volume_size }}"
infra_volume_size: "{{ docker_volume_size }}"


- name: Refresh Server inventory
hosts: localhost
connection: local
gather_facts: False
tasks:
- meta: refresh_inventory

- hosts: cluster_hosts
gather_facts: false
tasks:
- name: Debug hostvar
debug:
msg: "{{ hostvars[inventory_hostname] }}"
verbosity: 2
- name: waiting for server to come back
local_action: wait_for host={{ hostvars[inventory_hostname]['ansible_ssh_host'] }} port=22 delay=30 timeout=300
become: false

- include: post-provision-openstack.yml
Loading

0 comments on commit 18f621f

Please sign in to comment.